OSDev
http://osdev.su/

Управление памятью
http://osdev.su/viewtopic.php?f=6&t=3666
Страница 1 из 1

Автор:  Sebt [ 23 мар 2019, 19:49 ]
Заголовок сообщения:  Управление памятью

Здравствуйте,

Чуть более теоретические, нежели практический вопрос. Реализовал кучу для ядра. Имеет ли смысл, если для каждой пользовательской программы буду создавать собственную кучу? Или все же для всех программ одну? Если все же есть смысл делать для каждой отдельно, то как я могу защитить одну программу от вмешательства другой?

Заранее спасибо за помощь!

Автор:  Himik [ 23 мар 2019, 21:04 ]
Заголовок сообщения:  Re: Управление памятью

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

Автор:  SII [ 23 мар 2019, 21:39 ]
Заголовок сообщения:  Re: Управление памятью

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

Естественно, чтобы куча могла быть инициализирована самой задачей (её стартовым кодом), ОС должна передать тем или иным способом необходимую для этого информацию. Одним из вариантов является создание кучи в виде программной секции прямо в загрузочном модуле (в ELF, например; причём сама секция может быть пустой -- скажем, иметь атрибут, указывающий, что память для неё должна быть зарезервирована, но не заполнена каким-то значением или же заполнена нулями); тогда загрузчик ОС выделит память в т.ч. и под эту секцию, а внутри своего кода задача может ссылаться на имя этой секции, чтобы получить её адрес. Но, понятно, это не единственная возможная в теории схема.

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

ADD. А защита памяти обеспечивается просто: новая память выделяется лишь для адресного пространства запросившей её задачи. В частности, если используется виртуальная память, то выделенные страницы будут доступны только через таблицы переадресации для данной задачи, но не для других задач.

Автор:  Sebt [ 23 мар 2019, 22:11 ]
Заголовок сообщения:  Re: Управление памятью

SII и Himik, спасибо большое за ваши ответы. Благодаря вашим ответам мои мысли устаканились, и я получил хорошее представление на эту тему.

Автор:  Yoda [ 25 мар 2019, 15:59 ]
Заголовок сообщения:  Re: Управление памятью

Sebt,
Вы не сможете в рамках одной кучи изолировать данные разных процессов друг от друга. Физически защита памяти возможна только на уровне страниц. Кроме того, постоянное обращение к функциям ядра — довольно медленный процесс (переключение режима процессора). Но, очевидно, что процессы в большинстве случаев не могут обходиться без кучи. Обычно делается так...
Новый процесс получает целое виртуальное адресное пространство, куда отображены лишь небольшие области данных и кода ядра, требующиеся для самой ОС и переключения процессов, а также память для процесса (его кода и статических данных, и кода/данных рантайм-библиотек). Поддержанием кучи занимаются рантайм-библиотеки. По необходимости увеличения размера кучи они обращаются к ядру только за одним действием: отобразить в адресное пространство процесса по определённым адресам новые физические страницы. Таким образом, взаимодействие задачи с ядром (в плане памяти) ограничивается только страничными операциями.
Операционная система хранит пул свободных страниц, которыми может пользоваться как сама, так и выделять их процессам. Современные ОС в целях защиты данных перед выделением страницы процессу затирают её нулями. Поскольку этот процесс не быстрый, можно хранить два пула: "чистых" и "грязных" страниц, в фоне очищать страницы и перемещать их из грязного в чистый пул. Это сэкономит время при выделении страницы процессу.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/