Я изучаю разработку ядра. Для разработки двоичного кода ядра я использую следующие команды. Однако все было хорошо, пока не был включен последний файл C (paging.o). Хотя я много раз проверял C-код paging.c, он выдает исключения (недопустимое прерывание кода операции 6). Я сомневаюсь, что в моем скрипте компиляции могут быть какие-то ошибки. Пожалуйста помоги. Я работаю на машине с Windows 7, использую MinGW и Bochs.

nasm bootsec.asm -f bin -o bootsec.bin
nasm kernel_entry.asm -f elf -o kernel_entry.o
nasm empty.asm -f bin -o empty.bin
gcc -ffreestanding -c main.c -o main.o
gcc -ffreestanding -c port_in_out.c -o port_in_out.o
gcc -ffreestanding -c mem.c -o mem.o
gcc -ffreestanding -c screen.c -o screen.o
gcc -ffreestanding -c isr.c -o isr.o
gcc -ffreestanding -c timer.c -o timer.o
gcc -ffreestanding -c paging.c -o paging.o
ld -T NUL -o kernel.tmp -Ttext 0x1000 kernel_entry.o main.o mem.o port_in_out.o screen.o isr.o timer.o paging.o
objcopy -O binary -j .text kernel.tmp kernel.bin
copy /b bootsec.bin+kernel.bin+empty.bin os-image.img 
0
user2972185 23 Авг 2014 в 03:48

2 ответа

Лучший ответ

Все было нормально ни с кодом, ни с компиляцией скрипта. Проблема была во мне. Мой bootsec.bin ошибочно загружает в память только 15 секторов записи ядра. Но при добавлении paging.o запись в моем ядре становится 29 секторов.

0
user2972185 24 Авг 2014 в 21:46

Очевидно, в вашем вопросе отсутствует информация. Вы должны предоставить источники для своего кода и для сценария компоновщика "NUL".

Я предлагаю вам использовать "objdump -D out.elf", чтобы проверить окончательный файл elf и убедиться, что его содержимое вменяемое.

Единственная очевидная вещь в вашем сценарии компиляции, которая кажется странной, - это «-j .text», который вы передаете в objcopy. Это указывает objcopy копировать только разделы ".text" из ваших объектных файлов. Вы уверены, что хотите сделать это для файлов ".c"? Большинство файлов «.c» компилируются в объектный файл с «.data», «.text» и «.bss», если вы действительно не очень осторожны в своем «.c» файле.

Вы должны контролировать, какие разделы следует отбрасывать, а какие оставаться в конечном файле elf, через скрипт компоновщика, а не через objcopy!

Если вы точно знаете, что вашему paging.c, например, не понадобятся разделы ".data" и ".bss", тогда:

Вы уверены, что код в paging.c правильный? Я предполагаю, что этот файл управляет MMU, и есть очень хороший шанс, что вы включите MMU в этом файле. Если вы включили MMU, ЦП сразу же увидит совершенно другое представление о памяти (на самом деле, после нескольких инструкций, это зависит от глубины вашего конвейера). Если это произойдет, вам необходимо убедиться, что местоположение, из которого выполняется ЦП, содержит допустимый код (обычно путем двойного сопоставления ядра). Если вы этого не сделаете, ваш процессор может начать выполнять мусор и, следовательно, недопустимую операцию, которую вы видите.

0
KarimRaslan 23 Авг 2014 в 20:26