185 похожих чатов

Я часов 15 назад начал пытаться написать хоть что-то напоминающее

ос и у меня есть проблема, которую я пытаюсь решить последние часов 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?

17 ответов

41 просмотр

Стикер

долгий путь решения: пойти почитать хоть что-то, кроме туториалов(например теорию или офф спеки. тут в закрепах сылки есть) быстрый путь решения: собрать всë в шестнадцатибитном формате

Al1to- Автор вопроса
Al1to- Автор вопроса

да)

No bootable device потому что для загрузки тебе надо соблюдать формат загрузочного диска а у тебя там даже бутсектора нет, только бинарь ядра. Запускай через qemu -kernel если тебе только ядро нужно загрузить (это не загрузится, надо тоже соблюдать формат)

Al1to- Автор вопроса
disba1ancer
быстрый путь не так быстр как кажется

по сравнению с забуриванием в осдев перевести шесть команд в байты пусть даже руками всё равно быстрее

Vladimir Surikov
по сравнению с забуриванием в осдев перевести шест...

писать всё в 16 битах так себе идея, имхо, лучше сразу нормально, в начале базовая настройка 16ти бит, функции перехода в 32 бит и обратно и нормальный 32ух битный код с периодическим переходом в рилмод когда надо, либо вообще юзать UEFI

disba1ancer
писать всё в 16 битах так себе идея, имхо, лучше с...

Или вообще выкинуть все это и начать писать собственно саму ос

disba1ancer
эт как?

Сразу GRUB например использовать

One
Сразу GRUB например использовать

или любой другой загрузчик

disba1ancer
писать всё в 16 битах так себе идея, имхо, лучше с...

периодический переход в realmod - мсье знает толк в извращениях. Там довольно сложная процедура переключения. Разумнее загрузить ядро, и больше не возвращаться. +1 к предложению сразу делать в UEFI.

disba1ancer
эт как?

отдать работу загрузчика загрузчику, это не ос

Михаил Бахтерев
периодический переход в realmod - мсье знает толк ...

Я не предлагаю возвращаться в рилмод в ядре, по крайней мере после инициализации

Похожие вопросы

Обсуждают сегодня

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
Подскажите, а есть vault lite или ченить такое?) А то нужен вольт для похода в вольт, но весит он ~500 мб) как-то многовато для парочки запросов ))
Alexandr Orloff
17
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Карта сайта