热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Linux内核设计与实现(12)---内存管理

内存管理,个人感觉应该是内核里最复杂的一部分了,目前还没做这方面相关的工作,因此没打算深究,只学点皮毛,搞懂点基本原理,以便更好理解OS的其他部分吧。1.页内核把物理页作为内存

内存管理,个人感觉应该是内核里最复杂的一部分了,目前还没做这方面相关的工作,因此没打算深究,只学点皮毛,搞懂点基本原理,以便更好理解OS的其他部分吧。

1.

内核把物理页作为内存管理的基本单位(MMU以页为单位处理),体系结构不同,支持的页大小也不尽相同,大多数32位体系结构是4KB页,64位体系结构8KB页。

内核用struct page结构表示系统中的每个物理页(几个重要域)

点击(此处)折叠或打开

  1. struct page {
  2.     unsigned long flags;
  3.     atomic_t _count;
  4.     atomic_t _mapcount;
  5.     unsigned long private;
  6.     struct address_space *mapping;
  7.     pgoff_t index;
  8.     struct list_head lru;
  9.     void *virtual;
  10. };

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(文档上说支持的,我试了一下好像不行))

回复 | 举报
评论热议

推荐阅读
author-avatar
灬我的独一小姐灬
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有