x86(32位)分页管理的机制
来源:互联网 发布:jquery.highlight.js 编辑:程序博客网 时间:2024/05/19 16:07
页的尺寸是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位决定它要用到哪些页目录项和页表项. 然后, 寻找空闲的页, 将原本应该写入段中的数据写到一个或者多个页中, 并将页的物理地址填写到相对应的页表项中. 只有这样做了, 当程序运行的时候, 才能以相反的顺序进行地址变换, 并找到正确的数据.
- x86(32位)分页管理的机制
- x86(32位)分页管理的机制
- JIURL文档-Linux的虚拟内存与分页机制(x86-64位)(一)
- JIURL文档-Linux的虚拟内存与分页机制(x86-64位)(一)
- JIURL文档-Linux的虚拟内存与分页机制(x86-64位)(二)
- 【浅谈】x86内存管理的分段分页机制
- Windows x86 内存管理及分页机制
- 内存管理(X86-32位系统)
- X86中的分页机制
- 计算机原理学习(6)-- x86-32 CPU和内存管理之分页管理
- 计算机原理学习(6)-- x86-32 CPU和内存管理之分页管理
- 计算机原理学习(6)-- x86-32 CPU和内存管理之分页管理
- 基于80x86的Linux的分段和分页机制
- 基于80x86的Linux的分段和分页机制
- [转]X86的分页机制和相应系统结构
- windows游戏编程<四>X86 32位保护模式下的内存管理概述(一)
- windows游戏编程<六>X86 32位保护模式下的内存管理概述(二)
- x86 32位机的特权保护
- C++学习日记
- Symmetric Tree(递归和非递归方法) ——Difficulty:Easy
- Linux下的C语言编程——指针实现矩阵转置
- 单片机中串口显示数字1至10
- matrix6
- x86(32位)分页管理的机制
- 2017微软秋季校园招聘在线编程笔试 题目2 Composition
- linux中的文件移动
- MQTT协议 Python客户端
- codeforces723c
- Scroll与Layer中的touch冲突
- Javascript入门笔记1-script标签
- matrix7
- 七、Lua中的协同程序