== Structure ==
内核中内存管理,分为三个部分:
物理内存的组织,虚拟内存的组织,以及为二者建立联系的内存的分配。
我所谈的都是内核中逻辑层面内容。
说实在的逻辑上的都是虚的,就好比一个国家好多机构,每几个干实事儿的,可确实不能缺了。
其实,要能说明白,为什么分为这三部分,将会是一件非常有意义的事。可以用Kant的有机目的论来解释。
== Understand ==
物理内存组织
=======
简单说来,linux用node, zone, page. 对物理内存在逻辑上做了不同粒度的划分,来实现组织物理内存的目的。
就好比,你要去看一个房子,最先看到的是外形,高楼还是平房。你从node角度看到的,
会是UMA or NUMA。简单说一下二者区别:
UMA,只有一个node,所有cpu访问内存一样快。一般都是这个模型。用numactl or numastat能看到你的pc mem类型。
NUMA,内存被切分了成多个node,每个cpu一个,访问local node很快;反之,非本地的就慢了。
接下来,再靠近内存一些依稀,划分的粒度更精细。从zone的角度,你会看到物理内存被分为不同的区域。为什么分成不同zone?
32-bit:DMA 16MB NORMAL 896MB HIGHMEM 4GB
64-bit:DMA 16MB DMA32 4GB NORMAL
最后,就是page。你看到就像发好的面,被筛子按压过一样。内存被分成一块块的page。
所以说这三个概念,描述的都是一样的东西,只不过粒度不同。
内存分配
=====
内存分配,从调用关系上分为三个方面的内容:
Page alloctor
----------------
作为所有内存分配基础行为,分配单位page。
alloc_pages():返回struct page *;
__get_free_pages:返回the logical address,不能分配高端内存.
内核空间内存分配
----------------------
对应32bit系统1GB的内核空间
Slab layer:建立再buddy system之上,作为cache,防碎片,更细粒度的内存分配,不需页表,kmem_cache_alloc,kmalloc。
vmalloc: 在Highmem分配,页表在init_mm.
kmap, kmap_atomic,
用户空间内存分配
--------------------
malloc->sys_brk...->alloc_pages对应3GB的用户空间,页表在task_struct->mm。
页表
-----
作为物理和虚拟内存的胶水。
虚拟内存组织
=======
在32-bit系统中4GB地址空间分为1GB的内核空间和3GB的用户空间,。
1GB内核空间:线性映射区,vmalloc区,Permanent Mappings kmap ,FIX Mappings
------------------------------------
vmalloc 存在虚拟地址和物理地址的非线性映射关系。要vmap_area_list的rb tree 保存分配地址的信息。
线性区很简单。
3GB用户空间Process address space。:txt, data, bss,heap,stack
-------------------------------------------------------
linux 用mm_struct 代表process address space。
而vm_area_struct VMA则代表猎了如text,bss,data再程序文件中的段以及共享映射区。
Lateral exploration
vmalloc区和process address space的分配管理是一样的。
vm_struct 和vm_area_struct 就是一个模子里刻出来的。
页表建立机制不同。map_vm_area和缺页中断。
vmalloc的页表在init_mm,而process的页表在进程的mm_struct.
进程的页表再do_fork中copy父进程的而创建的,vmalloc用的是swapper_pg_dir
另外进程的页表在缺页中断时更新。
阅读(1698) | 评论(0) | 转发(0) |