注:本文档为《从0学x86操作系统》课程配套的学习文档,提供相应的辅助学习资料和答疑勘误。 有关该课程的信息,请点击这里访问:https://study.163.com/provider/1017884735/index.htm 在阅读本文档时,如有疑问和建议,欢迎在下方留言或者直接联系我。

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

存储规划

由于boot的容量限制,所以将大部分初始化和加载内核的功能放在loader中。为简单起见, loader在磁盘上的位置位于紧接boot之后的扇区,即第1扇区开始。长度不限。
boot启动之后,将调用BIOS中断从第1扇区加载loader到0x8000地址处,之后跳转到0x8000地址处运行。
image.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 表示显示的格式
    • 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页)