注意:这个帖子属于边写边记,之后应该会整理成文章发到其他平台。引导代码基于我自己写的bootloader,和30天的不一样
首先,我之前看过的很多书和文章都直接默认从0号软盘引导,因此引导扇区的代码也是写死了直接从扇区0读取loader。多亏了chatgpt,我找到了IBM的BIOS文档
文档中记录了INT 19中断功能就是关于Bootstrap Loader的。其中规定了:CS=0000H,IP=7C00H(也就是引导扇区的地址),DL=读取的(磁盘)驱动器号。虽然这是BIOS提供给程序用来从指定驱动器重新引导的,但是我相信初次启动时应该也是相同的。
实践出真知,使用QEMU+gdb调试,在0x7c00处打断点。参数指定从0号软盘启动时,DX=0x00,从0号硬盘启动时,DX=0x80。软盘驱动器号范围是0x00~0x7F,硬盘则是0x80~0xFF,所以基本就可以确定引导程序所在的磁盘号存在DL寄存器中。
如果直接存下DL作为后面加载程序的驱动器号,应该就可以实现软盘硬盘通用的引导程序了
首先,我之前看过的很多书和文章都直接默认从0号软盘引导,因此引导扇区的代码也是写死了直接从扇区0读取loader。多亏了chatgpt,我找到了IBM的BIOS文档
文档中记录了INT 19中断功能就是关于Bootstrap Loader的。其中规定了:CS=0000H,IP=7C00H(也就是引导扇区的地址),DL=读取的(磁盘)驱动器号。虽然这是BIOS提供给程序用来从指定驱动器重新引导的,但是我相信初次启动时应该也是相同的。
实践出真知,使用QEMU+gdb调试,在0x7c00处打断点。参数指定从0号软盘启动时,DX=0x00,从0号硬盘启动时,DX=0x80。软盘驱动器号范围是0x00~0x7F,硬盘则是0x80~0xFF,所以基本就可以确定引导程序所在的磁盘号存在DL寄存器中。
如果直接存下DL作为后面加载程序的驱动器号,应该就可以实现软盘硬盘通用的引导程序了