找回密码
 立即注册
搜索
热搜: 活动 通知
楼主: wum

x86汇编语言第二版第19章好像有个错误?

[复制链接]

3

主题

33

回帖

381

积分

至尊会员

积分
381

至尊会员

发表于 2024-3-13 11:29:55 | 显示全部楼层
站长 发表于 2024-3-13 11:14
是在例程create_copy_cur_pdir里完成的。
具体是在源文件c19_core.asm里的第361~362行。 ...

这一段的功能是把当前任务(内核)页目录表的FF8项内容填充为新分配页(用户任务页目录表)的物理地址(外加属性)吧?

416

主题

315

回帖

3288

积分

管理员

积分
3288
发表于 2024-3-13 13:47:28 | 显示全部楼层
cindeequan 发表于 2024-3-13 11:29
这一段的功能是把当前任务(内核)页目录表的FF8项内容填充为新分配页(用户任务页目录表)的物理地址( ...

不是的。这是将新分配的页目录表的物理地址写入它自己的最后一项。
假设新分配的页目录表是T,则这一段是将T的物理地址写入T的最后一项。

3

主题

33

回帖

381

积分

至尊会员

积分
381

至尊会员

发表于 2024-3-13 15:43:35 | 显示全部楼层
站长 发表于 2024-3-13 13:47
不是的。这是将新分配的页目录表的物理地址写入它自己的最后一项。
假设新分配的页目录表是T,则这一段是 ...

但是书里的原话是
”第359行,我们调用例程allocate_a_4k_page分配一个空闲的物理页,
例程返回后,用EAX返回这个页面的物理地址。那么,如何访问这个页
面呢?在分页模式下,即使知道页的物理地址也不行,因为在分页模
式下访问内存依靠的是线性地址而不是物理地址,而且地址转换是通
过页目录表和页表进行的。为此,我们必须在页目录表和页表中登记
这个页。如此一来,线性地址也就确定了。
首先,我们将页物理地址的低12位改成属性,属性值为0x007,即,
US=1,允许特权级别为3的用户程序访问该页;RW=1,页是可读可写
的;P=1,页位于物理内存中。为了能够访问到该页,我们把它的物理
地址登记到当前页目录表的倒数第2个目录项。我们只知道这个表项在
页目录表内的偏移是0xFF8,但我们需要通过线性地址来访问这个表
项。那么,这个表项的线性地址是多少呢?我们来推演一下
。“
这里面讲的也是把新分配的页目录表T登记到当前页目录表的FF8项啊。。。

416

主题

315

回帖

3288

积分

管理员

积分
3288
发表于 2024-3-13 18:47:12 | 显示全部楼层
又回忆了一下,程序应该是有问题的。看我最后的发言。

416

主题

315

回帖

3288

积分

管理员

积分
3288
发表于 2024-3-13 18:50:54 | 显示全部楼层
cindeequan 发表于 2024-3-13 15:43
但是书里的原话是
”第359行,我们调用例程allocate_a_4k_page分配一个空闲的物理页,
例程返回后,用EAX ...

本帖wum是首先提问的。但时间过于久远,我的回复是有问题的。

分配一个新的页目录表之后,create_copy_cur_dir只是将它映射到当前活动的页目录表的倒数第二项,以便访问它。但是并没有将新页目录表的物理地址写入新页目录表的倒数第一项。

这是个严重的疏忽。这意味着所有页目录表的倒数第一项都指向内核的页目录表。

请提问者尝试修复这个问题。

416

主题

315

回帖

3288

积分

管理员

积分
3288
发表于 2024-3-13 19:00:43 | 显示全部楼层
翻了一下我x64的内核程序,64位的程序没有这个问题。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

3

主题

33

回帖

381

积分

至尊会员

积分
381

至尊会员

发表于 2024-3-14 11:54:41 | 显示全部楼层
站长 发表于 2024-3-13 18:50
本帖wum是首先提问的。但时间过于久远,我的回复是有问题的。

分配一个新的页目录表之后,create_copy_cu ...

mov [0xffffeffc], ebx
用这个指令?

416

主题

315

回帖

3288

积分

管理员

积分
3288
发表于 2024-3-14 15:02:10 | 显示全部楼层
cindeequan 发表于 2024-3-14 11:54
mov [0xffffeffc], ebx
用这个指令?

第361~362行。

  1. or ebx,0x00000007
  2. mov [0xfffffff8],ebx
复制代码


3

主题

33

回帖

381

积分

至尊会员

积分
381

至尊会员

发表于 2024-3-14 17:42:07 | 显示全部楼层

站长不是让尝试修复问题吗?16楼里说361-362是漏了让用户任务页目录表最后一项指向自己的代码。
我想了下是增加一行 mov [0xffffeffc], ebx

完整代码部分是:
  1. call allocate_a_4k_page
  2.          mov ebx,eax
  3.          or ebx,0x00000007
  4.          mov [0xfffffff8],ebx
  5.                              
复制代码


416

主题

315

回帖

3288

积分

管理员

积分
3288
发表于 2024-3-15 07:49:37 | 显示全部楼层
cindeequan 发表于 2024-3-14 17:42
站长不是让尝试修复问题吗?16楼里说361-362是漏了让用户任务页目录表最后一项指向自己的代码。
我想了下 ...

没这么简单。你这是向当前活动的页目录里添加,而不是往新分配的页目录里添加。

由于不能使用物理地址,所以程序中是先映射这个新分配的页目录,然后再访问。你这刚一分配就直接访问,是不可能行的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-22 09:06 , Processed in 0.224046 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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