Для эмуляции я использую
Bochs. Настройки памяти там у меня стоят следующие:
То есть я использую 32 МБ памяти ОЗУ. Не знаю для чего там другие 32 МБ. Вызываю функцию девять раз. Картина следующая:
Если перевести всё в адреса, то получаются такие вот участки:
1.
0x00000000 -
0x0009EFFF. Можно использовать в ОС. Размер 651264 байта (636 КБ).
2.
0x0009F000 -
0x0009FFFF. Нельзя использовать в ОС. Размер 4096 байт (4 КБ).
3.
0x000E8000 -
0x000FFFFF. Нельзя использовать в ОС. Размер 98304 байта (96 КБ).
4.
0x00100000 -
0x01FEFFFF. Можно использовать в ОС. Размер 32440320 байт (31680 КБ).
5.
0x01FF0000 -
0x01FFFFFF. Нельзя использовать в ОС. Размер 65536 байт (64 КБ).
6.
0xFFFC0000 -
0xFFFFFFFF. Нельзя использовать в ОС. Размер 262144 байта (256 КБ).
Доступная память составляет 33091584 байта (651264 байта + 32440320 байт), то есть 32316 КБ (что практически является 31.5 МБ).
Не доступная память составляет 430080 байт (4096 байт + 98304 байта + 65536 байт + 262144 байта), то есть 420 КБ.
То есть всего у нас 33521664 байта (33091584 байта + 430080 байт), то есть 32736 КБ (практически 31.9 МБ).
Хорошо, большая часть мне доступна для использования. А вот адрес видеоадаптера
0x0000B800 лежит в пределах от
0x00000000 до
0x0009EFFF. Так что же это получается? Это ведь ОЗУ, а не видеопамять, спроецированная на адресную память.
Или я чего-то не понимаю? Может в реальном режиме (
R-Mode) адрес
0x0000B800 и будет началом видеобуфера, а в защищённом режиме (
P-Mode) это будет память ОЗУ. То есть придётся вывод на экран обрабатывать через порты.
В общем, я запутался. Подскажите мне истину во всём этом. Я ведь ОЗУ же определял, причём тут видеопамять.