本课时主要目的是学习使用BIOS中断从磁盘中读取数据到内存,进一步了解BIOS中断的使用方法。

存储规划

由于boot的容量限制,所以将大部分初始化和加载内核的功能放在loader中。为简单起见, loader在磁盘上的位置位于紧接boot之后的扇区,即第1扇区开始。长度不限。
boot启动之后,将调用BIOS中断从第1扇区加载loader到0x8000地址处,之后跳转到0x8000地址处运行。
\image (10).png

是否必须放在第1扇区,0x8000地址处?不是必须的。可以有其它选择。本课程只是从简单、方便地角度去考虑,并不考虑是否节省内存。

INT13磁盘读取

BIOS提供了磁盘操作的服务中断,其具体使用方法如下:

● AH=02H
● AL=扇区数
● CH=柱面 cx = ch: cl
● CL=扇区
● DH=磁头
● DL=驱动器,00H~7FH:软盘;80H~0FFH:硬盘
● ES:BX=缓冲区的地址
● 出口参数:CF=0——操作成功,AH=00H,AL=传输的扇区数,否则,AH=状态代码,参见功能号01H中的说明。CF标志见EFLAS寄存器中的CF位。

注:磁盘还支持LBA模式下的读取,但是这种读取方式相比直接用BIOS会复杂一些,代码量也多,不易用汇编实现。所以,此处使用BIOS中断读取;在后续的loader实现中,将使用LBA读取,到时可以将其与INT 13读取方式进行比较。
GDB查看内存命令

如果要使用GDB查看内存内容,可以使用x命令,其指令格式如下:
x /<n/f/u> <addr>
例如 x /100u 0x10000
● n 是一个正整数,表示显示内存的长度。
● f 表示显示的格式
○ x 按十六进制格式显示变量。
○ d 按十进制格式显示变量。
○ u 按十六进制格式显示无符号整型。
○ o 按八进制格式显示变量。
○ t 按二进制格式显示变量。
○ a 按十六进制格式显示变量。
○ c 按字符格式显示变量。
○ f 按浮点数格式显示变量。
● u:显示的单元大小。默认是4个bytes。b表示单字节,h表示双字节,w表示四字节,g表示八字节。

参考资料

  1. 直接磁盘服务中断:https://blog.csdn.net/wyyy2088511/article/details/118943195

  2. Debugging with gdb (第161页)



登陆发表评论