Сборка: не выполняются команды после подписи загрузки - PullRequest
1 голос
/ 09 января 2020

Загрузочный сектор моей операционной системы буквально достиг 512 байт, и мне не хватает места для моих кодов. Я написал код после загрузки подписи, но они не работали. Я положил код для выключения, но он не работал. Почему коды после загрузочной подписи не работают?

Код:

BITS 16

disk_buffer equ 24576

mov sp, 4096d
mov ax, 7c0h
mov ds, ax

mov ah, 09h
mov cx, 1000h
mov al, 20h
mov bl, 17h
int 10h

jmp shutdown

;codes that off the point

times 510 - ($ - $$) db 0
dw 0xaa55

shutdown:
mov ax, 5307h
mov cx, 3
mov bx, 1
int 15h

times 1474560 - ($ - $$) db 0

1 Ответ

2 голосов
/ 10 января 2020

Вы должны использовать эти 512 байт для загрузки остальной части вашего кода. Это его цель, отсюда и название «загрузочная запись».

Если вы пишете код своей операционной системы в MBR, вы делаете это не в том месте. То, как это делают большинство операционных систем, происходит в три (или более) этапа. Во-первых, ваш код MBR загружает простой загрузчик с диска в оперативную память. Затем код MBR переходит в то место, куда он загрузил загрузчик, и начинает выполнение загрузчика. загрузчик выполняет некоторую инициализацию системы, затем загружает в память загрузчик второго уровня или операционную систему и затем переходит в эту память, чтобы начать загрузку операционной системы.

из osdev wiki

MBR загружается B IOS по физическому адресу 0x7c00, с DL, установленным на "номер диска", с которого MBR был загружен. Затем B IOS переходит к самому началу загруженной MBR (0x7c00), потому что эта часть MBR содержит исполняемый код "bootstrap".

Типичный код MBR bootstrap сделает следующее:

- переместить себя от физического адреса 0x7c00 (используя копию памяти и, как правило, дальний переход)

- определить, с какого раздела (или жесткого диска) загружаться (либо путем поиск активного раздела или предоставление пользователю выбора из установленных операционных систем на выбор)

- если пользователь выбрал «неактивный» раздел, затем установите для выбранной записи раздела «активный», и очистите «активные» биты других записей раздела

- используйте команды B IOS INT 13h для перезаписи MBR, если записи таблицы разделов были изменены

- используйте B IOS INT 13-часовые команды для загрузки загрузочной записи тома (VBR, «загрузочный сектор» загрузчика) с начала выбранного раздела

на физический адрес 0x7c00

-s et DS: SI, указывающая на выбранную запись таблицы разделов

- скачок до 0x7c00 (с CS, установленным на 0, и DL, установленным на "номер диска")

Примечание: он предназначен для значение DL и указатель DS: SI, который должен быть полностью передан в ядро ​​для использования ядром. Это также означает, что перемещенная MBR не должна перезаписываться во время процесса загрузки - поскольку указатель DS: SI предназначен для записи таблицы разделов внутри этой MBR и должен оставаться действительным.

...