LInux有效地利用Intel分段和分页单位把逻辑地址转换为物理地址
RAM的某些部分永久地分配给内核用来存放内核代码以及静态内核数据结构
RAM的其余部分称为动态内存,这不仅是进程所需的宝贵资源,也是内核本身所需的宝贵资源
1.页框管理
2.内存区管理
3.非连续内存区管理:处理不连续的内存区
一、页框管理
Intel 奔腾处理器可以采用两种不同的页框(page frame)大小:4KB/4MB
linux采用4KB页框大小作为标准的内存分配单元
分页单元可以自动检测正在被访问的页是否包含在某个页框中
4KB是大部分磁盘块大小的倍数
内核必须记录每个框页当前的状态
1.内核必须能区分哪些页框包含的是属于进程的页
哪些页框包含的是内核代码或内核数据
2.内核必须能够确定动态内存中页框是否空闲
struct page | 描述符数组介绍 |
---|---|
next | 双向循环链表 |
prev | 双向循环链表 |
inode | |
offset | |
next_hash | |
count | |
flags | 由32个标志组成的数组来描述页框状态 |
wait | |
pprev_hash | |
buffers |
flags | 描述页框状态的标志 |
---|---|
PG_decr_after | |
PG_dirty | |
PG_error | |
PG_free_after | |
PG_DMA | 由ISA DMA使用 |
PG_locked | 页不能被换出 |
PG_referenced | |
PG_reserved | |
PG_skip | |
PG_Slab | |
PG_swap_cache | |
PG_swap_unlock_after | |
PG_uptodate |
系统中所有的页框描述符都存放在一个叫mem_map的数组中。由于每个描述符最多要占用64字节
请求和释放页框
请求页框 | 说明 |
---|---|
__get_free_pages(gfp_mask,order) | |
__get_dma_pages(gfp_mask,order) | |
__get_free_page(gfp_mask) | |
get_free_pages(gfp_mask) | |
gfp_mask | |
__GFP_WAIT | |
__GFP_IO | |
__GFP_DMA | 请求的页框必须适用于DMA时设置该位 |
__GFP_HIGH, __GFP_MED, __GFP_LOW | 指定请求的优先级 |
用于请求页框的标志值组
组名 | __GFP_WAIT | __GFP_IO | 优先级 |
---|---|---|---|
GFP_ATOMIC | 0 | 0 | __GFP_HIGH |
GFP_BUFFER | 1 | 0 | __GFP_LOW |
GFP_KERNEL | 1 | 1 | __GFP_MED |
GFP_NFS | 1 | 1 | __GFP_HIGH |
GFP_USER | 1 | 1 | __GFP_LOW |
释放页框 | 说明 |
---|---|
free_pages(addr,order) | |
__free_page( p) | |
free_page(addr) |
伙伴(Buddy)系统算法
内核应该为分配一组连续的页框而建立一种稳定、高效的分配策略、
解决外碎片问题:在已分配页框的块内分散许多小块的空闲页框。由此带来的问题是,即使有足够的空间页框可以满足请求,但要分配一个大块的连续页框可能无法满足
开发一种适当的技术来记录现存的空闲连续页框块的情况,以尽量避免为满足对小块的请求而把大块的空闲块进行分割