gpt4 book ai didi

linux - 我混淆了一些关于在 Linux 0.11 中的 boot/setup.s 文件中启用 PE 的汇编代码

转载 作者:太空宇宙 更新时间:2023-11-04 10:51:13 25 4
gpt4 key购买 nike


相关的汇编代码位于 boot/setup.s 中,我将它们粘贴在下面:

    mov ax,#0x0001        ! protected mode (PE) bit 
lmsw ax ! This is bit!
jmpi 0,8 ! jmp offset 0 of segment 8 (cs)

前两行已经对CR0控制寄存器做了相应的位变化。
所以,我的问题是:
当执行指令 lmsw ax 时,ip寄存器指向下一条指令jmpi 0,8
更准确地说,此时,cs:ip 指向指令的内存位置jmpi 0,8
但在指令lmsw ax执行后,PE机制被启用。cs 值现在
表示段选择器,但相应的 GDT 描述条目不是
为它做好准备。 GDT 仅包含分别位于 1 和 2 中的两个有效条目。所以,我
认为 cs:ip 指定的下一条指令不是指令 jmpi 0,8
cs:ip 现在指向一个无效的内存地址。上面最后一条指令 jmpi 0,8 被使用 无法将正确的值放入 cs 和 eip 寄存器。我知道我错了,因为 Linux 0.11 正在通过长期实践验证。请帮我指出我犯的错误。非常感谢。

最佳答案

每次使用段寄存器时,CPU 都不会在 GDT(或 LDT)中查找选择器。它只在加载段寄存器时读取内存中的描述符表。然后它将信息存储在段描述符缓存中。同样的事情发生在实模式中,当段寄存器加载一个值时,该值用于在描述符缓存中创建一个条目。然后,无论何时使用该段,无论是在实模式还是保护模式下,处理器都会使用存储在高速缓存中的值。

当你从实模式切换到保护模式时,段寄存器都没有改变,描述符缓存中的条目也没有改变。 CS 寄存器的缓存条目与之前相同,因此 CPU 按预期执行以下指令。直到执行了下面的远跳转指令,CS 寄存器的值才发生变化,然后用新的保护模式条目替换旧的实模式描述符条目。

关于linux - 我混淆了一些关于在 Linux 0.11 中的 boot/setup.s 文件中启用 PE 的汇编代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30932302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com