作者:灬我的独一小姐灬 | 来源:互联网 | 2023-05-17 13:17
内存管理,个人感觉应该是内核里最复杂的一部分了,目前还没做这方面相关的工作,因此没打算深究,只学点皮毛,搞懂点基本原理,以便更好理解OS的其他部分吧。1.页内核把物理页作为内存
内存管理,个人感觉应该是内核里最复杂的一部分了,目前还没做这方面相关的工作,因此没打算深究,只学点皮毛,搞懂点基本原理,以便更好理解OS的其他部分吧。
1.页
内核把物理页作为内存管理的基本单位(MMU是以页为单位处理),体系结构不同,支持的页大小也不尽相同,大多数32位体系结构是4KB页,64位体系结构8KB页。
内核用struct page结构表示系统中的每个物理页(几个重要域)
- struct page {
- unsigned long flags;
- atomic_t _count;
- atomic_t _mapcount;
- unsigned long private;
- struct address_space *mapping;
- pgoff_t index;
- struct list_head lru;
- void *virtual;
- };
flags:存放页的状态,比如页是不是脏的,是否被锁定在内存中等。
_count:存放页的引用计数,当计数为-1时表示当前内核并没有引用该页。检查引用计数用page_count()函数,当返回0时表示页空闲。
virtual:是页的虚拟地址,有些内存(比如高端内存)并不永久映射到内核地址空间,这时域值为NULL,需要的时候,必须动态地映射这些页。
page结构与物理页相关,该结构对页的描述只是短暂的,内核仅仅用这个数据结构来描述当前时刻相关物理页中存放的东西,目的在于描述物理内存本身,而不是其中资源。因为由于交换等原因,虚拟页可能不再和同一个page结构相关联。内核用这一结构来管理系统中所有的页,每个物理页都要分配一个这样的结构。
2. 区
由于硬件限制,有些页位于内存中特定的物理地址上,不能用于一些特定的任务,所以内核把页划分为不同的区(ZONE).
Linux必须处理如下两种内存缺陷引起的内存寻址问题。
a.一些硬件只能用在某些特定的内存地址来执行DMA。
b.一些体系结构的内存的物理寻址范围比虚拟寻址范围大得多,这样就有一些内存不能永久地映射在内核空间上。
因为存在这些制约条件,Linux主要使用了四种区:
ZONE_DMA:这个区包含的页能用来执行DMA操作。
ZONE_DMA32:和ZONE_DMA类似,该区包含的页面可用来执行DMA操作,不同之处在于这些页面只能被32位设备访问。在某些体系结构,该区比ZONE_DMA更大。
ZONE_NORMAL:这个区包含的都是能正常映射的页。
ZONE_HIGHEM: 高端内存,其中的页并不能永久地映射到内核地址空间。
区的实际使用是和体系结构相关的,某些体系结构内存在任何地址空间执行DMA都没有问题。在X86-32每个区所占页的列表如下
-->
window._bd_share_cOnfig={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='https://img.php1.cn/3cd4a/1eebe/cd5/433ea70d6ea577b1.jpeg">
leon_yu2013-11-21 09:29:47
lmnos:波兄我纠正一下 ARM和x86都不支持8KB页 X86-64下 支持4KB 2MB 4MB (1GB(文档上说支持的,我试了一下好像不行))
恩,谢谢,等我忙完手头事,再来吧内存管理梳理一遍
回复 | 举报
lmnos2013-11-21 00:36:52
波兄我纠正一下 ARM和x86都不支持8KB页 X86-64下 支持4KB 2MB 4MB (1GB(文档上说支持的,我试了一下好像不行))
回复 |
举报