Dynami c Распределение памяти в реальном режиме операционной системы - PullRequest
1 голос
/ 19 января 2020

Я создаю ОС реального режима как хобби-проект. Как мой первый проект ОС, я хотел начать с самого начала и поэтому решил построить операционную систему реального режима. Сказав это, я не слежу ни за какой ОС в частности, но у меня есть идеи из многих источников. Я думаю, что больше Real Mode - это своего рода режим с нуля, где, учитывая аппаратное обеспечение, программное обеспечение может быть чем угодно с минимальным вмешательством процессора.

Приступая к проблеме, я создаю системный вызов типа alloc(), который пользовательские программы могут вызывать, когда им нужно больше памяти. Я понимаю, что brk() подобный системный вызов будет проще реализовать, но в любом случае будет malloc().

Пользовательская программа в этой ОС будет простым COM-файлом без заголовка и со статически распределенными данными и кодом вместе. Однако динамически выделенная память будет находиться после сегментов кода и стека.

enter image description here

A, AE, B, BE, C, CE - это адреса в модели памяти. Обратите внимание, что такое расположение памяти необходимо для соответствия модели памяти SMALL (поскольку большинство компиляторов допускают такую ​​модель).

Теперь, когда есть некоторый контекст, я планирую реализовать динамическое выделение памяти с помощью таблица вида ниже. enter image description here

Столбец ' Смещение ' является началом выделенной памяти после 'C 'адрес . Когда запрашивается больше памяти, ОС выделяет память либо

  • Найти один или несколько последовательных достаточно больших блоков из таблицы, которая в данный момент свободна, либо
  • Выделить больше памяти в месте 'Offset + Размер 'последней записи в таблице.

Следовательно, системный вызов free() по завершении освободит один или несколько блоков.

Мой вопрос:

  1. Возможна ли такая модель динамического распределения памяти c? И почему такая модель не используется?
  2. Если такие системные вызовы alloc и free лучше использовать в библиотеке, чем в качестве системного вызова?

1 Ответ

1 голос
/ 19 января 2020

Возможна ли такая модель динамического распределения памяти c? И почему такая модель не используется?

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

Если такие системные вызовы alloc и free лучше выполнять в библиотеке, чем в как системный вызов?

Дело вкуса, но, поскольку распределение памяти настолько фундаментально, оно считает, что оно больше всего принадлежит ядру. Тогда, возможно, системный вызов с использованием инструкции int ...

Смещение, Размер, Состояние и Блоки.

Это то, что вы выбрали для размещения в своей таблице размещения. , Все, что вы вставили, также должно быть обновлено. Это лишняя работа, когда есть избыточная информация. Вы можете удалить информацию Size , потому что вы можете получить ее путем вычитания двух соседних указателей.
Вы также можете обойтись без информации Blocks , потому что она всегда будет 1 , если free() немедленно объединяется, когда блоки FREE объединяются.

CE+0,   USED     ; Size is 7 == (CE+7) - (CE+0)
CE+7,   USED     ; Size is 10 == (CE+17) - (CE+7)
CE+17,  FREE     ; Size is 110 == (CE+127) - (CE+17)
CE+127, USED     ; Size is 40 == (CE+167) - (CE+127)
CE+167, EOL      ; TotalRowsCount = 5

Новое распределение 105 байтов:

CE+0,   USED     ; Size is 7 == (CE+7) - (CE+0)
CE+7,   USED     ; Size is 10 == (CE+17) - (CE+7)
CE+17,  USED     ; Size is 105 == (CE+122) - (CE+17)
CE+122, FREE     ; Size is 5 == (CE+127) - (CE+122)
CE+127, USED     ; Size is 40 == (CE+167) - (CE+127)
CE+167, EOL      ; TotalRowsCount = 6

Свободное распределение 40 байтов:

CE+0,   USED     ; Size is 7 == (CE+7) - (CE+0)
CE+7,   USED     ; Size is 10 == (CE+17) - (CE+7)
CE+17,  USED     ; Size is 105 == (CE+122) - (CE+17)
CE+122, FREE     ; Size is 45 == (CE+167) - (CE+122)
CE+167, EOL      ; TotalRowsCount = 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...