Как следует инициализировать стек в загрузчике реального режима x86, чтобы избежать конфликтов с B IOS? - PullRequest
4 голосов
/ 19 апреля 2020

Предположим, я хочу инициализировать стек размером S байтов.

Я бы хотел выбрать базовую позицию стека B, чтобы при увеличении стека от B Я не перезаписываю какой-либо код или другую память, используемую загрузчиком или B IOS.

Поскольку я сам пишу загрузчик (а начальный сектор MBR загружается по линейному адресу 0x7c00) предотвращение конфликтов с загрузчиком кажется вопросом тщательного планирования.

Как узнать, где находится код B IOS, и может ли мой стек перезаписывать любую используемую память по B IOS?

Кроме того, есть ли какая-либо гарантия относительно того, куда указывает начальный ss:sp, и сколько места в стеке я могу безопасно использовать, не задавая новое значение?

1 Ответ

3 голосов
/ 19 апреля 2020

Обычно загрузчик устанавливает ss: sp в 00000h: 07c00h :. Я выполнил поиск в Интернете, и, видимо, значение ss: sp, установленное, когда B IOS переходит на загрузчик, зависит от B IOS. В случае Microsoft MBR загрузчик устанавливает ss: sp в 00000h: 07c00h и передает большую часть своего кода в 00000h: 00600h, а также переходит в 00000h: 006xxh. Это, в свою очередь, смотрит на таблицу разделов, чтобы найти загрузочный сектор, и повторяет процесс, загружает и переходит к 00000h: 07c00h. Это может повториться еще раз. В конечном итоге процесс загрузки загрузит несколько секторов и начнет фактическую загрузку операционной системы Microsoft. Я не знаю последовательность для операционных систем типа Linux.

...