Как правильно создать ядро ​​на C и ссылку на загрузчик - PullRequest
2 голосов
/ 21 марта 2019

У меня есть простой загрузчик в сборке здесь:

;initialization type stuff
[bits 16]
[org 0x7c00]

;make message and print it
mov si, MESSAGE
call print

;infinite loop to stall
jmp $

;print "method"
print:
    pusha
    print_loop:
        mov al, [si]
        cmp al, 0
        jne print_char
        popa
        ret
    print_char:
        mov ah, 0x0e
        int 0x10
        add si, 1
        jmp print_loop

;actual assigning of message
MESSAGE: db "Hello World!", 0

;padding & magic number (end)
times 510-($-$$) db 0
dw 0xaa55

И моя цель - запрограммировать большую часть ОС на C, и в данный момент я пытаюсь правильно связать загрузчик и ядро ​​на C:

void kernel_main()
{
    printf("Hello World!");
}

Как бы я связал их вместе и скомпилировал в нечто, что я могу открыть в qemu / на любом обычном компьютере?

1 Ответ

3 голосов
/ 22 марта 2019

Как правильно создать ядро ​​на C и ссылку на загрузчик

Не.

ОС обычно представляет собой множество отдельных исполняемых файлов (загрузчик, ядро, графический интерфейс пользователя, текстовый редактор, веб-браузер и т. Д.), Которые не связаны друг с другом в один массивный файл, который выполняет все (например, «Ubuntu.exe») .

Для загрузчиков 80x86; в общем случае вы можете иметь:

  • загрузчик для BIOS, предназначенный для неразмеченных устройств хранения (например, древняя дискета)
  • загрузчик для BIOS, предназначенный для устройств хранения с разделом MBR
  • загрузчик для BIOS, предназначенный для устройств хранения с «GPT-разделами»
  • загрузчик для BIOS, предназначенный для загрузочных компакт-дисков («El Torito не требует эмуляции»)
  • загрузчик для BIOS, предназначенный для PXE / сетевой загрузки
  • загрузчик, разработанный UEFI (и скомпилированный для 32-битной версии)
  • загрузчик, разработанный UEFI (и скомпилированный для 64-битной версии)

Каждая из этих вещей включает в себя совершенно другой код (форматы файлов загрузчика, ограничения встроенного ПО, API встроенного ПО, откуда взять ядро ​​и т. Д.).

Вы хотите убедиться, что любой из ваших загрузчиков может работать с тем же ядром (и убедиться, что один конкретный загрузчик, который может быть неправильным, не был встроен / связан с ядром).

Не забывайте, что (в конце концов, не на ранней стадии разработки) конечные пользователи скачивают / получают что-то вроде "установщика ОС"; и «установщик ОС» определяет правильный загрузчик для установки с ОС (вероятно, после того, как пользователь спросил, если / где / как он хочет установить ОС, и после обнаружения различной информации о компьютере, на котором устанавливается ОС - какой тип процессора, какой тип прошивки, какой тип схемы разбиения, ...). Вы не можете знать, какой загрузчик является правильным загрузчиком, пока «установщик ОС» не проделал большую работу (и не может знать, какой загрузчик является правильным загрузчиком при сборке проекта).

...