一般来说,磁盘是一个一个数据块组织的,而每个数据块则被称为扇区。每个扇区通常为512字节,这意味着每次读写操作都需要读取一个扇区的内容,即512字节的数据。
开机启动时,首先会进行系统自检,检查硬件设备是否完好。在自检完成后,系统会进一步检查硬盘的第一个扇区,即第一个512字节。如果检查到最后两个字节是0xAA,0x55,则说明第一个扇区里面保存的是引导代码,从而可以确保硬盘能够正确地启动系统。检查到引导代码后,系统会将第一个扇区的代码拷贝到0x7c00内存中。
所有代码都需要有一个入口点,我们需要指定代码如何被加载到内存中。
statrt.s通常是作为启动的相关汇编文件,它会与.c文件和.h文件一起被编译,生成一个名为os.bin的文件,该文件将被用于引导整个操作系统的启动过程。在这个过程中,statrt.s文件的作用是必不可少的,因为它负责启动引导代码,并与其他文件进行交互,以确保整个系统能够正确启动并正常运行。
os.bin文件被写到了disk.img文件的开头,这是通过执行dd命令完成的。dd命令的作用是将数据从一个文件中读出,并将数据写入另一个文件中。
最终生成的文件由两部分组成,第一部分是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:寄存器存放下一个CPU指令存放的内存地址
到这里就已经社会成功了。