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: 需要查看的内存的地址。