博文

目前显示的是 九月, 2012的博文

认识Linux物理内存管理系统--Buddy System

图片
Agenda 1.        Linux 如何管理物理内存 2.        什么是 Buddy System 3.        如何从 Buddy System 中分配内存 4.        如何释放页到 Buddy System 5.        冷热页 6.        关于 fall-back zone lists 1.        Linux 如何管理物理内存          为了有效的管理物理内存(分配、回收), Linux 将整个物理内存划分为若干个页,对每一个页,都有相关的数据结构来记录该页的状态和使用信息。在 Linux 中,每个页的大小是 4KB. 对于一个 512MB 的物理内存一共有( 512*1024*1024 ) / ( 4*1024 )个页。对于每一个页,在 Linux 中都有一个 struct page 数据结构来记录该物理页的使用情况。所有页的 struct page 结构组成一个连续的数组存放在物理内存的某个地方。某页在物理内存中的物理地址除以 4KB, 就得到该页是第几个物理页索引,然后索引就可以查询 struct page 数组得到该页的具体信息。 图 1. Memory Page          除了使用 struct page 来记录某个 4KB 物理页的状态和使用信息外, Linux 还将整个物理内存根据物理地址划分为不同的区域( zone )。 zone 的划分是与体系结构相关的,对于 X86 , ZONE 可以划分为 DMA 区 [0 , 16MB] 、 NORMAL 区 [16MB , min(memory length, 896MB)] 和 HIGHMEM 区 [min(memory length,896MB) , memory length] 。对于 ARM , ZONE 划分为 NORMAL 区和 HIGHMEM 区。其中 NORMAL 区对应线性映射的物理内存, HIGHMEM 区对应非线性映射的物理内存。其地址范围是: NORMAL[0,min(768MB , memory Length)] HIGHMEM[min(memory length,896MB) , memory length] 。 图 2. Memo