找回密码
 立即注册
搜索
热搜: 活动 通知
查看: 509|回复: 3

x86 汇编第16章分页机制和动态页面分配 16.3.2 节疑问

[复制链接]

2

主题

0

回帖

38

积分

新手上路

积分
38
发表于 2024-8-12 21:30:50 | 显示全部楼层 |阅读模式
李忠老师您好,打扰您了,我正在看x86 汇编(第1版)第16章分页机制和动态页面分配16.3.2节,我有两个疑问:

1.如果我要在页目录偏移量 0x800 的地方写入页表的首地址 0x00021003,为什么我不能使用线性地址 0x00020800 直接访问然后写入地址?因为已经为内存低端的 0x00000000-0x000FFFFF 创建了页表和页目录,根据页部件将线性地址转换为物理地址的方式,前10位指明了页目录中的偏移量为 0,直接访问页目录的中第1项0x00021003的页表地址,中间10位偏移量为 0x20,访问页表中第32个页表项,得到的页的物理地址为 0x20000,加上最后 12 位的偏移地址 0x800,这样不就可以直接访问内存物理地址 0x00020800 处的页目录项了吗?还是说自己对这段话理解的不是很清楚?

》》》引用:为了修改页目录表 PDT,需要访问它,知道它的物理地址。但是,当前已经开启了分页功能,在分页机制下,程序只能使用线性地址,访问内存必须先访问页目录和页表,通过它们转换之后的地址才是能够发送到内存芯片的物理地址,你自己知道页目录表的物理地址,这没有用。或者,说得更清楚一点,你访问的是页目录表,但却还要通过页目录表进行地址转换之后才能访问内存中的页目录表。这有点自相矛盾,除非页目录表中有一个目录项能指向页目录表自己。否则,访问一个并未在页目录表和页表内登记的页,会引发处理器异常中断

350

主题

281

回帖

2834

积分

管理员

积分
2834
发表于 2024-8-12 21:44:56 | 显示全部楼层
你的方法确实没有错,因为低端1MB内存在开启分页前已经映射好了,而且PDT就位于这段空间。如果你非要以这种透明的方式来访问所有页目录表和页表,那就必须在开启分页前映射一大块内存,而且保证所有页目录表和所有页表都位于这段内存里。同时,你还必须记住所有页目录表和所有页表的线性地址。但,这真的好吗?

5

主题

6

回帖

91

积分

至尊会员

积分
91

至尊会员

发表于 2024-8-22 17:13:49 | 显示全部楼层
本帖最后由 jetcan 于 2024-8-22 17:16 编辑

李老师,关于此问题我也有疑惑:

     处理器的页管理部件用 CR3 定位页目录表的物理基地址的高 20 位,那能不能从 CR3 的内容中取出高 20 位,然后再补齐低 12 位,从而得到页目录表的基地址呢?

    mov ebx, cr3
    and ebx, 0xfffff000      ; 此时 ebx -> 页目录表的基地址

    盼复,谢谢!

350

主题

281

回帖

2834

积分

管理员

积分
2834
发表于 2024-8-22 20:04:32 | 显示全部楼层
jetcan 发表于 2024-8-22 17:13
李老师,关于此问题我也有疑惑:

     处理器的页管理部件用 CR3 定位页目录表的物理基地址的高 20 位,那 ...

所有与分页有关的表都是4KB对齐的,低12位都是0。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|鼠侠网 ( 吉ICP备19001332号 )

GMT+8, 2024-9-17 03:29 , Processed in 0.215570 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表