Форум программистов, компьютерный форум CyberForum.ru

C++

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

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

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

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

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

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

Написать программу, которая вводит целое число n и выделяет память C++
Нужно выделить всю доступную процессу память блоками по 13 байт C++
Чтобы процесс удачно запросил виртуальную память, он должен вызвать VirtualAlloc дважды? C++ WinAPI
Очищает ли операционная система память, после закрытия программы C++
Как malloc выделяет память? C++
Преобразование адреса в виртуальную память в виртуальной машине C++ WinAPI
C++ Программа, которая считывает количество товаров и выделяет память для сохранения их цен
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Форумчанин
Эксперт С++
4258 / 2790 / 219
Регистрация: 12.12.2009
Сообщений: 7,118
Записей в блоге: 1
Завершенные тесты: 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'ом (это страничная адресация). Либо свой загрузчик ОС, и подебажить его на какой-нибудь виртуальной железяке.
avgoor
836 / 478 / 106
Регистрация: 05.12.2015
Сообщений: 1,371
07.07.2016, 18:42     Как операционная система выделяет виртуальную память процессу? #3
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
так как ОС защищает от вмешательства в переменные другого процесса (так ли?).
Интересует, как это реализовано, или что?
Kastaneda
07.07.2016, 18:47
  #4

Не по теме:

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

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

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

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


Цитата Сообщение от avgoor Посмотреть сообщение
Интересует, как это реализовано, или что?
Интересуют знания, которые будут мне полезны для осознания того или иного механизма.
Убежденный
Системный программист
Эксперт С++
14887 / 6705 / 1059
Регистрация: 02.05.2013
Сообщений: 10,995
Завершенные тесты: 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 есть тоже полезные статьи по теме виртуальной памяти, трансляции адресов и т.д.,
но они рассчитаны на продвинутого пользователя, там можно очень быстро "перегрузить мозг".
Kastaneda
Форумчанин
Эксперт С++
4258 / 2790 / 219
Регистрация: 12.12.2009
Сообщений: 7,118
Записей в блоге: 1
Завершенные тесты: 1
07.07.2016, 19:29     Как операционная система выделяет виртуальную память процессу? #7
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
И зачем в таком случаи ссылатся вирт адресу 0х0101 и 0х2442 на один и тот же реальный.
я привел теоретический пример, просто чтобы показать, что такое возможно.
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Таблица это 4 млрд возможных адресов и что им соответствует в реальной памяти?
Нет, там уже адреса физической памяти, которая, понятное дело, ограничена размерами ОЗУ. Размер страницы при этом зависит от режима процессора (даже в одном и том же режиме размеры страниц могут отличаться). Физический адрес ты не узнаешь, только если ты не сам написал генерацию каталога страниц и не дебажишь его на виртуальной железяке. Но ОС не генерит сразу столько много страниц, чтобы покрыть всю ОЗУ, есть железячное прерывание "P(aging)F(ault)", которое обрабатывается процессором, процессор передает управление обработчику этого исключения (адрес обработчика он знает где найти). Это прерывание случается, когда обращаешься к несуществующей странице, в этом случае обработчик выделяет (мапит) для тебя нужную страницу. Физически эта страница может где угодно, но при "раскрутке" виртуального адреса он укажет как раз на требуемую страницу.
Тут механизм на самом деле не на столько хитрый, его просто один раз понять надо, потом не забудешь)
avgoor
836 / 478 / 106
Регистрация: 05.12.2015
Сообщений: 1,371
07.07.2016, 19:30     Как операционная система выделяет виртуальную память процессу? #8
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Интересуют знания, которые будут мне полезны для осознания того или иного механизма.
Тогда гуглить в сторону защищенного режим процессора. Это больше с аппаратным обеспечением связано, нежели с конкретной ОС.
Renji
1733 / 1166 / 272
Регистрация: 05.06.2014
Сообщений: 3,376
07.07.2016, 19:47     Как операционная система выделяет виртуальную память процессу? #9
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Таблица это 4 млрд возможных адресов и что им соответствует в реальной памяти?
Таблица это ассоциативный массив. Физический адрес=массив[старшие биты виртуального адреса]+младшие биты виртуального адреса. Ну, плюс обработка особых ситуаций типа "часть памяти уехала в своп".
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
И зачем в таком случаи ссылатся вирт адресу 0х0101 и 0х2442 на один и тот же реальный.
Чтоб быстро получить большой кусок памяти забитый нулями (ссылками на одну и ту же страницу с нулями).
Предупреждая вопрос "нафиг память нулями забивать" - а вдруг там остались явки и пароли другого процесса?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.07.2016, 19:47     Как операционная система выделяет виртуальную память процессу?
Еще ссылки по теме:

MULTOS - Операционная система C++ WinAPI
C++ Организовать функцию, которая выделяет память под строку
Действительно ли new выделяет память в куче (heap)? C++
Realloc выделяет память для массива int и не выделяет память для массива double C++
C++ WinAPI Как присоединиться к чужому процессу?

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

Или воспользуйтесь поиском по форуму:
Kastaneda
Форумчанин
Эксперт С++
4258 / 2790 / 219
Регистрация: 12.12.2009
Сообщений: 7,118
Записей в блоге: 1
Завершенные тесты: 1
07.07.2016, 19:47     Как операционная система выделяет виртуальную память процессу? #10
Цитата Сообщение от avgoor Посмотреть сообщение
Тогда гуглить в сторону защищенного режим процессора
Опять же, если занудствовать, то в long mode (или как его называют в интеловской документации IA32e) адресация отличается от protected. Хотя принцип одинаковый, да.
Yandex
Объявления
07.07.2016, 19:47     Как операционная система выделяет виртуальную память процессу?
Ответ Создать тему
Опции темы

Текущее время: 06:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru