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
служб размера оперативной памяти, это не будет работать.