计算机上电启动时,会自动跳转到BIOS,这是一种固化在主板上的程序,每次电脑通电后都会立即运行。 BIOS可以对计算机的硬件进行初步检测,比如主板、硬盘、显卡、内存等,然后根据检测结果来判断计算机是否可以正常启动。当BIOS检测到硬件正常时,就会继续执行下一步。接下来,BIOS会进行一系列的自检,包括但不限于对计算机的启动设备进行检查、硬盘的分区情况进行检查、显卡和内存的状态进行检查等等,以此确保计算机的硬件系统可以正常工作。当BIOS自检结束后,计算机就会加载引导代码,引导代码可以引导操作系统进入系统的操作界面。
硬盘是一种最常见的存储设备之一,它由多个数据块组成,这些数据块被称为扇区,每个扇区的大小为512字节。通常情况下,一个扇区大小为512字节的硬盘是由1024个扇区组成的。为了正确地读写硬盘中的数据,首先需要正确地读写一个扇区,也就是512字节的数据。只有在正确地读写一个扇区后,才能进一步读写其他扇区,直到读写到完整的数据块为止。
硬盘的上电检测是一项必要的步骤,一旦硬盘接通电源,它便会首先检查硬盘的第一个扇区。这是一个512字节的区域,也称为引导扇区,其中包含了引导代码,用于控制硬盘的启动和运行。如果硬盘的最后两个字节是0xAA,0x55,那么就意味着该扇区中包含了正确的引导代码。一旦硬盘检测到这个引导代码,就会将其复制到内存中的0x7c00地址处。其他部分会加载到内存中的其余部分自己任意读取。
首先,在编译过程中,通过编译器将源文件编译成可执行文件,这些可执行文件的启动代码通常位于start.s文件中。接着,这些文件会与.c和.h等相关文件一起被编译成os.bin文件。在编译过程中,会根据程序所需的硬件环境、运行平台等因素,对不同文件进行编译和优化,以提高程序的执行效率和稳定性。然后,这些文件会被装入到指定的内存区域中,并在合适的时机被加载到内存中运行。在完成了编译和加载过程后,会通过dd命令将os.bin文件写到disk.img文件的开头。
最终生成的文件实际上是由两部分组成的:第一部分是start.S的汇编生成的部分代码,这部分代码被放入了第一个扇区,也就是最开始的部分。而另外一部分则是os.h的代码,这部分代码是通过使用dd命令写入到磁盘的相应位置的。
为实现将start.s文件生成的代码加载到内存中的目标,我们需要保证第一个扇区的最后两个字节必须为0xAA,0x55,这对于编译过程至关重要。若不加上这个特定的代码,编译器将会提示无法找到引导的设备,这将会导致编译失败。
终端运行make然后F5运行,可能会导致start.s文件生成的代码加载到内存中,但如果没有两个特殊字符0xAA和0x55,那么BIOS将无法识别其为有效的代码,也就无法加载start.s文件并进行正常的运行。
写上代码
.org 0x1fe //十进制是510,第一个字节的最后两个字节是0x55和0xaa,所以位置就是510,.org 0x1fe是偏移了510字节.byte 0x55, 0xaa // 510字节的地方就是0x55,511字节的地方就是0xaa //.byte 就相当于unsigned char s[] = {0x55,0xaa};
运行会发现在代码位置停止,QEMU会显示从disk去启动
在DEBUG这样的计算机调试工具上面,可以很容易地看到处理器的寄存器信息,了解CPU的运行状态和指令执行情况。
EIP寄存器,又称为目标IP寄存器或指令指针寄存器,用于存储下一个CPU指令将要存放在内存中的地址。这个寄存器是CPU执行程序时必不可少的一部分,它的值决定了程序将执行的下一条指令的地址。