От загрузочного сектора к ядру C ++ - PullRequest
3 голосов
/ 13 января 2011

Я решил написать простой загрузчик asm и ядро ​​c ++.Я прочитал много учебных пособий, но я не могу скомпилировать файл сборки, выглядит так:

[BITS 32]
[global start]
[extern _k_main]
start:
   call _k_main
   cli
   hlt

(я хотел бы вызвать функцию k_main из файла c)

Компилировать / собрать /ошибки компоновки:

nasm -f bin -o kernelstart.asm -o kernelstart.bin:
error: bin file cannot contain external references

хорошо, тогда я попытался создать файл .o:

nasm -f aout -o kernelstart.asm -o kernelstart.o  (That's right)
ld -i -e _main -Ttext 0x1000 kernel.o kernelstart.o main.o
error: File format not recognized

Кто-нибудь, дайте мне PLZ рабочий пример или скажите, как его скомпилировать.: / (Я просматриваю учебные пособия и справки 2 дня назад, но не могу найти правильный ответ)

1 Ответ

3 голосов
/ 14 января 2011

У меня нет прямого ответа на вопрос, откуда возникла ваша ошибка. Тем не менее, я вижу, что многие вещи идут не так, поэтому я напишу их здесь:

NASM

nasm -f aout -o kernelstart.asm -o kernelstart

Это вообще работает? Это должно быть что-то вроде

nasm -f aout -o kernelstart kernelstart.asm

LD

ld -i -e _main -Ttext 0x1000 kernel.o kernelstart.o main.o

Поскольку вы сказали, что хотите создать загрузчик и ядро, я предполагаю, что ваша цель здесь состоит в том, чтобы ld вывести что-то, что можно поместить в MBR. Если это так, вот некоторые вещи, которые следует иметь в виду:

  • Вы не указали формат вывода. Если вы хотите создать образ MBR, добавьте --oformat=binary к параметрам командной строки. Это гарантирует, что плоский двоичный файл генерируется.
  • Вы установили точку входа на _main. Я не уверен, где определен этот символ, но я думаю, вы хотите, чтобы ваша точка входа была start, потому что именно там вы называете свое ядро.
  • Вы связываете свой раздел text, начиная с 0x1000. Если вы хотите поместить свой образ в MBR для загрузки BIOS, он должен быть связан по адресу 0x7c00.
  • В качестве примечания: похоже, вы пытаетесь связать ваш загрузчик и ядро ​​вместе в одном образе. Просто помните, что MBR может содержать только 512 байт (ну, на самом деле, 510 байт, поскольку последние 2 должны содержать магическое значение), поэтому вы не сможете написать большую часть ядра там. Что вам нужно сделать, это создать отдельный образ ядра и загрузить его из загрузчика.

Я надеюсь, что эти пункты помогут вам в решении вашей проблемы.

Также вы найдете много полезной информации как OSDev . Здесь - руководство по написанию «ядра» реального режима, в котором используется только MBR. Учебник содержит рабочий код.

...