За поддержку спасибо.
Предлагаю обсудить распределение памяти внутри ядра.
Сейчас карта памяти содержит много дыр. Можно часть переменных из диапазона 0x0000 - 0xFFFF объявить в коде ядра через uglobal и постепенно отказаться от размещения переменных по непосредственным адресам. Всем найденым переменным я дал имена в верхнем регистре. Эти имена предварительные, их можно обсудить и изменить. Сейчас код выглядит так
Code:
const.inc
MOUSE_X equ 0x0100FB0A
MOUSE_Y equ 0x0100FB0C
m_ps2.inc
add AX,[MOUSE_X] ;[XCoordinate]
cmp AX,0
jge @@M1
mov AX,0
Теперь по распеределению памяти.
В диапазоне 0x0000-0xFFFF можно сохранить таблицу прерываний реального режима и область данных БИОС Выше поместить IDT и GDT. IDT занимает максимум 2 кб для GDT можно зарезервировать место на 1024 селекторов оставшееся место использовать для загрузки/перезагрузки ядра. Для кода ядра можно зарезервировать 256-384 кб и разместить в диапазоне 0x40000 - 0x9FFFF оставшуюся память использовать для работы со старыми ДМА.
Все остальные данные из первого мб памяти перенести выше 1 мб. LFB будет отображаться непосредственно на адреса видеопамяти поэтому все данные с адресов 0xC00000-0xFFFFFF можно сдвинуть вниз на адреса 0x800000-0xBFFFFF.
После перехода к страничной адресации эти физические адреса памяти будут отображены на диапазон линейных 0x80400000 и выше, а приложения будут использовать адреса 0x0000 - 0x7FFFFFFF. Базовые адреса всех дескрипторов будут выставлены в 0x0000 - получится "простая плоская модель памяти".