У меня нет прямого ответа на вопрос, откуда возникла ваша ошибка. Тем не менее, я вижу, что многие вещи идут не так, поэтому я напишу их здесь:
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. Учебник содержит рабочий код.