作为世界上任何一位程序员,在他/她的生命中至少有一次,我试图创建我的“革命性”,新的,也是唯一的一个操作系统。:D
嗯,我使用的是一个虚拟模拟器(Oracle VM virtual ),我为它创建了一个新的未来得及的操作系统,其中有一个vmdk磁盘。我喜欢vmdk,因为它们只是普通的文件,所以我可以将引导加载程序粘贴到虚拟硬盘的前512字节上。
现在,我正在尝试读取这个虚拟磁盘的下一个扇区,我将粘贴一个显示消息的简单内核。
我有两个问题:
ReadDisk: mov bx,0x8000;段mov es,bx mov bx,0x0000;偏移量mov ah,0x02;读取函数mov al,0x01;扇区--这可能是错误的,尝试从hd mov读取,0x00;柱面mov cl,0x02;扇区mov dh,0x00;磁头mov dl,0x80;驱动器-试图从hd int 0x13读取;磁盘int jc ReadDisk jmp :bx;缓冲区
在这里,在检查CF之后,我得到了错误消息。然而,如果我使用INT 13,1来获取最后的状态消息,AL是0-所以没有错误保存。
AC 45 7C E8 16 00 EB FE B4 0 E B7 00 B3 07 CD 10 <-第一扇区C3 08 C0 74 05 E8 EF E8 F6 C3 B4 00 B2 80 CD 13是5D 7C 72 F5 BB 00 80 8E C3 BB 00 B4 02 B0 06 B5 00 B1 01 B0 00 07 CD 13 e 4E 7C 72 CF 26 FF 57 65 6C 63 6F 65 6D 21 52 65 64 69 6E 67 65 72 6F 72 21 65 65 65 74 74 6E 67 67 65 72 72 72 21 00 00 0000 00 0000 00 0000 00 0000 00 00 -启动-载入者签署的B4 0E B0 2E CD 10 B0 00 00 00第二区00 00 00
所以,这就是我试图将内核添加到第二个扇区的方式。你觉得这有什么不对?谢谢!
更新
好的,我现在没有看到任何错误,但我没有看到加载的代码正在执行。它应该在窗口上显示一个点:
;--------------------------------------------
; 'load.asm'
; loaded from 'boot.asm'
[org 0x8000]
[bits 16]
;--------------------------------------------
main:
mov ah, 0x0E ; print function
mov al, '.' ; ascii char
int 0x10 ; IO int
jmp $ ; hang
发布于 2012-06-21 01:56:04
一个问题是:
jmp [es:bx]
这将从寄存器es
(段部分)和bx
(偏移部分)中包含的地址的内存位置读取地址,即16位偏移量,然后将ip
设置为16位偏移量。
您可能想要使用的是:
jmp some_constant1:some_constant2
这将将cs
设置为some_constant1
,将ip
设置为some_constant2
。毫不奇怪,这两个常量的候选值分别为0x8000和0,因为这是加载代码的位置。
现在,第二个问题是:
[org 0x8000]
这个org
告诉NASM生成代码的方式是,如果在偏移量0x8000处加载,它就能工作。现在,偏移量0x8000与段0x8000不一样。如果使用jmp 0x8000:0
,那么还应该使用:
[org 0]
发布于 2012-06-17 13:33:41
失败后再试一次。我认为当磁盘旋转时,您将收到没有消息的错误指示,因此模拟器可能第一次故意失败。在bochs和qemu中,四次尝试对我都很有效,但我没有在任何其他方面尝试过。您还可能希望在读取之前重置驱动器控制器以清除任何先前的错误。使用al
清除和dl
中的驱动器号的中断0x13。
注意:硬编码驱动器号可能暂时有效,但不允许您支持从其他驱动器启动。在启动引导加载程序时,BIOS应该将驱动器号保留在dl
中,因此您可以保存它。
https://stackoverflow.com/questions/11074483
复制相似问题