ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

linux的分页存储管理学习总结

2021-04-13 12:57:25  阅读:167  来源: 互联网

标签:存储管理 分页 32 硬件 物理地址 地址 页表 linux


linux的分页存储管理

什么是分页存储管理机制

分页式存储管理的基本思想是把内存空间分成大小相等、位置固定的若干个小分区,每个小分区称为一个存储块,简称,并依次编号,每个存储块的大小由不同的系统决定,一般为2的n次幂,如1KB,2KB,4KB等,一般不超过4KB。把用户的逻辑地址空间分成与存储块大小相等的若干页。当作业提出存储分配请求时,系统首先根据存储块大小把作业分成若干页。每一页可存储在内存的任意一个空白块内。此时,只要建立起程序的逻辑页和内存的存储块之间的对应关系,借助动态地址重定位技术,原本连续的用户作业分散的不连续存储块中,就能够正常投入运行

相关概念

1.物理内存空间:主板上的内存条所提供的内存空间就为物理地址空间
2.物理地址:每个内存单元的实际地址
3.虚拟地址空间:我们自己看到的内存空间
4.分页机制:在虚拟内存中,页表是个映射表的概念, 即从进程能理解的线性地址映射到存储器上的物理地址。这个页表是需要常驻内存的, 以应对频繁的查询映射需要
5.页面高速缓存:缓存各种文件和内存映射,由内存页面组成,单页内可能包含不连续的块

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

linux中的分页

为什么要分页

1.层次化的页表用于支持对大地址空间快速, 高效的管理. 因此linux内核对页表进行了分级。

2.对于32位系统, 两级页表已经足够了. 但是64位需要更多数量的分页级别。为了同时支持适用于32位和64位的系统, Linux采用了通用的分页模型。在Linux-2.6.10版本中, Linux采用了三级分页模型。而从2.6.11开始采用了四级分页模型。

3.目前的内核的内存管理总是假定使用四级页表, 而不管底层处理器是否如此。

4.Linux不同于其他的操作系统, 它把计算机分成独立层/依赖层两个层次。对于页面的映射和管理也是如此。页表管理分为两个部分, 第一个部分依赖于体系结构, 第二个部分与体系结构无关。 所有数据结构几乎都定义在特定体系结构的文件中。这些数据结构的定义可以在头文件arch/对应体系/include/asm/page.harch/对应体系/include/asm/pgtable.h中找到。

四级分页机制

在这里插入图片描述
前面提到Linux内核仅使用了较少的分段机制,但是对分页机制的依赖性很强,其使用一种适合32位和64位结构的通用分页模型,该模型使用四级分页机制:

页全局目录(Page Global Directory)
页上级目录(Page Upper Directory)
页中间目录(Page Middle Directory)
页表(Page Table)

linux为什么热衷于分页

因为,线性地址到物理地址的自动转换使下面的设计目标变得可行:

(1).给每一个进程分配一块不同的物理地址空间,这确保了可以有效地防止寻址错误。
(2).区别页(即一组数据)和页框(即主存中的物理地址)之不同。这就允许存放在某个页框中的一个页,然后保存到磁盘上,以后重新装入这同一页时又被装在不同的页框中。这就是虚拟内存机制的基本要素。
(3).每一个进程有它自己的页全局目录和自己的页表集。当发生进程切换时,Linux把cr3控制寄存器的内容保存在前一个执行进程的描述符中,然后把下一个要执行进程的描述符的值装入cr3寄存器中。因此,当新进程重新开始在CPU上执行时,分页单元指向一组正确的页表。
(4).把线性地址映射到物理地址虽然有点复杂,但现在已经成了一种机械式的任务。

32位硬件在64位系统中的兼容性问题

从硬件的角度,32位地址被分成了三部份——也就是说,不管理软件怎么做,最终落实到硬件,也只认识这三位老大。
从软件的角度,由于多引入了两部份,,也就是说,共有五部份。——要让二层架构的硬件认识五部份也很容易,在地址划分的时候,将页上级目录和页中间目录的长度设置为0就可以了。
这样,操作系统见到的是五部份,硬件还是按它死板的三部份划分,也不会出错,也就是说大家共建了和谐计算机系统。
这样,虽说是多此一举,但是考虑到64位地址,使用四层转换架构的CPU,我们就不再把中间两个设为0了,这样,软件与硬件再次和谐。

例子:一个逻辑地址已经被转换成了线性地址,0x08147258,换成二制进,也就是:
0000100000 0101000111 001001011000
内核对这个地址进行划分
PGD = 0000100000
PUD = 0
PMD = 0
PT = 0101000111
offset = 001001011000

现在来理解Linux针对硬件的花招,因为硬件根本看不到所谓PUD,PMD,所以,本质上要求PGD索引,直接就对应了PT的地址。而不是再到PUD和PMD中去查数组(虽然它们两个在线性地址中,长度为0,2^0 =1,也就是说,它们都是有一个数组元素的数组),那么,内核如何合理安排地址呢?

从软件的角度上来讲,因为它的项只有一个,32位,刚好可以存放与PGD中长度一样的地址指针。那么所谓先到PUD,到到PMD中做映射转换,就变成了保持原值不变,一一转手就可以了。这样,就实现了“逻辑上指向一个PUD,再指向一个PDM,但在物理上是直接指向相应的PT的这个抽像,因为硬件根本不知道有PUD、PMD这个东西”。然后交给硬件,硬件对这个地址进行划分,看到的是:

页目录 = 0000100000
PT = 0101000111
offset = 001001011000

嗯,先根据0000100000(32),在页目录数组中索引,找到其元素中的地址,取其高20位,找到页表的地址,页表的地址是由内核动态分配的,接着,再加一个offset,就是最终的物理地址了。

总结

在分页的基础上,虚拟内存和物理内存实现了分离,从而让内核深度参与和监督内存分配。应用进程的安全性和稳定性因此大为提高。

标签:存储管理,分页,32,硬件,物理地址,地址,页表,linux
来源: https://blog.csdn.net/wcwdnmdnmd/article/details/115642954

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有