linux内核空间和用户空间

linux内核空间和用户空间

ID:1357817

大小:196.80 KB

页数:14页

时间:2017-11-10

linux内核空间和用户空间_第1页
linux内核空间和用户空间_第2页
linux内核空间和用户空间_第3页
linux内核空间和用户空间_第4页
linux内核空间和用户空间_第5页
资源描述:

《linux内核空间和用户空间》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、Linux操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在内存中。Linux内核地址映射模型x86CPU采用了段页式地址映射模型。进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存。段页式机制如下图。 Linux内核地址空间划分通常32位Linux内核地址空间划分0~3G为用户空间,3~4G为内核空间。注意这里是32位内核地址空间划分,64位内核地址空间划分是不同的。 Linux内核高端

2、内存的由来当内核模块代码或线程访问内存时,代码中的内存地址都为逻辑地址,而对应到真正的物理内存地址,需要地址一对一的映射,如逻辑地址0xc0000003对应的物理地址为0×3,0xc0000004对应的物理地址为0×4,……,逻辑地址与物理地址对应的关系为物理地址=逻辑地址–0xC0000000逻辑地址物理内存地址0xc00000000×00xc00000010×10xc00000020×20xc00000030×3……0xe00000000×20000000……0xffffffff0×40000000??假设按照上述简单的地址映射关系,那么内核逻辑地

3、址空间访问为0xc0000000~0xffffffff,那么对应的物理内存范围就为0×0~0×40000000,即只能访问1G物理内存。若机器中安装8G物理内存,那么内核就只能访问前1G物理内存,后面7G物理内存将会无法访问,因为内核的地址空间已经全部映射到物理内存地址范围0×0~0×40000000。即使安装了8G物理内存,那么物理地址为0×40000001的内存,内核该怎么去访问呢?代码中必须要有内存逻辑地址的,0xc0000000~0xffffffff的地址空间已经被用完了,所以无法访问物理地址0×40000000以后的内存。显然不能将内核地址空

4、间0xc0000000~0xfffffff全部用来简单的地址映射。因此x86架构中将内核地址空间划分三部分:ZONE_DMA、ZONE_NORMAL和ZONE_HIGHMEM。ZONE_HIGHMEM即为高端内存,这就是内存高端内存概念的由来。在x86结构中,三种类型的区域如下:ZONE_DMA       内存开始的16MBZONE_NORMAL    16MB~896MBZONE_HIGHMEM    896MB~结束 Linux内核高端内存的理解前面我们解释了高端内存的由来。Linux将内核地址空间划分为三部分ZONE_DMA、ZONE_NORM

5、AL和ZONE_HIGHMEM,高端内存HIGH_MEM地址空间范围为0xF8000000~0xFFFFFFFF(896MB~1024MB)。那么如内核是如何借助128MB高端内存地址空间是如何实现访问可以所有物理内存?当内核想访问高于896MB物理地址内存时,从0xF8000000~0xFFFFFFFF地址空间范围内找一段相应大小空闲的逻辑地址空间,借用一会。借用这段逻辑地址空间,建立映射到想访问的那段物理内存(即填充内核PTE页面表),临时用一会,用完后归还。这样别人也可以借用这段地址空间访问其他物理内存,实现了使用有限的地址空间,访问所有所有物理

6、内存。如下图。例如内核想访问2G开始的一段大小为1MB的物理内存,即物理地址范围为0×80000000~0x800FFFFF。访问之前先找到一段1MB大小的空闲地址空间,假设找到的空闲地址空间为0xF8700000~0xF87FFFFF,用这1MB的逻辑地址空间映射到物理地址空间0×80000000~0x800FFFFF的内存。映射关系如下:逻辑地址物理内存地址0xF87000000×800000000xF87000010×800000010xF87000020×80000002……0xF87FFFFF0x800FFFFF当内核访问完0×8000000

7、0~0x800FFFFF物理内存后,就将0xF8700000~0xF87FFFFF内核线性空间释放。这样其他进程或代码也可以使用0xF8700000~0xF87FFFFF这段地址访问其他物理内存。从上面的描述,我们可以知道高端内存的最基本思想:借一段地址空间,建立临时地址映射,用完后释放,达到这段地址空间可以循环使用,访问所有物理内存。看到这里,不禁有人会问:万一有内核进程或模块一直占用某段逻辑地址空间不释放,怎么办?若真的出现的这种情况,则内核的高端内存地址空间越来越紧张,若都被占用不释放,则没有建立映射到物理内存都无法访问了。在香港尖沙咀有些写字楼

8、,洗手间很少且有门锁的。客户要去洗手间的话,可以向前台拿钥匙,方便完后,把钥匙归还到前台。这样

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。