本文主要是介绍4-7 使用bios 中断 读取磁盘,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1 首先是逻辑。
首先来看一下 他的编译代码的逻辑。
可以看到我 生成的 实际上是 Boot.bin , 这个文件可不止一个扇区, 然后将这个文件写入到了, disk1.img
这里加载了 disk1.img , + disk2.img 我不太理解。
但是可以跑通, 暂时先不管了。
这节的逻辑是:
首先测试的是, 将第0 个扇区后面的几个扇区,全部加载到 1M 的内存中, boot+loader 都是再boot.bin 中。
目前先测试是否能够正确加载,先不去实现loader 的内容。
3 然后是 实模式下 1M内存的 分布结构。
2 然后是代码
这里需要解释一下, AH:这代表的是磁盘的读写命令。
AL: 总共的扇区数。 CH:柱面,为0 , CL:扇区,启始的扇区数,再bios中是从 1 开始的
DH: 磁头,为0, DL : 选择硬盘, BX: 就是加载到的内存中的偏移地址,ES之前已经设置成平坦模型了。
然后使用 13号中断。
这一切都操作完之后,还要判断一下, 标志位,看看指令是否成功。
read_loader:mov $0x8000, %bx // 读取到的内存地址mov $0x2, %cx mov $0x2, %ah // ah: 0x2读磁盘命令mov $64, %al // al: 这里读取了64个扇区mov $0x0080, %dx int $0x13//这里是在判断 指令执行是否成功的标志位,如果不成功,就反复读取。jc read_loader
编译+测试:
注意: 这里不能 用鼠标 点击 qemu , 否则 系统会卡死。
使用 adb 进行测试:
使用 hexdump 命令查看 disk1.img 可以看到 , 都是0
然后使用 adb 进行查看 0x8000 处的数据。
这里也是0 , 并且 调试没有报错, 暂时 认为是可以的。
-exec : 执行命令
x ; 查看内存内容。
/20xb : 查看20字节内容,并且 以16进制显示。
0x8000: 需要查看的内存的地址。
这篇关于4-7 使用bios 中断 读取磁盘的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!