Ну, начнем с исторических функций. Давным-давно, когда даже Билл Гейтс говорил что 640 килобайт хватит всем, но не у всех были эти 640 килобайт. :) в биосах существовала функция определения количества базовой памяти.
int 12h
Выходные параметры:
ax - размер базовой памяти в килобайтах.
Сейчас уже вряд ли кому придет в голову, что базовой памяти может быть меньше 640 килобайт. но мало ли... ;)
Появлялись новые процессоры, и размеры памяти стали расти. в связи с чем появилась функция определения количества расширенной памяти.
int 15h fn 88h
Входные параметры:
ah = 88h
Выходные параметры:
ax - размер расширенной памяти в килобайтах.
Возможно из за архитектуры 286-х процессоров (которым размер шины адреса не позволяет иметь больше чем 16 мегабайт памяти) эта функция часто имеет аналогичное ограничение и результат в ax не может превышать 3с00h (Что составляет 15Мб).
Но, опять таки, появились новые процессоры. 16 мегабайт стало мало. Вследствие этого появилась еще одна функция BIOS:
int 15h fn e801h
Входные параметры:
ax = e801h.
Выходные параметры:
ax - размер расширенной памяти в килобайтах до 16Mb;
bx - размер расширенной памяти в блоках по 64к свыше 16Мб;
cx - размер сконфигурированный расширенной памяти в килобайтах до 16Mb;
dx - размер сконфигурированной расширенной памяти в блоках по 64к свыше 16Мб.
Не знаю, что означает сконфигурированная память. Так написано в описании.
Здесь производители BIOS видимо оказались неединодушны. Некоторые версии в ax и bx возвращают 0, это значит что размер памяти следует определять из cx, dx.
Но видимо и 4 гигабайт оказалось мало. В новых BIOS появилась еще одна функция.
int 15h fn e820h
Входные параметры:
eax = e820h;
edx = 534d4150h ('SMAP');
ebx - смещение от начала карты памяти;
eсx - Размер буфера;
es:di - Адрес буфера для размещения карты памяти.
Выходные параметры:
eax - 534d4150h ('SMAP');
ebx - следующее смещение от начала карты памяти, если = 0, то вся карта передана;
ecx - Количество возвращенных байт;
буфер заполнен информацией;
Эту функцию нужно вызывать в цикле до тех пор, пока не будет прочитана вся карта памяти.
Формат структуры таков:
struct { long long base; long long length; long type; };
Поле type может содержать следующие значения:
1 - Доступно для использования операционной системой;
2 - Зарезервировано (например, ROM);
3 - ACPI reclaim memory (Доступно для операционной системы после прочтения таблицы ACPI;
4 - ACPI NVS memory (Операционной системе требуется сохранять эту память между NVS сессиями).
Проверить как работает эта функция у меня не получилось, мой BIOS ее не поддерживает. :( Но в заключение скажу следующее. Все функции в случае ошибки (если функция не поддерживается) возвращают установленный флаг cf. В случае отсутствия новых функций необходимо обращаться к более старым.
Функции BIOS не работают в защищенном режиме, поэтому все эти операции необходимо производить еще до перехода в защищенный режим.