Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
rikimaru2013
C++ Game Dev
2440 / 1133 / 240
Регистрация: 30.11.2013
Сообщений: 3,690
#1

Как операционная система выделяет виртуальную память процессу? - C++

07.07.2016, 18:29. Просмотров 362. Ответов 9
Метки нет (Все метки)

Добрый вечер,

хотел уточнить насчёт адресации: создаётся экземпляр win32 программы, выделяет процесс и 1 поток - ОС даёт процессу виртуальное адресное пространство в 4 ГБ - другими словами адрес, что придёт через new будет от 0..size_t::max за исключением первых 256 - как служебные - но каждому 0x001 адресу, что мы видим в студии не соответствует реальный адрес на ОЗУ - так как ОС защищает от вмешательства в переменные другого процесса (так ли?). Итого: одно адресное виртуальное пространство на процесс, потоки могут иметь доступ к адресному пространству своего процесса.

Вопрос: правильно ли я мыслю, и где можно подробно об этом почитать - не перечитывая всю книгу 98 года по Win 98
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2016, 18:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как операционная система выделяет виртуальную память процессу? (C++):

Установка MapWinGis: Операционная система не может запустить %1 - C++ Builder
Добрый день. Пытаюсь установить библиотеку MapWinGis. http://mapwingis.codeplex.com/releases/view/618794 скачал от сюда 32-разрядную...

Как привязать ProgressBar к определенному процессу - C++ Builder
Доброго времени суток! Есть програмка которая рисует амплитуду аудио файла, как отобразить этот процесс. #include <vcl.h> #pragma...

Как подменить дочернему процессу стандартные потоки ввода/вывода? - Visual C++
Операционная система: Windows Задача: создать pipe и запустить два процесса, перенаправив стандартный вывод одного из них в стандартный...

MULTOS - Операционная система - C++ WinAPI
MULTOS - Операционная система Где найти литературку?

Преобразование адреса в виртуальную память в виртуальной машине - C++ WinAPI
Всем привет, нужен пример функции, как преобразовать адреса в виртуальной памяти (желательно на С, чисто чтоб "посмотреть") в виртуальной...

Чтобы процесс удачно запросил виртуальную память, он должен вызвать VirtualAlloc дважды? - C++ WinAPI
Изучаю виртуальную память. Ребята, я жирным выделил места, на которые надо обратить особое внимане Ну вот, собсно и всё. Вот я и...

9
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,385
Записей в блоге: 2
Завершенные тесты: 1
07.07.2016, 18:40 #2
Адресация зависит от режима процессора, в каждом режиме она работает по-разному. Тот же win32 при запуске на x86 и на x86_64 будет работать по-разному.
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
что мы видим в студии не соответствует реальный адрес на ОЗУ
Это виртуальный адрес. Путем (не) хитрых манипуляций с этим адресом и значением в сегментном регистре, будет получен физический адрес, который ты даже не узнаешь. Реально же (чисто теоретически) процессу может быть доступно 1 МБ физической памяти, но по ней можно будет адресовывать все 4 ГБ (просто страницы памяти так нагенерятся, и в таблице страниц могут быть одинаковые адреса).
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
где можно подробно об этом почитать
На wasm.ru есть хорошие статьи на эту тему. Ща попробую найти. Плюс http://wiki.osdev.org/ гладезь подобной информации, ну самый главный источник - это Intel мануал, там все подробно разжевано.
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
правильно ли я мыслю
Для полного понимания можно попробовать написать свой велосипед, который, например, будет запускаться под ДОСом, генерировать страницы, каталоги страниц, дескипторы, etc и переходить в protected mode с включенным paging'ом (это страничная адресация). Либо свой загрузчик ОС, и подебажить его на какой-нибудь виртуальной железяке.
1
avgoor
931 / 566 / 124
Регистрация: 05.12.2015
Сообщений: 1,585
07.07.2016, 18:42 #3
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
так как ОС защищает от вмешательства в переменные другого процесса (так ли?).
Интересует, как это реализовано, или что?
0
Kastaneda
07.07.2016, 18:47
  #4

Не по теме:

Цитата Сообщение от Kastaneda Посмотреть сообщение
Ща попробую найти.
что-то они там у себя на сайте все поменяли, был большой цикл статей, не могу его найти.

0
rikimaru2013
C++ Game Dev
2440 / 1133 / 240
Регистрация: 30.11.2013
Сообщений: 3,690
07.07.2016, 19:02  [ТС] #5
Цитата Сообщение от Kastaneda Посмотреть сообщение
и в таблице страниц могут быть одинаковые адреса
Таблица это 4 млрд возможных адресов и что им соответствует в реальной памяти?

И зачем в таком случаи ссылатся вирт адресу 0х0101 и 0х2442 на один и тот же реальный.

Цитата Сообщение от Kastaneda Посмотреть сообщение
Для полного понимания можно попробовать написать свой велосипед, который, например, будет запускаться под ДОСом, генерировать страницы, каталоги страниц, дескипторы, etc и переходить в protected mode с включенным paging'ом (это страничная адресация). Либо свой загрузчик ОС, и подебажить его на какой-нибудь виртуальной железяке.
звучит так на месяц работки)


