2010-03-28 27 views
5

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 512 byte được biên dịch. Hạt nhân được cho là nằm trong khu vực tiếp theo.

+1

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

+0

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

+1

'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

Trả lời

3

Nếu bạn muốn kernel.sys để bắt đầu ở khu vực thứ hai, hãy sử dụng tùy chọn này thay vì cp.

dd if=kernel.sys of=/dev/fd0 bs=512 seek=1 

Hoặc, giả sử bootloader.bin là chính xác 512 byte, công trình này quá:

cat bootloader.bin kernel.sys > /dev/fd0 
+0

bootloader.bin chính xác là 512 byte ... lệnh 'cat ...' có đặt bootloader.bin tại sector 0 (sector khởi động) không ??? – IAbstract

+0

Nó sẽ bắt đầu vào lúc bắt đầu của thiết bị thô (Linux thuận tiện và cho phép không chặn truy cập để chặn thiết bị) mà xảy ra là ngành 0. – ephemient

+0

Rõ ràng, đây là một vấn đề với văn bản để '/ dev/fd0'. Ngay cả với các mẫu bạn đã cung cấp, dường như tệp kernel.sys không được viết. Khi tôi tạo một ảnh đĩa mềm, nó trả về một tệp ảnh 1,4Mb; tuy nhiên, chỉ 512 byte đầu tiên thực sự được viết bằng bootstrap. Không có kernel.sys trên ảnh. – IAbstract

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