您的位置:首页 > 运维架构 > Linux

读深入理解Linux内核 (第8章 内存管理, 第一部分 --- 页的管理)

2016-10-14 21:21 453 查看

页的管理

每个内存页面对应一个页描述符,所有的页描述符存放在一个连续的内存区域。所以,通过页面的地址可以很方便得到描述符的地址,比如virt_to_page(addr),通过页地址得到页描述符地址。页描述符携带了该页的使用情况。

1. 内存访问的不一致性

我们通常以为内存里的单元是没差别的,事实上,不同的内存位置(结点)CPU访问时间可能不同。同一结点,不同的地址范围用途不同,比如有的是高端内存。因此同一内存结点下又分为不同的内存区域(Zone)。页面的申请需要声明从那个Zone里面申请。

2. 页的申请和释放

操作系统通过内存区域分配器(ZoneAllocator)管理着内存区域(Zone),比如alloc_pages(gfp_mask,order),gfp_mask指明了内存区域的类别等,而order是指,分配2的order次方个页面,这些页面是连续的。

3. Buddy(伙伴)系统

具体内存区域(Zone)里面的页面由Buddy系统管理。区域里的页面一开始被分配到11个组里面,1个page,2个page,4个,8个...直到1024个。分配时,找最小的满足需求的连续页面,剩余的页面放到其它组里面。所以,随着系统的运行,连续页面越来越少,如果驱动需要用到连续的物理页面,就应该在初始化时申请好。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux 内核 linux kernel