1.《操作系统概念精要》之内存篇(三)-分页的页表结构

2.为什么32位系统的分页为每页4kb

3.cncomm 首先发送写命令,后面为32位的地址(写入码的首地址),32位的地址长度(即需要写入多少个地址)。

《操作系统概念精要》之内存篇(三)-分页的页表结构

电脑系统页面大小4kb-电脑系统页面大小怎么调整

之前讨论了分段和分页,现在看下页表的主要涉及的页表结构。

大多数现代计算机系统支持大逻辑地址空间(2^32 ~ 2^64)。这种情况下,页表本身可以非常大。

例如:如具有32位逻辑地址空间的一个计算机系统。如果系统的页大小为4KB(2^12)。那么页表可以多达100万的条目 (2^32/ 2^12)。设某个项目有4字节。那么每个进程需要4MB的地址物理地址来存储页表本身。显然,我们并不想在内存中连续分配这么多页表。

这个问题的一个简单的解决方法就是讲页表划分为更小的块。完成这种划分方法有很多种。

最简单的方法就是使用两层分页算法,就是将页表再分页,例如,再次设一个系统,具有32位逻辑地址空间和4K大小的页。一个逻辑地址被分为20位的页码和12位的页偏移。

因此要对20位的页表进行再分页,所以该页码可以分10位的页码和10位的偏移。这样一个逻辑地址就会分为如下表示。

其中p1表示的用来访问外部页表的索引,而p2是内部页表的页偏移。用这种结构的地址转换方法。由于地址转换有外向内,所以这种也称为 向前映射页表

在这种分页结构的方案中,设,系统是64位系统,那么当它的地址空间就有2^64, 当再以4KB作为地址的话,那么页表就会2^52个条目,那么就把页表进行细分,从而形成分层分页,四级分层分页等等。

为了装换每个逻辑地址,74位的系统需要7个级别的分页,如此多的内存访问时不可取的,从而分层分页在64位的系统并不是最优的。

处理大于32位的地址空间的常用方法是 哈希页表 ,用虚拟页码作为哈希表值。哈希页表的每一个条目都包括一个链表,该链表的元素哈希到同意位置(这表示它们有了哈希冲突)。每个元素由三个字段组成:虚拟页码,映射的帧码,指向链表内下一个元素的指针。

该算法的工作如下:虚拟地址的虚拟页码哈希到哈希表。用虚拟页码与链表内的第一个元素的第一个字段相比较。如果匹配,那么相应的帧码(第二个字段)就用来形成物理地址。如果不匹配,那么与链表内的后续节点的第一个字段进行比较。以查找匹配的页码。该方案如图:

这里书上提到的虚拟页码可以只看作是页码。(之所以叫虚拟页码,是因为根据虚拟内存的概念,逻辑地址空间可以比物理地址大,所以多出来的部分被称为虚拟的,具体介绍会在下一章提到)。

已提出用于64位地址空间的这个方案的一个变体。

此变体用 聚簇页表 类似于哈希页表。不过哈希表内的每个条目引用多个页而不是单个页。单个页表的条目可以映射到多个物理帧。聚簇页表对于 稀疏 地址空间特别有用。这里引用的是不连续的并且散布在整个地址空间。

通常,每个进程都有一个关联的页表。该进程所使用的每个页都在也表中有一项(或者每个虚拟页都有一项)。这种表示方法比较自然,因为进程是通过虚拟地址来引用页的。然后是操作系统将这些地址转换为物理内存地址。

由于页表是按照虚拟地址排序的,操作系统可计算所对应条目在页表的位置,可以直接使用该值。这种方法缺点就是:当每个页表包含百万级的数目时。会有性能问题,而且需要大量的内存来保存页表信息。

解决的方法处理上面的两种方法外,还有一种就是 倒置页表

这里先介绍一个IBM RT 的倒置页表的表示方法:

对于每个真正的内存页或者帧,倒置页表只有一个条目。每个条目包含 保存在真正内存位置上的页的虚拟地址 ,以及拥有 该页的进程信息 。具体的过程如图:

这里的进程的信息就是以前提到的 空间地址标识符(ASID)。主要原因是由于一个倒置页表通常包含了多个不同的映射物理内存的地址空间。具体进程的每个逻辑页可映射相应的物理帧。

