我目前正在阅读第一个Linux内核的源代码中的boot.s
文件(假设0.01确实是第一个公开发布的版本)。
我懂得C语言和汇编语言,但后者比前者要少得多。即便如此,我似乎能够理解并基本掌握源文件中的代码。
然而,这个文件让我感到困惑。我现在意识到这是实模式,而不是保护模式。毋庸置疑,在我出生之前,受支持的x86操作系统都运行在保护模式下,所以这是可以预料的。
下面是我想更好地理解的一个例程:
/*
* This procedure turns off the floppy drive motor, so
* that we enter the kernel in a known state, and
* don't have to worry about it later.
*/
kill_motor:
push dx
mov dx,#0x3f2
mov al,#0
outb
pop dx
ret
查阅
outb
后,我发现它被用于向计算机端口传递字节。根据 C 文档的猜测,第一个参数传递“停止电机”的字节,第二个参数传递软盘驱动器端口号。这个接口是由 BIOS 提供的吗?还是由软盘驱动器直接提供的?我假设 BIOS 为所有基本设备提供简单的操作“驱动程序”。这里让我困惑的是:似乎像
#0x3f2
这样的数字是凭空出现的。它们显然是硬件端口号或类似的东西。这个文件中散布着这样的数字,却没有解释它们所指的内容。我在哪里可以找到全面的参考资料,展示所有硬件端口和它们可以从实模式接收的控制数字?此外,该文件似乎会在引导过程中将内核移动到内存中,并使用硬编码的内存地址。我在哪里可以找到指导实模式下可用于写入的内存地址范围的指南?我还读到了 Linus 的一条关于重新编程中断以避免 BIOS 和内部硬件中断冲突的评论。我不会撒谎,我完全不懂。
如果可以的话,帮助一下我吧。谷歌上关于这个主题的信息很少。