我正在尝试将内核的第一部分组合在一起。我目前将整个内核编译为 C 代码,并且我已经设法让它在控制台窗口中显示文本以及所有这些优点。现在,我想开始接受键盘输入,这样我就可以实际使用它并继续进行流程管理。
我正在使用 DJGPP 进行编译,并使用 GRUB 加载。我还使用了一小部分程序集,它基本上直接跳转到我编译的 C 代码中,我很高兴从那里。
我所做的所有研究似乎都指向 $0x16 的 ISR 以从键盘缓冲区中读取下一个字符。据我所知,这应该将 ASCII 值存储在 ah 中,并将键码存储在 al 中,或者类似的东西。我试图在内联汇编中使用以下例程对此进行编码:
char getc(void)
{
int output = 0;
//CRAZY VOODOO CODE
asm("xor %%ah, %%ah\n\t"
"int $0x16"
: "=a" (output)
: "a" (output)
:
);
return (char)output;
}
调用此代码时,核心立即崩溃。(我在 VirtualBox 上运行它,我觉得没有必要在真实硬件上尝试这种基本的东西。)
现在我实际上有几个问题。没有人能够告诉我(因为我的代码是从 GRUB 启动的)我目前是在实模式还是受保护模式下运行。我没有以一种或另一种方式进行跳跃,我计划在实模式下运行,直到我设置了一个进程处理程序。
那么,假设我在实模式下运行,我做错了什么,我该如何解决?我只需要一个基本的 getc 例程,最好是非阻塞的,但如果谷歌在这方面提供帮助,我会感到很糟糕。一旦我能做到这一点,我就可以从那里做剩下的事情。
我想我在这里要问的是,我在正确的轨道附近吗?通常如何在这个级别上获得键盘输入?
编辑:哦……所以我在保护模式下运行。这当然解释了尝试访问实模式功能时的崩溃。
那么我想我正在寻找如何从保护模式访问键盘 IO。我也许可以自己找到,但如果有人碰巧知道,请随意。再次感谢。