用倒置页表的系统在实现共享内存的时候会有问题,因为共享内存的实现为:将多个地址空间映射到同一个物理地址。这种方法,不能用于倒置页表,因为每个物理页只有一个虚拟的页条目,一个物理页不能有多个共享的虚拟地址。

IA-32 系统的内存管理可以分为分段和分页两个部分,工作如下:CPU 生成逻辑地址,并交给分段单元,分段单元为每个逻辑地址生成 一个线性地址。 然后线性地址交给分页单元,以生成内存的物理地址。

IA-32 架构允许一个段的大小最多可以达到4G, 每个进程最多有16K个段。进程的逻辑地址空间分为两部分。

第一部分最多由8K段组成,这部分是单个进程私有;

第二部分也是最多由8K段组成,这部分是所有进程共享。

第一部分保存在 局部描述符表(LTD) 中,第二部分保存在 全局描述符表(GDT) 中,他们的每个 条目都是8个字节,包括一个段的详细信息。比如段基地址和段界限。

逻辑地址一般为二元数组(选择器,偏移),选择器是一个16位的数:

其中s表示段号,g表示实在LTD中还是在GDT中, p表示保护信息。

段的寻址过程为:

IA-32架构的页可分为4K,或者4M 。用4K的页,IA-32用二级分页方法。其中的32位的寻址和表示请参照二级分页算法。

为了提高物理内存的使用率,IA-32 的页表可以被交换存在磁盘。因此,页目录的条目通过一个 有效位 ,以表示该条目所指的页表实在内存还是在磁盘上。如果页表再磁盘上,则操作系统可通过其他31位来表示页表的磁盘位置。之后根据需要调入内存。

随着软件开发人员的逐步发现,32位架构的4GB内存限制,Inter通过 页地址扩展 ,以便允许访问大于4GB的物理地址空间。

引入页地址扩展,主要是将两级的分页方案扩展到了方案, 后者的最后两位用于指向页目录指针表。

页地址扩展使得地址地址空间从32位增加到了36位。Linux和Mac OS X 都支持了这项技术。

X86-64 支持更大的逻辑和物理地址空间。支持64位的地址空间意味着可寻址的内存达到惊人的2^64字节。64位系统有能力访问那么多的内存,但是实际上,目前设计的地址远没有那么多。

目前提供的x86-64 架构的机器最多用四级分页,支持48位的虚拟地址。它的页面大小可以4KB,2MB,或者1G。

虽然Intel的芯片占了大部分的市场,但是移动设备的架构一直用的是32位ARM的架构。现在的iPhone 和iPad 都或得了ARM的授权。Android的智能手机也都是ARM的处理器。

ARM支持的页面大小:

ARM架构还支持两级TLB(高速缓存)。在外部,有两个微TLB: 一个用于数据,另一个用于指令。微TLB也支持 (ASID)进程地址空间标识符。 在内部 有一个主 TLB。 地址转换从微TLB级开始。如果没有找到,那么再检查主TLB。如果还没找到,再通过页表进行硬件查找。

为什么32位系统的分页为每页4kb

操作系统的分页机制

分段却能大大提高编程者管理程序的效率。故而32位机也用了段+偏移的模式来寻址。但与实模型不同的是,由于地址线和数据线宽度一致,因而,每个段最大可以到4G,并且段基址也是32位的无需进行左移处理。在地址储存模型中这属于“段地址储存模型”。然而需要注意的是,在32位机里,虽然通用寄存器,标志寄存器等都扩展成了32位,但是段寄存器却依然是16位的(为什么不做改变我猜可能是这样便于向下兼容)。所以在32位寻址时,段寄存器里放的不再是段基址(位数不够,放不下)而是一个选择子.

分页

1) 如果没有分页机制,则由分段寻址方式计算出的地址即为物理地址。

2) 分页机制为程序提供了4G的连续地址空间。

3) 每个页占据4k,则4G的地址空间需要4G/4K = 1M个页。每个页需要4个字节来描述其物理基地址。这样则需要4M的地址空间存放页信息。

4) 操作系统将每个页分成一组,组成一个页表,页表项中保存该页的物理基地址。则最多有个页表。

5) 目录表中有个项,每个项占用4个字节,项的内容为页表的地址。

寻址过程

CR3寄存器(CR3高20位)

|

页目录地址

|

索引到页表

|

索引到页

|

得到页表的地址和有关信息

|

页表中的基址与线性地址中的offset位段(后12位)相加得到物理地址

