2012-04-04 26 views
6

Trong khoảng một tuần qua, tôi đã phát triển một hệ điều hành đơn giản cho mục đích học tập và ... "vui". VirtualBox và NASM trong tow, tôi thực sự có một khởi đầu khá tốt. Cuối cùng, tôi quyết định rằng tôi cũng muốn phát triển một bộ nạp khởi động (sau khi nhấn vào bức tường 512-bit khá khó) bằng cách cấp nguồn thông qua Brokenthorn tutorial khét tiếng, cho đến khi tải từ hệ thống tập tin.Trình tải khởi động FAT16 hoạt động tạo ra lỗi đọc trên phần cứng thực tế?

Với một số hình lục giác HexFiend và một số hình ảnh FAT16 trống, tôi cuối cùng đã nhận được BPB. Với một số hack hội bổ sung (cơ sở là hướng dẫn của Brokenthorn, part 6), tôi cũng có tải tệp làm việc với bộ tải khởi động, tải tệp 'khởi động' có tên aptly từ đĩa ảo của tôi (được thực hiện bằng dd nếu =/dev/zero của = boot.img bs = 512 count = 2880)

Vì vậy, vấn đề là gì? Đó là những gì tôi thấy khi load vào phần cứng thực tế thông qua một USB (trong trường hợp này,/dev/disk3, nơi mà các tập tin biên soạn là boot.bin):

dd bs=512 count=1 if=compiled/boot.bin of=/dev/disk3 

Đây là kết quả dự kiến ​​(trong VirtualBox):

Current output

So với actual output (trên một máy tính xách tay cũ)

Old output

'-' indicates a sector is being loaded 
'_' indicates a sector was loaded 
'!' indicates all of the desired sectors were loaded properly 
'R' indicates a read error 
'T' indicates the FAT table is being loaded 
'D' indicates the FAT table was loaded properly 
'F' means the file is being located (or Found, hence the F) 
'L' means the file is being loaded 

(Tôi đã sử dụng thực tế thông điệp debug, nhưng giới hạn 512-byte là khá khủng khiếp.)

Vì vậy, sự khác biệt là một là một thẻ nhớ USB, và một là một (ảo) mềm đĩa. Cả hai đều có chính xác cùng một thông tin được tải trên mỗi, bao gồm BPB. Tuy nhiên, một công trình, và một không. Đây là phần chính của mã của tôi cho tải một lĩnh vực (sử dụng ah 02h/int 13h, mà tôi nghe làm việc đúng cách cho một USB):

ReadSectors: 
    mov di, 0x0005     ; How many times should we retry the read? 

ReadSectors.loop: 
    ; DEBUG 
    push ax 
    mov ah, 0eh 
    mov al, '-' 
    int 10h 
    pop ax 
    push ax 
    push bx 
    push cx 
    call LBAToCHS 
    mov ah, 02h      ; Set the interrupt to the 
            ; 'read sector' function 
    mov al, 1      ; Only read one sector 
    mov ch, byte[chs.track]   ; The track to read from 
    mov cl, byte[chs.sector]  ; The sector to read from 
    mov dh, byte[chs.head]   ; The head to read from 
    mov dl, byte[_bpb.driveNumber] ; The drive to read from 
    int 13h       ; Call our 'disk IO' interrupt 
    jnc ReadSectors.success   ; If we successfully read the data, 
            ; we don't have to try again 
    mov ah, 00h      ; Set the interrupt to the 
            ; 'reset disk' function 
    int 13h       ; Call our 'disk IO' interrupt 
    dec di       ; Decrement our error counter 
    pop cx 
    pop bx 
    pop ax 
    jnz ReadSectors.loop   ; Try again if we've failed 
    jmp ReadSectors.fail   ; RED ALERT 

(Nguồn đầy đủ, bao gồm cả BPB, có thể được tìm thấy trên pastebin (http://pastebin.com/SeUm7xu6)

tôi đã vượt qua một số vấn đề với hội cho đến nay, nhưng điều này đã cho tôi bối rối. Hy vọng rằng, tôi có thể vượt qua bootloader và trừu tượng file IO càng sớm càng tốt.

Bất kỳ đề xuất nào cũng sẽ được đánh giá rất cao. Cảm ơn trước!

Trả lời

6

Mã của bạn đọc từ số ổ đĩa 0 có thể không phải là bộ nạp khởi động của thiết bị được tải từ (và thường không phải là nếu bạn khởi động từ thanh USB). Số ổ đĩa bạn nên đọc từ được nạp bởi BIOS vào dl đăng ký. Nó đã là answered question trên SO.

Các vấn đề liên quan