注:本文档为《从0学x86操作系统》课程配套的学习文档,提供相应的辅助学习资料和答疑勘误。 有关该课程的信息,请点击这里访问:https://study.163.com/provider/1017884735/index.htm 在阅读本文档时,如有疑问和建议,欢迎在下方留言或者直接联系我。
本课时主要目的是学习使用BIOS中断从磁盘中读取数据到内存,进一步了解BIOS中断的使用方法。
存储规划
由于boot的容量限制,所以将大部分初始化和加载内核的功能放在loader中。为简单起见, loader在磁盘上的位置位于紧接boot之后的扇区,即第1扇区开始。长度不限。
boot启动之后,将调用BIOS中断从第1扇区加载loader到0x8000地址处,之后跳转到0x8000地址处运行。
是否必须放在第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 表示显示的格式
- x 按十六进制格式显示变量。
- d 按十进制格式显示变量。
- u 按十六进制格式显示无符号整型。
- o 按八进制格式显示变量。
- t 按二进制格式显示变量。
- a 按十六进制格式显示变量。
- c 按字符格式显示变量。
- f 按浮点数格式显示变量。
- u:显示的单元大小。默认是4个bytes。b表示单字节,h表示双字节,w表示四字节,g表示八字节。
参考资料
- 直接磁盘服务中断:https://blog.csdn.net/wyyy2088511/article/details/118943195
- Debugging with gdb (第161页)