【问题标题】:Switch to protected mode切换到保护模式
【发布时间】:2013-11-01 09:27:44
【问题描述】:

是否有切换到保护模式的简单代码? (对于 NASM)是的 - 我尝试使用 Google 解决它。尽管如此,我还是不明白如何......以及如何加载位于 VBR 后面的内核(在这种模式下)? (在第一个 512 字节之后,大小为 512 字节)谢谢!

【问题讨论】:

  • 切换的代码相当痛苦,但并非不可能。在此基础上编写完整的操作系统,这样您就可以做绝对的基础知识,例如显示文本、接受用户输入、打开文件等,这会让您倒退几年。一点点当然,它已经完成了。

标签: kernel x86-64 nasm protected-mode


【解决方案1】:

在保护模式下,您无权访问 BIOS 来为您做这些事情。您需要编写驱动程序,以便引导加载程序加载您的内核并启动它。相对较小的内核(小于 ~640kb)的另一种方法是,当您仍处于实模式时,使用 BIOS 加载它,一旦处于保护模式,将其从低内存移开并启动它。

【讨论】:

  • 您可以使用 VX86 或其他任何名称。我不记得了。无论如何,你可以用它作弊,因为它会将你的任务切换到实模式,你可以调用常规的 bios 函数。这样做的实际方法是在保护模式下重写那些 int 10、int 13 和诸如此类的东西。基本上你必须自己做进出。这不是微不足道的。
【解决方案2】:

我已经很久没有这样做了,但如果我没记错的话,在你可以从实模式切换到保护模式之前,你必须重置 8259 控制器(图片),但那又是在 i386 芯片上所以这可能不再需要了。

然后你使用 CR0 切换到保护模式。

mov  eax, cr0                          
inc  eax                ; PE bit must be set 
mov  cr0, eax           ; store the new value in CR0
jmp  dword pSelector    ; switch to selector 

显然,在您可以切换到保护模式之前,您必须设置 IDT、GDT 和 e,特别注意要有一个双重故障处理程序(不要问)。 如果您使用的是 GAS,则必须将其转换为以下内容:

mov %cr0, %eax
inc %eax
mov %eax, %cr0
jmp pSelector

i386编程方面有几本不错的书,相信AMD手册会告诉你如何从Real模式切换到Protected模式:)

【讨论】:

    猜你喜欢
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 2016-01-18
    相关资源
    最近更新 更多