Как выделить сегмент памяти, используя сервис BIOS? - PullRequest
0 голосов
/ 14 июня 2019

Я пытаюсь выделить свободный сегмент памяти, используя сервис INT 12h BIOS, но не смог. Как выделить свободные сегменты памяти с помощью INT 12h?

1 Ответ

3 голосов
/ 14 июня 2019

INT 12h

Это прерывание говорит вам, сколько памяти у компьютера ниже адреса 0A0000h.

Прерывание вернет число килобайт вAX.Это означает, что вы умножаете значение AX на 0x400, чтобы получить количество байтов памяти;или вы умножаете его на 0x40, чтобы получить количество сегментов.

Пример: если прерывание возвращает AX=0x1E0, ОЗУ заканчивается по адресу 0x7800:0 или 0x7000:0x8000 (оба сегментированных адреса представляют линейныйадрес 0x78000).

Я хочу найти свободные сегменты памяти для моего загрузчика ...

BIOS не выполняет управление памятью.ОС (например, MS-DOS) делает это!

Когда ваш загрузчик находится в памяти, ОС еще не загружена.

Это означает, что вы должны сами управлять памятью:Вся оперативная память компьютера «принадлежит» вашему загрузчику!

Самый простой способ - использовать фиксированные адреса в вашем загрузчике.Поскольку весь ОЗУ «принадлежит» загрузчику, вы можете решить, что какие-то данные всегда хранятся по адресу 0x2000: 0.Вам не нужно делать какое-то выделение.

Если вам действительно требуется динамическое выделение памяти, вам нужно написать функцию, которая выделяет память, сохраняя информацию о том, какая часть памяти не является "". Пока нет.

Особенно, если вам требуется функция для освобождения памяти, это довольно сложно!

... и в другом случае для приложения MS-DOS.

В этом случае управление памятью выполняется MS-DOS, а не BIOS.

Вам придется вызывать функции MS-DOS (а не функции BIOS) для выполненияуправление памятью.

... выделить свободный сегмент памяти с помощью службы INT 12h BIOS ...

Кстати:

ЗагрузкаЗагрузчик может изменить int 12h для возврата меньшего значения в регистр ax.При этом можно будет хранить данные в ОЗУ (например, для модифицированной подпрограммы обработки прерываний BIOS), которая не перезаписывается ОС.

Однако это будет работать, только если ОС проверяет ОЗУразмер с использованием int 12h.Если ОС предполагает, что размер оперативной памяти установлен на уровне 640 килобайт, или если она использует одну из более новых int 15h служб размера оперативной памяти, это не будет работать.

...