x86(32位)分页管理的机制

页的尺寸是4KB,虚拟地址的前20位用于指定一个物理页,后12位用于访问页内偏移。

页表项的结构:

层次化的设计想法:

因为4GB的虚拟内存共有1M=220=1048576个4K大小的页面。

我们将这些页面分成210=1024份,即从页表1到页表1024,由页目录表管理;

每一份(每一页表)有210=1024个页,由每一个页表管理,页在页表中是随机的,哪个页位于哪个页表中是没有规律的;

处理器的页部件专门负责线性地址到物理地址的转换工作. 它首先将段部件送来的32位线性地址分为3段, 分别是高10位, 中间10位, 低12位. 高10位是页目录的索引, 中间10位是页表的索引, 低12位则作为页内偏移量来用.

当前任务页目录的物理地址在处理器的CR3寄存器中, 假设它的内容为0x00005000. 段管理部件输出的线性地址是0x00801050, 其二进制的形式如图中给出. 高10位是十六进制的0x002, 它是页目录表内的索引,处理器将它乘以4(因为每个目录项4字节), 作为偏移量访问页目录. 最终处理器从物理地址00005008处取得页表的物理地址0x08001000.

线性地址的中间10位为0x001, 处理器用它作为页表索引取得页的物理地址. 将该值乘以4, 作为偏移量访问页表. 最终, 处理器又从物理地址08001004处取得页的物理地址, 这就是我们一直努力寻找的那个页.

页的物理地址是0x0000c000, 而线性地址的低12位是数据所在的页内偏移量. 故处理器将它们相加, 得到物理地址0x0000C050, 这就是线性地址0x00801050所对应的物理地址, 要访问的数据就在这里.

注意, 这种变换不是无缘无故的, 而是事先安排好的. 当任务加载时, 操作系统先创建虚拟的段, 并根据段地址的高20位决定它要用到哪些页目录项和页表项. 然后, 寻找空闲的页, 将原本应该写入段中的数据写到一个或者多个页中, 并将页的物理地址填写到相对应的页表项中. 只有这样做了, 当程序运行的时候, 才能以相反的顺序进行地址变换, 并找到正确的数据.

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-14 11:15:26

x86(32位)分页管理的机制的相关文章

x86 32位机的特权保护

优先级划分.指令的权限检查和超出权限访问的异常处理等是构成特权保护的基础.本文将试图讲解为大家解决两大问题: --win32汇编中为什么找不到中断指令的应用?比如int 7ch --windows错误的'蓝屏'是从哪里来的? 保护模式下,中断或异常往往从用户代码切换到操作系统代码中执行.由于保护模式下的代码有优先级之分,因此出现从优先级低的应用程序转移到优先级高的系统代码的问题,如果优先级低的代码能够任意调用优先级高的代码,就相当于了拥有了高优先级代码的权限.为了使高优先级代码能够安全的被低优先

X86 32位的基本寄存器

本文原创为freas_1990,转载请标明出处:http://blog.csdn.net/freas_1990/article/details/35268489 下面的寄存器前缀名E代表32,也就是说每个寄存器,可以拆分成两个16位寄存器. 1个指令指针寄存器(EIP) 4个数据寄存器(EAX.EBX.ECX和EDX) 2个栈指针寄存器(ESP和EBP) 2个变址寄存器(ESI和EDI) 6个段寄存器(ES.CS.SS.DS.FS和GS) 1个标志寄存器(EFlags) 1个任务管理寄存器(TR

Windows Server 2003 Enterprise Edition x86 (32位)微软官方原版

Windows Server 2003 Enterprise Edition x86 (32位)微软官方原版 ,发布日期是2003年03月27日20:00.在2003.04.17微软官方又重新发布了此版系统,目前在MSDN上可查阅的也是2003-04-17这个版本. Windows Server 2003下载:2003-03-27原版文件校验信息: 文件名: sc_windows_server_2003_enterprise.iso卷标: NRMEVOL_CN.iso发布日期 (UTC): 3/