Цитата Сообщение от avgoor Посмотреть сообщение
Интересует, как это реализовано, или что?
Интересуют знания, которые будут мне полезны для осознания того или иного механизма.
0
Убежденный
Ушел с форума
Эксперт С++
15708 / 7218 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
07.07.2016, 19:22 #6
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
другими словами адрес, что придёт через new будет от 0..size_t::max за исключением первых 256 - как служебные
Если быть занудным и придирчивым точным, там будет меньше size_t::max.
Верхние адреса - системное адресное пространство, туда загружено ядро ОС и драйверы,
эта часть памяти ни для каких пользовательских процессов напрямую не доступна.

Для 32-битных процессов верхняя планка адреса - около 2 ГБ (или ~4 ГБ на Win64 при
условии флага 'Large Address Aware' в заголовке exe), для 64-битных - около 8 ТБ, а на
Windows 8.1 и выше - около 128 ТБ.

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Итого: одно адресное виртуальное пространство на процесс, потоки могут иметь доступ к адресному пространству своего процесса.
Вопрос: правильно ли я мыслю, и где можно подробно об этом почитать - не перечитывая всю книгу 98 года по Win 98
Лучшее чтиво по данной теме - книга "Windows Internals" Руссиновича ("Внутреннее
устройство Microsoft Windows"), у него еще есть много интересных статеек в блоге,
например "Преодолевая ограничения Windows - виртуальная память" (а также "физическая
память" и многое другое).

На MSDN и Intel есть тоже полезные статьи по теме виртуальной памяти, трансляции адресов и т.д.,
но они рассчитаны на продвинутого пользователя, там можно очень быстро "перегрузить мозг".
1
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,385
Записей в блоге: 2
Завершенные тесты: 1
07.07.2016, 19:29 #7
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
И зачем в таком случаи ссылатся вирт адресу 0х0101 и 0х2442 на один и тот же реальный.
я привел теоретический пример, просто чтобы показать, что такое возможно.
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Таблица это 4 млрд возможных адресов и что им соответствует в реальной памяти?
Нет, там уже адреса физической памяти, которая, понятное дело, ограничена размерами ОЗУ. Размер страницы при этом зависит от режима процессора (даже в одном и том же режиме размеры страниц могут отличаться). Физический адрес ты не узнаешь, только если ты не сам написал генерацию каталога страниц и не дебажишь его на виртуальной железяке. Но ОС не генерит сразу столько много страниц, чтобы покрыть всю ОЗУ, есть железячное прерывание "P(aging)F(ault)", которое обрабатывается процессором, процессор передает управление обработчику этого исключения (адрес обработчика он знает где найти). Это прерывание случается, когда обращаешься к несуществующей странице, в этом случае обработчик выделяет (мапит) для тебя нужную страницу. Физически эта страница может где угодно, но при "раскрутке" виртуального адреса он укажет как раз на требуемую страницу.
Тут механизм на самом деле не на столько хитрый, его просто один раз понять надо, потом не забудешь)
2
avgoor
931 / 566 / 124
Регистрация: 05.12.2015
Сообщений: 1,585
07.07.2016, 19:30 #8
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Интересуют знания, которые будут мне полезны для осознания того или иного механизма.
Тогда гуглить в сторону защищенного режим процессора. Это больше с аппаратным обеспечением связано, нежели с конкретной ОС.
1
Renji
2014 / 1382 / 312
Регистрация: 05.06.2014
Сообщений: 3,943
07.07.2016, 19:47 #9
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Таблица это 4 млрд возможных адресов и что им соответствует в реальной памяти?
Таблица это ассоциативный массив. Физический адрес=массив[старшие биты виртуального адреса]+младшие биты виртуального адреса. Ну, плюс обработка особых ситуаций типа "часть памяти уехала в своп".
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
И зачем в таком случаи ссылатся вирт адресу 0х0101 и 0х2442 на один и тот же реальный.
Чтоб быстро получить большой кусок памяти забитый нулями (ссылками на одну и ту же страницу с нулями).
Предупреждая вопрос "нафиг память нулями забивать" - а вдруг там остались явки и пароли другого процесса?
1
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,385
Записей в блоге: 2
Завершенные тесты: 1
07.07.2016, 19:47 #10
Цитата Сообщение от avgoor Посмотреть сообщение
Тогда гуглить в сторону защищенного режим процессора
Опять же, если занудствовать, то в long mode (или как его называют в интеловской документации IA32e) адресация отличается от protected. Хотя принцип одинаковый, да.
0
07.07.2016, 19:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.07.2016, 19:47
Привет! Вот еще темы с ответами:

Как присоединиться к чужому процессу? - C++ WinAPI
Вообщем хотелось бы, чтобы программа присоединилась к чужому процессу, который уже идет на компе и его имя известно.Не уверен что так можно...

Как передать CredHandle дочернему процессу? - C++ WinAPI
Добрый день. Пишу Web-сервер вроде IIS. Реализовал расширения cgi и isapi. По http все великолепно работает. Но с https какие-то...

Как дочернему процессу вернуть значение в родительский? - C++ WinAPI
Подскажите, как дочернему процессу вернуть значение в родительский?

Поиск программы как по имени окна, так и по процессу - C++ WinAPI
Мне надо сделать поиск программ и если они были запущенны то что то происходило Поиск нужен как по имени окна так и по процессу ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.