Создание операционной системы на ассемблере

         

Определение размера памяти другими способами:


Помимо функций BIOS есть еще много других способов.

Самый простой - помереть память самому. :) Делается это из защищенного режима, страничное преобразование должно быть выключено, адресная линия A20 должна быть включена.
Можно мереть от нуля, но поскольку в первом мегабайте есть дыры (видеопамять, биосы, просто дыры), удобнее делать это начиная с первого мегабайта.

Вовсе не обязательно проверять каждый байт, достаточно проверять один байт на какое-то определенное количество памяти. Определенным количеством памяти можно посчитать мегабайт, но лучше (хотя и медленнее) за единицу памяти принять одну страницу памяти (4к).

Во избежание неприятностей память лучше не разрушать, а восстанавливать в первоначальном виде. делается это примерно так:

xchg [ebx], eax
xchg [ebx], eax

Если после этого в eax содержится то же значение, которое было до того, значит память присутствует по данному адресу. Если возвратилось 0ffffffffh, значит память отсутствует, если же что ни будь другое - то это может быть ROM, хотя после мегабайта вы вряд ли встретите какой либо BIOS. В любом случае если память по текущему адресу не обнаружена, значит, память закончилась и дальше искать чревато... существуют еще различные типы памяти (ACPI например) которую не стоит трогать.

Из защищенного режима можно воспользоваться содержимым CMOS, некоторые ячейки в нем BIOS заполняет определенными при начальном тесте системы значениями. Но здесь все не так однозначно как хотелось бы. Разные версии BIOS могут хранить значения в разных местах.

  • 15h - Базовая память в килобайтах (младший байт) (IBM);
  • 16h - Базовая память в килобайтах (старший байт) (IBM);
  • 17h - Расширенная память в килобайтах (младший байт) (IBM);
  • 18h - Расширенная память в килобайтах (старший байт) (IBM);
  • 30h - Расширенная память в килобайтах (младший байт) (IBM);
  • 31h - Расширенная память в килобайтах (старший байт) (IBM);
  • 34h - Расширенная память более 16Мб (блоками по 64к) (младший байт) (AMI);
  • 35h - Расширенная память более 16Мб (блоками по 64к) (старший байт) (AMI);
  • 35h - Расширенная память (блоками по 64к) (младший байт) (AMI WinBIOS);
  • 36h - Расширенная память (блоками по 64к) (старший байт) (AMI WinBIOS);
  • Байты 30-31 принято считать стандартными, но они определяют только 64Мб памяти. Не очень то подходят для использования.



    Содержание раздела