OSDev

для всех
Текущее время: 28 мар 2024, 14:36

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




Начать новую тему Ответить на тему  [ Сообщений: 11 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: 06 июн 2019, 11:00 

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

Никак не могу понять пару вещей про процессы загруженные в память. Первое, что я сделал, скомпилировал и поместил процесс по адресу 0x02000000. Проблем это не вызвало. Но появился другой вопрос, а что если эта программа является библиотекой, как другие процессы узнают какой адрес у той или иной функции?

Затем задумался, а как собственно разместить более чем один процесс в памяти? Размещать по порядку это не сложно и опять не вызовет никаких проблем. Но что делать когда им понадобится дополнительная память? Завести кучу само собой напрашивается. А помещать ли в кучу сами процессы, или они должны быть отдельно? Предположим что в памяти идут подряд две кучи двух процессов, а первому понадобилось увеличить эту кучу, а размеры уперлись. Как быть? Заранее выделять много? В моей голове звучит глупо. И собственно какая подпрограмма и откуда должна выделять память и останавливать/удалять процесс, когда он завершится?

И последнее что совсем не могу сообразить, как происходит изоляция адресного пространства одного процесса от другого? Т.е. имеем код ядра, код пользовательского пространства, а как его делить для разных процессов не пойму.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 июн 2019, 11:37 

Зарегистрирован: 16 апр 2019, 17:15
Сообщения: 11
день добрый.

Чего то вообще непонятно где проблема.
Если используются раздельные пространства для процессов то у каждого пространства есть своя карта памяти. Куча будет в своем адресном пространстве. Библиотеки когда загружаются либо линкуются налету, либо устанавливают какую нибудь таблицу символов, по которой можно определить адрес требуемой функции. Естественно библиотеки грузятся в собтственное адресное пространство процесса, как в прочем и любое приложение. Доступные страницы физической памяти распределяет естественно ядро, оно же обеспечивает отображение физических страниц на виртуальные адреса.

Проблема возникает когда нет механизма mmu то есть виртуальной памяти, но там отдельная песня. Я так понял Вы не об этом случае спрашавали.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 июн 2019, 11:53 

Зарегистрирован: 26 янв 2019, 14:00
Сообщения: 34
abondarev писал(а):
Если используются раздельные пространства для процессов то у каждого пространства есть своя карта памяти. Куча будет в своем адресном пространстве.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 июн 2019, 14:19 

Зарегистрирован: 16 апр 2019, 17:15
Сообщения: 11
Цитата:
Правильно ли я понимаю, что мы просто выделяем определенный участок памяти процессу кладем туда процесс и его кучу?

Нет не правильно. Память есть физическая и виртуальная. При создании процесса создается собственное виртуальное пространство, его ни откуда не нужно выделять это просто адреса. Так вот например договариваемся что процесс у нас будет лежать по адресу 0x4000000, стек на 0x8000000 растет вниз, Начинаем загружать наш новый процесс, выделяем физические страницы памяти, и соотносим виртуальный адрес с физическим.

Посмотрите, что такое виртуальная память.
https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%BD%D0%B0%D1%8F_%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D1%8C
https://habr.com/ru/company/embox/blog/256191/


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 июн 2019, 21:31 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Sebt писал(а):
Из вашего сообщения так понял единственное, что меня сдерживает и не дает двигаться дальше это выделение процессу собственного адресного пространства. Не понимаю как это возможно реализовать и как распределяется память в таких случаях.
Правильно ли я понимаю, что мы просто выделяем определенный участок памяти процессу кладем туда процесс и его кучу? Если да, то сколько необходимо выделить и как выделить именно собственное/изолированное пространство?
Это "единственное" тянет на полядра :) Читайте про пагинацию и разделение (пользовательских) адресных пространств.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 июн 2019, 21:43 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Использование разделяемых библиотек в разных адресных пространствах - тоже весьма интересный вопрос. В идеале они должны загружаться/отображаться по одним и тем же адресам. Но что делать в случае конфликта, т.е. когда предпочтительный участок адресного пространства уже занят? :|


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 июн 2019, 22:36 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
phantom-84 писал(а):
Это "единственное" тянет на полядра :)


Максимум процентов на 10 -- на половину тянет только ввод-вывод и всё с ним связанное (PnP, управление питанием и т.п.). Правда, это в ядрах полноценных систем (Винды, грубо говоря).

phantom-84 писал(а):
Но что делать в случае конфликта, т.е. когда предпочтительный участок адресного пространства уже занят?


Если библиотека нуждается в настройке на конкретные адреса загрузки -- придётся грузить новую копию по новым виртуальным адресам. Если же ей настройка не нужна, то можно использовать и уже загруженную, просто отобразить на другие виртуальные адреса.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 июн 2019, 22:40 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
SII писал(а):
Правда, это в ядрах полноценных систем (Винды, грубо говоря).
Куда нам до винды! :)

Это фундамент. Вроде бы и где-то "на дне", и не сильно видно, а если присмотреться, то к нему все коммуникации тянутся. Я не только про "выделение процессу собственного адресного пространства", а про весь механизм в целом.

SII писал(а):
придётся грузить новую копию по новым виртуальным адресам
Правильный ответ :) Мой вопрос был информацией к размышлению для ТСа ;)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 07 июн 2019, 23:53 

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

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 08 июн 2019, 09:24 

Зарегистрирован: 26 янв 2019, 14:00
Сообщения: 34
Himik писал(а):
В виртуальном адресном пространстве карту памяти можно распределять абсолютно свободно, т.к. страницы на любом участке можно отображать куда угодно.
Реализация собственного адресного пространства строится в основном на смене регистра CR3 при каждом переключении процессора с процесса на процесс. Тоесть каждому процессу указываем свой каталог таблиц и отдельные таблицы страниц. Так у задач транслируются одинаковые участки виртуальной памяти в разные участки физической памяти.

Спасибо! Вроде понял, попробую реализовать.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ]  На страницу 1, 2  След.

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


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

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


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

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