Должен ли распределитель памяти основываться на системном вызове? - PullRequest
1 голос
/ 17 января 2012

Мой вопрос не ограничивается существующей системой. Что необходимо сделать при распределении памяти?Я слышал диспетчер памяти lmm (диспетчер памяти на основе списка) и не смог найти системные вызовы.

Ответы [ 2 ]

2 голосов
/ 17 января 2012

Если требования к памяти приложения или драйвера не известны заранее (до начала их выполнения), этот драйвер или приложение обычно должны так или иначе запрашивать память у ОС / ядра.

Системные вызовыодин из таких способов сделать запросы выделения памяти.Часто системный вызов вызывается с помощью специальной инструкции CPU (например, int, syscall, sysenter на процессоре x86).

Но могут быть дополнительные способы вызова в ОС /ядро запрашивает память, либо другие инструкции или события, которые может инициировать приложение / драйвер, что заставит ЦП упреждать выполнение приложения / драйвера и передавать управление в ОС / ядро.Сбои страниц, возникающие при попытке доступа к области памяти, которая либо защищена, либо не поддерживается физической памятью, может быть другой.Например, приложение может иметь свое собственное виртуальное адресное пространство и всякий раз, когда оно пытается читать или записывать из / в память, которой не выделена физическая память, ЦПУ переключает выполнение из приложения в ядро, которое выделяет память, а затем процессор переключается обратно.Это еще один способ, который не обязательно связан с какими-либо системными вызовами.

Конечно, если нет ОС или нет служб управления памятью, и в каждый момент времени работает только одно приложение, и оно имеет доступ ко всем ресурсам компьютера.(это более или менее то, что вы имели в DOS), он может управлять самой памятью, и в этом случае системные вызовы не нужны.

Что касается остальной части what must be done when allocating memory, это зависит от ОС(если есть) и процессор.Например, может потребоваться отобразить физические страницы памяти в виртуальное адресное пространство.И вообще, все адресное пространство должно быть как-то разделено на выделенные блоки памяти.Диспетчер памяти должен отслеживать выделенные и свободные области адресного пространства.За защитой памяти (если она поддерживается процессором и ОС) также необходимо позаботиться.Все обычные вещи.

1 голос
/ 17 января 2012

В системе, где ядро ​​управляет физической памятью, либо процесс должен запросить у ядра дополнительную память (т.е. сделать системный вызов), либо ядро ​​должно автоматически выделить страницы, которые процесс хочет, когда процесс разыменовывает указатель, указывающий вне его существующих сегментов текста и данных. Это относится к lmm или любому другому распределителю памяти, работающему в пространстве пользователя. Если вы посмотрите код примера на странице lmm, на которую вы ссылаетесь, вы увидите вызов sbrk (системный вызов Unix), чтобы получить блок памяти, который затем передается lmm_add_free .

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

...