Neonbird Ответов: 1

Как скомпилировать ядро?


Я создал простое ядро c, которое печатает Hello world и другой объектный файл с помощью nasm. мой вопрос заключается в том, как скомпилировать ядро c с помощью gcc и после этого создать плоское двоичное ядро, связав оба объектных файла и поставив на адрес 0x7e12. Это должно быть 32-битное ядро. Я нахожусь на Lubuntu 14.04

Что я уже пробовал:

я видел некоторые образцы и устал от этого, но это не дает правильной вещи.

Compile.sh:
gcc -c kernel.c -o kernel.o
<br />nasm base.asm -f elf -o base.o
<br />ld -oformat=binary kernel.o base.o -Ttext=0x7e12


базы.АСМ:
[bits 32]
[extern _start]

call _start


ядра.с:
void start { char *v = (char*) 0xb8000; *v="M";}

1 Ответов

Рейтинг:
2

Jochen Arndt

Первым шагом является исправление сообщенных ошибок и предупреждений.

# gcc -c kernel.c
error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
Так и должно быть
void start() { char *v = (char*) 0xb8000; *v="M";}

Следующая попытка:
# gcc -c kernel.c
warning: assignment makes integer from pointer without a cast
Понять эту ошибку немного сложно. Он жалуется на *v="M" потому что "M" является указателем (на постоянную строку). Ваш код не будет работать так, как ожидалось. Вы должны использовать функцию, которая копирует строку или назначает каждый символ:
void start() 
{ 
    char *v = (char*)0xb8000; 
    v[0] = 'M';
    v[1] = '\0';
}

У меня есть в NASM нигде не установлен, так что я не могу его проверить.

Что касается связывания, прочтите документацию. То -T опция требует, чтобы за ней следовал файл сценария.