一.内存空间和I/O空间,MMU
1. 内存空间与I/O空间
X86处理器中,存在I/O空间的概念;I/O空间是相对于内存空间而言的。
大多数嵌入式微处理器中,如ARM,PowerPC等,并不提供I/O空间,只有内存空间。
2. 内存管理单元MMU
MMU辅助操作系统,进行内存管理,提供虚拟地址和物理地址的映射,内存访问权限和cache缓存控制等支持。
使得linux操作系统能为每个用户进程分配独立的内存空间,并保证用户空间不能访问内核空间。
MMU的两个内容:
---TLB:Translation Lookaside Buffer,即转换旁路缓存,TLB是MMU的核心,它缓存少量的虚拟地址和物理地址的转换关系,是转换表的cache。
---TTW:Translation Table walk,即转换漫游表,但TLB中没有需要的地址转换关系时,需要访问内存中的转换表,并将它写入TLB中。
二.内存管理
对具有MMU的处理器而言,Linux系统提供了复杂的存储管理系统,使得进程能访问的内存达4GB。这个4GB是虚拟地址。
Linux系统中,进程的4GB内存空间被分为:用户空间和内核空间。
0-------------3GB 用户空间
3GB-----------4GB 内核空间
1. 用户进程只能访问用户空间的虚拟地址,只有通过系统调用等方式才可以访问到内核空间。各用户进程相互独立,具有各自不同的页表。
2. 内核空间具有自己对应的页表,内核的虚拟空间独立于其它程序。
Linux中1GB的内核地址空间,又分为:
----物理内存映射区
----虚拟内存分配区
----高端页面映射区
----专用页面映射区
----系统保留区
3. 当系统物理内存大于4GB时,必须使用CPU的扩展分页(PAE)模式提供的64位页目录项,才能取到4GB以上的物理内存。
三.内存存取。
1. 用户空间内存动态申请
申请内存:malloc()
释放内存:free()
2. 内核空间内存动态申请
kmalloc()
__get_free_pages()
vmalloc()
3. slab与内存池
slab技术: 对象重复生成,使用和释放,可以给他分配在同一内存或同一类内存空间,并且保留基本的数据结构。这样可以大大提高效率。
*kmem_cache_create()
*kmem_cache_alloc()
kmem_cache_free()
kmem_cache_destroy()
内存池:用于分配大量小对象的后背缓存技术。
Mempool_create()
Mempool_alloc()
Mempool_free:()
Mempool_destroy()
4. 虚拟地址与物理地址的关系
Vir_to_phys() --------将内核虚拟地址转化为物理地址。
Phys_to_vir() --------将物理地址转化为内核虚拟地址。