mm1
CPU寻址内存
CPU执行进程时,访问的地址都是虚拟地址v=(p, d),CPU会通过MMU以p作为索引检索页表,得到Page frame(f),最后加上偏移d,得到物理地址。
MMU的RWX、kernel/user模式权限
假设32位CPU,页大小为4k,即 虚拟地址为32位,Page frame(f)是20位,但是页表中地址是32位,多出来的12位就是RWX和kernel/user模式权限。
DMA、Normal和HIGHMEM zone
在x86中,物理地址可分为DMA zone(0~16MB)、Normal zone(16MB~896MB)、HIGHMEM zone(896MB~)
虚拟地址可分为user space(0GB~3GB)、kernel space(3GB~4GB)
注意:如果硬件DMA能够通过Normal zone申请到内存,此时不需要DMA zone。
为什么会有DMA zone存在?因为某一些硬件DMA只能访问特定内存。
Linux Buddy算法
目标:物理内存
linux中采用buddy算法对内存进行管理,核心是 将空闲页面按照2^n管理(即连续1/2/4/8/16/32空闲页面...),相同连续空闲页面放在相同链表中,不同连续空闲页面放在不同链表中,用多条链表进程组织起来。
执行如下命令,可知在不同zone中,不同连续空闲页面有多少个。
Linux CMA算法
目标:物理内存
用Buddy算法会导致内存碎片化,但是某些情况(如:DMA)需要连续空闲内存,需要如何解决此问题尼?
一般方法:reserved memory
高级方法:CMA算法(连续内存分配)
CMA算法通过划分一部分内存为CMA区域,平时CMA区域可以被其它app使用,但是当需要连续空闲内存时,CMA区域的数据转移在其它内存中,CMA区域重新变成连续空闲内存。
Last updated
Was this helpful?