ос и у меня есть проблема, которую я пытаюсь решить последние часов 5:
есть крч 2 исходника с минимальным кодом (я хз насколько все верно в коде):
boot.asm (nasm)
use16
section .text
_start:
xor ax, ax
mov cs, ax
mov ds, ax
mov ss, ax
mov sp, 0x1000
extern kernel
call kernel
_end:
times 510-($-$$) db 0
db 0x55, 0xAA
и kernel.c
void kernel(void) {
while(1){}
}
ну и linker.ld с которым связана моя проблема (ну, мне так кажется):
ENTRY(_start)
SECTIONS
{
. = 0x7C00;
.text : {
*(.text)
}
/DISCARD/ : {
*(.eh_frame)
}
}
компилю и запускаю вот так:
nasm -f elf32 boot.asm -o boot.o
gcc -c -m32 -nostdlib -fno-pie -o kernel.o kernel.c
ld -T linker.ld -m i386pe -no-pie boot.o kernel.o -o test.bin
dd if=/dev/zero of=disk.img bs=1024 count=1440
dd if=test.bin of=disk.img conv=notrunc
qemu-system-i386 -fda disk.img -boot a
и пишет, что no bootable device.
когда чекаю дизасм
$ objdump -d test.bin
test.bin: формат файла pei-i386
Дизассемблирование раздела .text:
00007c00 <_start>:
7c00: b8 00 7c 8e c8 mov $0xc88e7c00,%eax
7c05: 8e d8 mov %eax,%ds
7c07: 31 c0 xor %eax,%eax
7c09: 8e d0 mov %eax,%ss
7c0b: bc 00 10 e8 ef mov $0xefe81000,%esp
7c10: 01 .byte 0x1
00007c11 <_end>:
...
7dfd: 00 55 aa add %dl,-0x56(%ebp)
00007e00 <kernel>:
7e00: 55 push %ebp
7e01: 89 e5 mov %esp,%ebp
7e03: eb fe jmp 7e03 <kernel+0x3>
здесь все вроде ок (хотя меня смущает отсутствие call в _start, но пока что пофиг), но когда я смотрю через hex editor у меня код фактически располагается по адресу 0x600 (или это че-то другое и я путаю?). Я на стак оверфлоу видел одного с вопросом, а зачем вообще нужен отступ 7C00 и типо qemu с нулевого тоже считывает. Я проверял, там создал простенький asm файл, где тупо hello world выводил и там все работало, линкер напрямую я не использовал, только nasm сразу в bin и в disk.img. Ну и получается вопрос весь в том, как тут сделать так, чтобы qemu увидела мой disk.img?
Стикер
долгий путь решения: пойти почитать хоть что-то, кроме туториалов(например теорию или офф спеки. тут в закрепах сылки есть) быстрый путь решения: собрать всë в шестнадцатибитном формате
спасибо, я пойду по долгому
да)
No bootable device потому что для загрузки тебе надо соблюдать формат загрузочного диска а у тебя там даже бутсектора нет, только бинарь ядра. Запускай через qemu -kernel если тебе только ядро нужно загрузить (это не загрузится, надо тоже соблюдать формат)
спасибо, сейчас пойду разбираться
быстрый путь не так быстр как кажется
по сравнению с забуриванием в осдев перевести шесть команд в байты пусть даже руками всё равно быстрее
писать всё в 16 битах так себе идея, имхо, лучше сразу нормально, в начале базовая настройка 16ти бит, функции перехода в 32 бит и обратно и нормальный 32ух битный код с периодическим переходом в рилмод когда надо, либо вообще юзать UEFI
Или вообще выкинуть все это и начать писать собственно саму ос
Сразу GRUB например использовать
или любой другой загрузчик
периодический переход в realmod - мсье знает толк в извращениях. Там довольно сложная процедура переключения. Разумнее загрузить ядро, и больше не возвращаться. +1 к предложению сразу делать в UEFI.
отдать работу загрузчика загрузчику, это не ос
Я не предлагаю возвращаться в рилмод в ядре, по крайней мере после инициализации
Полностью согласен
Обсуждают сегодня