微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么Bochs在等待软盘响应时无限循环

如何解决为什么Bochs在等待软盘响应时无限循环

我正在 MacOSX catalina10.15.6 下编写 32位实验性操作系统,并且尝试使用端口 0x1F0 读取软盘〜 0x1F7 加载我的内核。但是有一些错误,所以我不想使用 Bochs 进行调试。但是每次我踏入标签.wait bochs 将永远不会跳出来,它会不断循环。如何获取 Bochs 读取软盘并从此功能read_disk32_lba返回

这是我的.bochsrc

floppya: 1_44=os-image,status=inserted
boot: a
log: log.txt

这是在read.asm中读取磁盘的功能(使用 nasm ):

;read a sector in LBA mode
;@param ds:edi buffer address
;       ebx    the sector index
;       
read_disk32_lba: 
    mov al,1
    mov dx,0x1F2
    out dx,al   ;read one sector

    ;write the sector index to ports
    mov dx,0x1F3
    mov al,bl
    out dx,al

    inc dx      ;0x1F4
    mov al,bh
    out dx,al

    inc dx      ;0x1F5
    shr ebx,16
    mov al,al

    inc dx          ;0x1F6
    mov al,bh
    or al,0xE0     ;use LBA mode to read
    out dx,al

    mov al,0x20
    mov dx,0x1F7
    out dx,al       ;ask for read

    ;wait for a response from the disk
    .waits:
        in al,dx
        mov ah,al
        and ah,0x01
        cmp ah,0x01
        jz .error
        and al,0x88
        cmp al,0x08
        jnz .waits

    ;write dataes to buffer
    mov dx,0x1F0
    mov ecx,256
    .read: 
        in ax,dx
        mov [edi],ax
        add edi,2
        loop .read
    jmp .end

    ;error handling
    .error:
        mov esi,READ_ERROR
        call print_string32
        hlt
    .end:
    ret

READ_ERROR: db 'Kernel read error',0

然后我通过以下方式编译了asm文件

nasm read.asm -f bin -o read.o

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。