SII писал(а):
кстати, она не сообщает и о памяти ниже 1 Мбайта -- там действует способ определения имеющегося объёма
Сообщает, но можно отсечь этот блок и пользоваться по старинке int 12h.
KIV писал(а):
P.S. Если размер буфера для карты памяти 3064 байт, то этого же хватит в любом случае? (Просто в начальном загрузчике удобно выделить именно этот размер)
Ты можешь сохранять информацию о блоках памяти в более компактных структурах, причем сразу отбрасывать блоки неподходящего типа. Например, не сохранять тип, а сохранять только базу/размер. Моя система к примеру не работает с физ. адресами выше 4 гиг, поэтому я сохраняю только 32-разрядные значения. Ядро запускается в реальном режиме и по началу имеет такие же ограничения в памяти, что и начальный загрузчик; я структуры блоков вместе с др. параметрами сохраняю в стеке под адресом 0x8000, т.е. для их хранения доступно примерно 30 Кб (в начале физ адр. пространства не должны разрушаться IVT, BDA плюс еще один блок для передачи параметров переменной, но не очень большой длины). В добавок использую константу MAXMEMREGIONS (обычно устанавливается равной 40), определяющую максимальное количество блоков, информацию о которых можно сохранить, т.е. обычно массив структур занимает в стеке не более 8*40=320 байт.
Что касается основного вопроса топика, то обычно память после первого мега идет непрерывно. Фрагментация обычно присутствует под границей 4 гига (там иногда встречаются куски свободной памяти по несколько килобайт, конечно если у тебя изначально установлено не менее 3-4 гиг), на старых компьютерах иногда встречается разрыв под границей 16 мег. Я вообще придерживаюсь правила считать всю память выше первого мега фрагментированной, поэтому сначала формирую непрерывный участок вирт. адр. пространства, а потом уже что-то перемещаю/загружаю в него.