gpt4 book ai didi

assembly - 不带 hlt 的 HLT 指令

转载 作者:行者123 更新时间:2023-12-04 04:45:26 25 4
gpt4 key购买 nike

我正在为我的自定义内核编写引导加载程序,它(引导加载程序)基于 Linux 内核 v0.1 boot.s .这是代码:

.set    BOOTSEG, 0x7c0
.set LOADSEG, 0x9000
.set SYSSEG, 0x1000

start:
//copy the WHOLE bootloader to new location
movw BOOTSEG, %ax
movw %ax, %ds
xor %si, %si
movw LOADSEG, %ax
movw %ax, %es
xor %di, %di
movw 256, %cx
rep movsw

//jump to new location
cli
movw LOADSEG, %ax
movw %ax, %es
ljmp $LOADSEG, $loaded

loaded:
// ...

movw $0x3, %ax
int $0x10

// ...

当我尝试跳转到新位置时,Bochs 写道: WARNING: HLT instrucion with IF=0 ,但没有 hlt我的代码中根本没有说明。跳转后Bochs继续运行,但不能正常工作,例如: int $0x10不清除屏幕。

可能是我复制的 bootstrap 错误,但它类似于Linux。

那么,有人可以帮我解决这个问题吗?

最佳答案

Bochs 说你的 IF(中断标志,允许中断)是 0,所以问题一定出在你的远跳上。你必须确保

  • 您在 loaded 之后的代码标签不包含任何 hlt使用说明
  • 您的 loaded 有正确的偏移量标签(检查您使用的编译器或链接器设置)

  • 根据您的 osdev post ,您正在尝试将 GDT 的段选择器与段寄存器相关联。如果在实模式下进行,段寄存器的值将不会用于获取 GDT 条目,但它们将作为标准实模式段被移位并添加到偏移量。我敢打赌,如果您注释掉(或删除)将段设置为 GDT 条目的代码,一切都会正常进行。试试吧。

    它应该起作用的原因很简单:您将 CS 段从 LOADSEG 更改为至 0x8 ,实际上是什么将您带到了实模式的 IVT 空间。

    如果要使用 GDT,必须先跳转到保护模式。
    您可以在 well written tutorials 中找到有关此主题的更多信息在 Brokenthorn.com 上。

    关于assembly - 不带 hlt 的 HLT 指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18272624/

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