x86汇编语言-从实模式到保护模式
地址转换
开启分页机制,虚拟地址要经过页部件的转换,才能得到物理地址。
处理器的页部件专门负责线性地址的转换工作,首先将段部件送来的32位线性地址截成3段
- 高10位-页目录的索引
- 中间10位-页表索引
- 低12位-页内偏移
1 示意图
2 步骤
2.1 操作系统建立映射
当任务加载时,操作系统先创建虚拟的段,并将段地址的高20位决定它要用到哪些页目录项和页表项。然后,寻找空闲的页,将原本应该写入段中的数据写到一个或者多个页中,并将页的物理地址填写到相应的页表项中。只有这样做了,当程序运行的时候,才能以相反的顺序进行地址转换,找到正确的数据。
2.2 寻址过程
当前任务页目录的物理地址在处理器的CR3寄存器中,假设它的内容为0x00005000
段管理部件输出的线性地址是
0x00801050
,其二进制形式为0000 0000 1000 0000 0001 0000 0101 0000
。高10位为
0000000010
,也就是十六进制的0x002
,它是目录表内的索引,处理器将它乘以4(因为每个目录项为4字节),作为偏移量访问页目录。最终,处理器从物理地址00005008
处取得页表的物理地址0x08001000
。线程地址的中间10位为二进制的
0000000001
,即0x001
,处理器要用它作为页表内的索引来取得页的物理地址。处理器将该索引值乘以4,作为偏移量访问页表。最终,处理器从物理地址08001004
处取得页的物理地址。页的物理地址是
0x0000C000
,而线性地址的低12位是数据所在的页内偏移量。故处理器将它们相加,得到物理地址0x0000C050
,这就是线性地址0x00801050
所对应的物理地址,要访问的数据就在这里。
x86汇编语言-从实模式到保护模式
https://bannirui.github.io/2023/02/28/x86汇编语言-从实模式到保护模式/