Chúng tôi đang làm việc trên một dự án để tìm hiểu cách viết hạt nhân và tìm hiểu các từ khóa. Chúng tôi có một bộ tải khởi động được viết và nó có vẻ hoạt động. Tuy nhiên, chúng tôi đang gặp sự cố khi tải hạt nhân. Tôi sẽ bắt đầu với phần đầu tiên:Lỗi với bộ nạp khởi động và hạt nhân
bootloader.asm:
[BITS 16]
[ORG 0x0000]
;
; all the stuff in between
;
; the bottom of the bootstrap loader
datasector dw 0x0000
cluster dw 0x0000
ImageName db "KERNEL SYS"
msgLoading db 0x0D, 0x0A, "Loading Kernel Shell", 0x0D, 0x0A, 0x00
msgCRLF db 0x0D, 0x0A, 0x00
msgProgress db ".", 0x00
msgFailure db 0x0D, 0x0A, "ERROR : Press key to reboot", 0x00
TIMES 510-($-$$) DB 0
DW 0xAA55
;*************************************************************************
Các bootloader.asm là quá dài đối với các biên tập viên mà không gây ra nó để tiếng nổ và nghẹt thở. Ngoài ra, bộ nạp khởi động và hạt nhân hoạt động trong phạm vi bochs vì chúng tôi nhận được thông báo "Chào mừng bạn đến với hệ điều hành của chúng tôi". Dù sao, sau đây là những gì chúng tôi có cho một hạt nhân vào thời điểm này.
kernel.asm:
[BITS 16]
[ORG 0x0000]
[SEGMENT .text] ; code segment
mov ax, 0x0100 ; location where kernel is loaded
mov ds, ax
mov es, ax
cli
mov ss, ax ; stack segment
mov sp, 0xFFFF ; stack pointer at 64k limit
sti
mov si, strWelcomeMsg ; load message
call _disp_str
mov ah, 0x00
int 0x16 ; interrupt: await keypress
int 0x19 ; interrupt: reboot
_disp_str:
lodsb ; load next character
or al, al ; test for NUL character
jz .DONE
mov ah, 0x0E ; BIOS teletype
mov bh, 0x00 ; display page 0
mov bl, 0x07 ; text attribute
int 0x10 ; interrupt: invoke BIOS
jmp _disp_str
.DONE:
ret
[SEGMENT .data] ; initialized data segment
strWelcomeMsg db "Welcome to our OS", 0x00
[SEGMENT .bss] ; uninitialized data segment
Sử dụng NASM 2.06rc2 tôi biên dịch như vậy:
nasm bootloader.asm -o bootloader.bin -f bin
nasm kernel.asm -o kernel.sys -f bin
Chúng tôi viết bootloader.bin vào đĩa mềm như vậy:
dd if=bootloader.bin bs=512 count=1 of/dev/fd0
Chúng tôi viết kernel.sys vào đĩa mềm như sau:
cp kernel.sys /dev/fd0
Như tôi đã nói, tính năng này hoạt động trong bochs. Nhưng khởi động từ đĩa mềm, chúng tôi nhận được kết quả như sau:
tải Kernel Shell
...........
LỖI: Nhấn phím để khởi động lại
chi tiết cụ thể khác: OpenSUSE 11.2, máy tính để bàn GNOME, AMD x64 Bất kỳ thông tin nào khác mà tôi có thể đã bỏ qua, vui lòng hỏi. Tôi đã cố gắng để có được tất cả mọi thứ ở đây mà sẽ là cần thiết. Nếu tôi cần, tôi có thể tìm cách để có được toàn bộ bootloader.asm được đăng ở đâu đó. Chúng tôi không thực sự quan tâm đến việc sử dụng GRUB vì một vài lý do. Điều này có thể thay đổi, nhưng chúng tôi muốn thấy khởi động này thành công trước khi chúng tôi thực sự xem xét GRUB.
EDIT: Trình tải khởi động được giả sử là 512 byte, được ghi vào khu vực khởi động (khu vực đầu tiên) của đĩa. Lấy từ của tôi cho nó, bootloader là 512 byte được biên dịch. Hạt nhân được cho là nằm trong khu vực tiếp theo.
Tôi rất nghi ngờ rằng bạn thực sự có nghĩa là 'cp kernel.sys/dev/fd0', trong đó sẽ ghi đè lên các thiết bị đĩa mềm từ lúc bắt đầu. Ngay cả khi bạn không dán nó, bạn có thể mô tả nơi mà bộ tải khởi động của bạn được dự kiến sẽ tải hạt nhân vào bộ nhớ từ? – ephemient
Vâng, vâng đó thực sự là những gì tôi có ý nghĩa. Đó là ví dụ tôi đã được đưa ra để sao chép một tập tin vào thiết bị. Nó có nên khác không?Tôi rất mới với cách Linux - Tôi đã ở trong Windows từ 3.0. – IAbstract
'dd' của bạn viết một sector' bootloader.bin' vào phần đầu tiên của đĩa mềm. Sau đó, 'cp' copy' kernel.sys' của bạn trực tiếp vào đĩa mềm, ghi đè lên ... có lẽ bạn muốn 'dd seek = 1', để bắt đầu đặt' kernel.sys' ở phần thứ hai của đĩa mềm? Cần thêm chi tiết về bộ nạp khởi động của bạn để xác định xem đó có phải là thứ bạn muốn hay không. – ephemient