Linux内核之内存管理

本文介绍了Linux内核如何管理内存,包括以页为基本单位的管理方式,页的结构和状态,以及区分不同特性的区(ZONE_DMA、ZONE_NORMAL等)。此外,还讨论了内存访问过程中的MMU和页表的作用,以及多级页表如何节省内存。最后,阐述了物理地址和虚拟地址的分布,以及内核和用户空间的地址映射策略。

一、页
  内核把物理页作为内存管理的基本单位,尽管处理器的最小可寻址单位通常为字(或者字节),但是,内存管理单元(MMU,管理内存并把虚拟地址转换为物理地址的硬件)通常以页为单位进行处理。正因为如此,MMU以页(page)大小为单位来管理系统中的页表(这也是页表名的由来),从虚拟内存的角度来看,页就是最小单位;体系结构不同,支持的页大小也不尽相同,还有些体系结构甚至支持几种不同的页大小,大多数32位体系结构支持4KB的页,而64位体系结构一般会支持8KB的页,这就意味着,在支持4KB页大小并有1GB物理内存的机器上,物理内存会被划分为262144个页。
  内核用struct page结构表示系统中的每个物理页;flag域用来存放页的状态,这些状态包括页是不是脏页,是不是被锁定在内存中等。flag的每一位单独表示一种状态,所以它至少可以同时表示出32种不同的状态;_count域存放页的引用计数,也就是这一页被引用了多少次,当计数值变为-1时,就说明当前内核并没有引用这一页,于是,在新的分配中就可以使用它了,内核代码不应当直接检查该域,而是调用page_count()函数进行检查,该函数唯一的参数就是page结构。当页空闲时,尽管该结构内部的_count值是负的,但是对page_count()函数而言,返回值为0表示页空闲,返回一个正整数表示页在使用,一个页可以由页缓存使用,或者作为私有数据,或者作为进程页表中的映射。virtual域是页的虚拟地址,通常情况下,它就是页在虚拟地址中的地址,有些内存并不永久地映射到内核地址空间上,在这种情况下,这个域的值为NULL,需要的时候,必须动态地映射这些页。

struct page {
   
   
		unsigned long			flags;
		atomic_t				_count;
		atomic_t				_mapcount;
		unsigned long			private;
		struct address_space	*mappi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值