|
本帖最后由 mdyblog 于 2014-7-26 18:48 编辑
我写了一段Loader 调入 G4D的 grldr 并运行。我是从16扇区(前面跳过16扇区)开始读取grldr 到内存0820:0000并运行。
grldr版本是 0.4.5c 2013-0117
本来是CHS方式 -INT13-AH2读取, 很正常。
现在改成LBA方式-INT13-AH42读取,数据都正确读到内存了。但是有个问题。
如果随便个地方 “CHS方式 -INT13-AH2读取”1 扇区到没用的内存, grldr就能正常运行启动, 找到(hd0)上的文件并出菜单。
- //FIXME 否则Grub4DOS不认根设备
- xor %ebx, %ebx /* %bx = 0, put it at 0 in the segment */
- movw %bx, %es /* load %es segment with disk buffer */
- mov $0x7A00, %ebx
- movb $0, %dh //head
- movw $(1*0x100+0x01), %cx //ch=cyl cl=sec
- movw $0x0201, %ax /* function 2 */
- int $0x13 //这句不能省
复制代码
放在LBA读取前,后均可。
否则,grldr启动后root为(fd0)以至找不到(hd0)上的文件。
【 int $0x13 】 这句还不能省。
这是为什么啊?问题在哪儿?怎么去掉这几行,直接初始话对应寄存器。
启动设备我是通过 %dl 寄存器传下去的。测试为0x80.
%dh 寄存器是分区号,测试为0xff.
LBA 读取时, 怎么传递参数,grldr 才能 正常 找到初始根设备(启动设备)。
弄了好几天,卡在这里。
2) 另外,测试了下 0.4.6a又可以。这是为什么啊?
我担心的是我的代码问题。如果只是旧版grldr 才有的问题, 而不是我代码的问题。
那就绕过去好了。换个版本。
请大神分析下,给个答复。
望大神指点!!!!
|
|