页目录地址:

在32位cpu里,CR3寄存器里高20位放的就是页目录的地址,因为页目录的低12位总是0,这样保证页目录始终是页对齐的(每页大小4kB)。页目录大小为4mb 分成了个页表,页表包含个页表项

虚拟地址/线性地址:

它是逻辑地址到物理地址的中间层,也叫线性地址,是基于段寄存器对逻辑地址转换得到的。虚拟地址通过页转(一般由硬件的MMU完成)换得到真实的物理地址。

X86体系有一个只有系统软件才能操作的寄存器cr3,存了最高一级页表的物理地址,cpu拿到一个虚拟地址后会自动从cr3中拿到页表,然后用页表转换,得到最终的物理地址。

每个进程都可以有独立的逻辑地址,进程切换时,OS会把cr3换成这个进程相应的页表(每个进程都有独立的页表数据)。

需要强调的是进程映射空间为0G~3G,操作系统把自己映射到了3G~4G的空间,并且映射到了每一个进程空间,也就是说,每一个进程的3G~4G空间的映射都是一样的(每个进程维护一个页表),都为操作系统物理地址的映射。这样,进程切换时,虽然页表换了,但处于内核态的操作系统的从虚拟地址到物理地址的映射是不会改变的,保证了此时操作系统能顺利进行下去。

CR3寄存器:

1、分页单元中,页目录是唯一的,它的地址放在CPU的cr3寄存器中,是进行地址转换的开始点。万里长征就从此长始了。

2、每一个活动的进程,因为都有其独立的对应的虚似内存(页目录也是唯一的),那么它也对应了一个独立的页目录地址。——运行一个进程,需要将它的页目录地址放到cr3寄存器中,将别个的保存下来。

3、每一个32位的线性地址被划分为三部份,面目录索引(10位):页表索引(10位):偏移(12位)

依据以下步骤进行转换:

1、从cr3中取出进程的页目录地址(操作系统负责在调度进程的时候,把这个地址装入对应寄存器);

2、根据线性地址前十位,在数组中,找到对应的索引项,因为引入了二级管理模式,页目录中的项,不再是页的地址,而是一个页表的地址。(又引入了一个数组),页的地址被放到页表中去了。

3、根据线性地址的中间十位,在页表(也是数组)中找到页的起始地址;

4、将页的起始地址与线性地址中最后12位相加,得到最终我们想要的葫芦;

分页和分段的区别:

1)页是信息的物理单位;段是信息的逻辑单位。

2)页的大小固定且由系统确定;段的长度不固定(取决于用户所编写的程序,通常由编译程序在对源程序编译时,根据信息的性质来划分)。

3)分页的作业地址空间是一维的,只需一个记忆符,就可表示一个地址;分段的作业地址空间是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。

4)分段物理空间不连续,但段内是连续的;分页物理空间不连续。

实际物理地址的计算

1.从CR3寄存器高20位里取出页目录的基地址.

2.目录的基地址+偏移地址(线性地址高10位)从目录中取出页表基地址

3.页表基地址+偏移地址(线性地址中间10位)从也表中取出页基地址

4.将页面描述项中给出的页面基地址与线性地址中的offset位段(后12位)相加得到物理地址

cncomm 首先发送写命令,后面为32位的地址(写入码的首地址),32位的地址长度(即需要写入多少个地址)。

32个。

该页内地址的位数表示了该页的长度,页内地址长度为12位,即212B,即4KB,所以系统页面大小为4KB,又因为该系统页面的段号是连续的且为10位,即该系统段数最多有210个段,即最多有个段,每段最大为4KB×,即4096KB。

B是字节,b是位,1B=8b。32位系统支持的内存大小是4GB,不是4Gb。32位系统,就是32条地址线,最大的内存地址空间就是2^32=4.2949673E9。

扩展资料:

一个32位逻辑地址空间的计算机系统,页大小为4KB,那么页表有一百万条目。设每个条目占4B,则需要4MB物理地址空间来存储页表本身。利用多级页表,可以减少页表所占用的空间。

一个逻辑地址(32位系统,页大小 4K) 可以被分为 :一个20位的页号 +一个12位的偏移。如果对页表进行再分页,那么页号分解为:一个10位的页号 +一个10位的偏移。因此,一个逻辑地址表示如下 :p1 是用来访问外部页表的索引, p2 是外部页表的页偏移。

百度百科-页表