X86(32位)与X64(64位)有什么区别,如何选择对应的操作系统和应用程序?

X86就是我们一般用的32位的系统,指针长度为32位(386起):X64就是64位的系统,指针长度为64位. 选择硬件对应的软件,建议通过以下三条考虑:1.64位操作系统相对32位操作系统理论上性能会相应提升1倍:2.64位操作系统支持多达128 GB的内存和多达16 TB的虚拟内存,而32位CPU和操作系统最大只可支持3.5G内存:3.64位软件比32位软件要少,64位电脑可以安装32位操作系统,64位操作系统可以安装32位软件. 具体两者区别:1.设计初衷不同.64位操作系统的设计初衷是:满

32位机内存管理机制(上)

一直有看linux内核的冲动,内核有些部分是汇编编写的,无奈汇编不大懂,所以利用五一三天假期大概走了一边8086CPU架构的汇编,8086CPU还是16位的,我们现在都进入64位时代了,这两者之间有很大的区别,但是看看16位的CPU汇编还是很重要的,这有助于理解32位的80386CPU.这篇文章来分析下80386的内存管理的一些基础知识,包括实模式.保护模式和内存寻址等等. 1.实模式 处理器被复位或者加电的时候以实模式启动.这时候处理器中各寄存器以实模式的初始化值工作. 80386处理器在实模

《80X86汇编语言程序设计教程》二十三 分页管理机制实例

1.  理论知识参考"<80X86汇编语言程序设计教程>二十二 分页管理机制与虚拟8086模式".演示分页机制实例:初始化页目录表和部分页表:启用分页管理机制:关闭分页管理机制等.逻辑功能:在屏幕上显示一条表示已启用分页管理机制的提示信息.大体步骤是:在实模式下拷贝显示串程序的代码到预定义区域,转保护模式,初始化页目录和2个页表,开启分页机制,转入预定义区执行显示代码,然后关闭分页机制,重新回到实模式,程序终止. 2.  源代码 "386scd.asm"

C++内存管理1-64位系统运行32位软件会占用更多的内存吗?

随着大容量内存成为电脑平台常规化的配置,在配置组装机时很多的用户都会选择8GB甚至是16GB的容量规格内存使用在自己的机器上,如果要将这8GB甚至是16GB的内容在系统使用时能充分利用起来的话,你平台必须使用64位的操作系统作为支持. 但值得注意的是虽然64位系统已经在近几年成为主流,但不少的软件或者不少的用户在使用电脑时运行的软件仍为32位版本,这引发了一个有趣的问题.你需要更多或更少的内存来让32位应用程序运行在64位版本的Windows?并且还有一个传言是说“在64位系统运行32位应用程序

32位机内存管理(下)

既然这样,段描述符表放在那里呢?80386中引入了两个新的寄存器来管理描述符表.一个是48位的全局描述符表寄存器GDTR,一个是16位的局部描述符表寄存器LDTR.那么,为什么有两个描述符表寄存器呢? GDTR指向的描述符表为全局描述符表GDT.它包含操作系统中所有任务都可用的段描述符,通常包含描述操作系统所使用的代码段.数据段.堆栈段的描述符及各任务的LDT段等,全局描述符表只有一个. LDTR则指向局部描述符表LDT.80386处理器设计成每个任务都有一个独立的LDT.它包含有每个任务私有的

ARM linux电源管理——Cortex A系列CPU(32位)睡眠和唤醒的底层汇编实现

ARM linux电源管理——Cortex A系列CPU(32位)睡眠和唤醒的底层汇编实现 承接 http://www.wowotech.net/pm_subsystem/suspend_and_resume.html Linux电源管理(6)_Generic PM之Suspend功能一文中的下图. 本文主要分析平台相关的CPU睡眠和唤醒,即下电和上电流程,以及ARM底层汇编代码实现. 内核版本:3.1.0               CPU:ARM Cortex-A7 1 平台相关函数执行流程