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):
So với actual output (trên một máy tính xách tay cũ)
'-' 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!