немного сумбурно, но уж простите, сегодня меня рано разбудили по очень дрянному вопросу 8(
одним из главнейших вопросов ОС которые обязательно необходимо решить, является работа с памятью.
Немного об использовании памяти системы.
Понятно, что на данный момент физическая память современных компов адресуется
непрерывно(хотя и дырки в физическом адресном пространстве бывают).
Принятую плоскую модель памяти для пользовательских процессов использовать не стоит
по ряду причин:
1) это ограничивает максимальный доступный размер памяти максимально адресуемой величиной,
чего, вроде, достаточно для 32 разрядных процов, но, например, уже для 16разрядных
не хватает.
2) сложнее изолировать области памяти (необходимо использовать достаточно нетривиальные
методы защиты памяти, поддерживаемые процессорами, которые, кроме всего прочего, сильно
привязаны к конкретным семействам процессоров, а значит сложнее портировать).
3) сложнее отслеживать переполнение буферов, порчу собственного кода, перехлестывание
стеков и т.п. вещи.
4) жесткая фиксация адресного пространства за типом ЗУ, что тоже не очень удачно на
мой взгляд.
5) жесткая привязка к адресам в памяти (сложности с обеспечением страничной подкачки и т.п.)
В любом случае, необходимо поддерживать динамическую память (HEAP), причем сразу.
Я предлагаю использовать модель памяти по типу сегментной, точнее, механизма, аналогичного селекторам, которые поддерживает ix86 архитектура. А именно, любой адрес в памяти ОС представлять парой чисел: id:disp - идентификатор блока и смещение внутри него. Такой подход позволяет адресовать, например, на 16 битном процессоре 2^32 ячеек памяти. Кроме того, достаточно просто организуется изоляция адресных пространств, подкачка отдельных слов (сваппирование).
id - позволяет адресовать не только ОЗУ, но и файлы, например, и любые другие устройства хранения данных и даже каналы их передачи.
при условии определения каждому слову собственного блока памяти адресация вызовов будет производиться только по id блока памяти, а адресация переходов внутри по смещению относительно начала блока, что дает уменьшение литеральных
значений вызовов и переходов в два раза. Так же достаточно легко ограничивать доступ за пределы адресуемой блоком памяти. При перемещении по реальному адресному пространству не приводит к смещению адресов, позволяет достаточно
легко организовывать подкачку отдельных блоков. Ограничение адресации так же позволяет отказаться от сложных, сильно связанных с процессорной архитектурой методик защиты ядра от пользовательских процессов, легкое быстрое переключение контекста, возможность выполнения кода на нескольких процессорах, качественное повторное использование кода, легкое отслеживание утечек памяти, интересный и простой механизм синхронизации пользовательских процессов (выдача одного блока общающимся между собой процессам).
|