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

Что из всего этого следует?


В своей работе мы не будем ориентироваться на процессор i286, поскольку 16-битная архитектура и отсутствие механизма страничного преобразования сильно усложняет программирование операционной системы. К тому же, таких процессоров давно уже никто не использует. :)

Ориентироваться мы будем на i386 или более старшие модели процессоров, вплоть до последних.

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

Программа или процесс состоит из следующих частей:

  • Сегмент кода. Может только выполняться, сама программа его не прочитать, не переписать не может! Использовать для этого сегмента swap не нужно, при необходимости код считывается прямо из файла;
  • Сегмент данных состоит из трех частей:
    • Константные данные, их тоже можно загружать из файла, так как они не меняются при работе программы;
    • Инициализированные данные. Участвует в процессе свопинга;
    • Не инициализированные данные. Так же участвует в свопинге;

  • Сегмент стека. Так же участвует в свопинге.
  • Но, обычно, системы делят сегмент данных на две части: инициализированные данные и не инициализированные данные.

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

    Очень интересный момент:
    При выполнении программы операционная система делает следующие действия:

  • Готовит для программы локальную таблицу дескрипторов;
  • Готовит для программы каталог страниц, все страницы помечаются как не присутствующие в памяти.
  • Все.
  • При передаче управления этой программе процессор генерирует исключение по отсутствию страницы, в котором нужная страница загружается из файла или инициализируется.

    Еще один интересный момент:
    Когда в системе загружается две или более одинаковых программы - нет необходимости для каждой из них выделять место для кодового сегмента, они спокойно могут использовать один код на всех.



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