OSDev

для всех
Текущее время: 21 дек 2024, 21:53

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Управление памятью
СообщениеДобавлено: 23 мар 2019, 19:49 

Зарегистрирован: 26 янв 2019, 14:00
Сообщения: 34
Здравствуйте,

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Управление памятью
СообщениеДобавлено: 23 мар 2019, 21:04 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Если каждая программа в изолированном адресном пространстве, то и проблем с вмешательством других нет.
Обычно ОС оперируют не программами, а процессами.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Управление памятью
СообщениеДобавлено: 23 мар 2019, 21:39 

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

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Управление памятью
СообщениеДобавлено: 23 мар 2019, 22:11 

Зарегистрирован: 26 янв 2019, 14:00
Сообщения: 34
SII и Himik, спасибо большое за ваши ответы. Благодаря вашим ответам мои мысли устаканились, и я получил хорошее представление на эту тему.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Управление памятью
СообщениеДобавлено: 25 мар 2019, 15:59 
Аватара пользователя

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

_________________
Yet Other Developer of Architecture.
The mistery of Yoda’s speech uncovered is:
Just an old Forth programmer Yoda was.

<<< OS Boot Tools. >>>


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB