2010-03-28 8 views
5

Мы работаем над проектом, чтобы узнать, как написать ядро ​​и узнать все входы и выходы. У нас загружен загрузочный загрузчик, и он работает. Однако у нас проблема с загрузкой ядра. Начну с первой части:Ошибка при загрузчике загрузчика и ядре

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 

    ;************************************************************************* 

bootloader.asm слишком долго для редактора, не вызывая его пыхтение и дросселем. Кроме того, загрузчик и ядро ​​работают в пределах bochs, так как мы получаем сообщение «Добро пожаловать в нашу ОС». Во всяком случае, следующее ядро ​​для ядра в данный момент.

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 

Использование NASM 2.06rc2 компилировать как таковой:
nasm bootloader.asm -o bootloader.bin -f bin
nasm kernel.asm -o kernel.sys -f bin

Мы пишем bootloader.bin на дискету как таковой:
dd if=bootloader.bin bs=512 count=1 of/dev/fd0

Мы пишем kernel.sys на дискету как таковой:
cp kernel.sys /dev/fd0

Как я уже говорил, это работает в Bochs. Но загрузка с дискеты мы получаем выход так:

Загрузка ядра Shell
...........
ОШИБКА: Нажмите клавишу для перезагрузки

Другие особенности: OpenSUSE 11.2, рабочий стол GNOME, AMD x64 Любая другая информация, которую я, возможно, пропустил, не стесняйтесь спрашивать. Я пытался получить все здесь, что было бы необходимо. Если мне нужно, я могу найти способ получить всю загрузку загрузчика. Мы не очень заинтересованы в использовании GRUB по нескольким причинам. Это может измениться, но мы хотим, чтобы эта загрузка была успешной, прежде чем мы действительно рассмотрим GRUB.

EDIT: Загрузочный загрузчик должен быть 512 байт, записанный в загрузочный сектор (самый первый сектор) диска. Поверьте мне на слово, загрузчик is Снято 512 байт. Ядро предполагается находиться в следующем секторе.

+1

Я очень сомневаюсь, что вы на самом деле означает 'ф kernel.sys/DEV/fd0', который будет перезаписывать дисководу от начала. Даже если вы не вставляете его, можете ли вы описать, откуда должен загружаться ваш загрузчик ядра? – ephemient

+0

Ну, да, это на самом деле то, что я имею в виду. Это пример, который мне был предоставлен для копирования файла на устройство. Разве это должно быть иначе?Я очень новичок в Linux - я был в Windows с 3.0. – IAbstract

+1

Ваш 'dd' записывает один сектор' bootloader.bin' в первый сектор дискеты. Затем ваш 'cp' копирует' kernel.sys' прямо на дискету, перезаписывая это ... возможно, вы хотите «dd seek = 1», чтобы начать размещение «kernel.sys» во втором секторе дискеты? Вам нужно больше узнать о загрузчике, чтобы определить, хотите ли вы этого. – ephemient

ответ

3

Если вы хотите, чтобы kernel.sys начинался со второго сектора, используйте его вместо cp.

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

Или, если предположить, bootloader.bin ровно 512 байт, это тоже работает:

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

bootloader.bin - это точно 512 байт ... будет ли команда 'cat ...' поместить bootloader.bin в сектор 0 (загрузочный сектор) ??? – IAbstract

+0

Он начнется с самого начала необработанного устройства (Linux удобен и позволяет неблокировать доступ к блочным устройствам), который действительно является сектором 0. – ephemient

+0

По-видимому, это проблема с записью на '/ dev/fd0'. Даже с предоставленными вами образцами, очевидно, файл kernel.sys не записывается. Когда я делаю образ дискеты, он возвращает файл изображения 1.4Mb; однако только первые 512 байт фактически записываются с помощью бутстрапа. На изображении отсутствует kernel.sys. – IAbstract

 Смежные вопросы

  • Нет связанных вопросов^_^