Диапазон виртуальных адресов процесса - PullRequest
6 голосов
/ 08 мая 2011

Вкратце: смежно ли виртуальное адресное пространство процесса?

Мне нужно кое-что знать о виртуальном адресе, выделенном для процесса ядром.Пожалуйста, исправьте меня, если я ошибаюсь, когда я продолжаю.

При создании процесса ядро ​​распределяет виртуальную память процессу и сохраняет начальные и конечные адреса виртуальных адресов различных сегментов процесса в * 1005.* в task_struct.

Теперь предположим, что процесс исчерпал кучу и ему нужно увеличить размер кучи. Вызовы brk().

Если диапазон виртуальных адресов непрерывныйПредоставляется ли недавно выделенный кусок кучи вне диапазона, который был первоначально выделен для этого процесса?Или он размещен таким образом, что новый чанк соседствует с исходным.Что делать, если для этого нет места (потому что там лежит сегмент отображенной памяти).как это отслеживается?Если диапазон виртуальных адресов не является смежным, как vm_struct отслеживает различные фрагменты диапазонов адресов для кучи (или любого другого сегмента)?

Не могли бы вы пояснить мою концепцию?

Ответы [ 3 ]

8 голосов
/ 08 мая 2011

Виртуальное адресное пространство не является смежным.Смотрите вывод cat /proc/<pid>/mem.

. При запуске процесса ядро ​​выделяет несколько отображений для динамического компоновщика и для самого процесса.После этого динамический компоновщик выделяет больше отображений с помощью mmap(), и процесс может распределять больше отображений с помощью mmap() и расширять кучу с помощью brk().malloc() для dlmalloc и производных использует brk() для распределений, которые короче, чем порог, и mmap() для распределений, которые больше или равны этому порогу (около 128К IIRC).

В любом случае при вызове mmap() ядро ​​обычно отображает память далеко от кучи, поэтому обычно достаточно места для расширения кучи.Если для расширения кучи не осталось виртуального пространства, brk() завершится неудачей.

6 голосов
/ 08 мая 2011

Нет, виртуальное адресное пространство процесса не обязательно является непрерывным.В старые времена процесс получал память через brk, что действительно превращало кучу процесса в непрерывную зону памяти.В настоящее время выделение памяти осуществляется через mmap, который может манипулировать страницей виртуальной памяти процесса за страницей.

Если вам интересны аспекты ядра, я рекомендую две ссылки:

Если вы хотите изучить вашу систему, вы можете увидеть отображение памяти каждого процессав /proc/$pid/maps.См. Как читать из / proc / $ pid / mem в Linux? для получения дополнительной информации.

1 голос
/ 10 мая 2011

спасибо .. после прочтения упомянутой литературы согласно моему пониманию

виртуальное адресное пространство не является непрерывным в течение всего процесса, а также даже во всем данном сегменте памяти.и различные фрагменты диапазонов виртуальных адресов управляются в ядре с использованием дерева AVL vm_area_struct ( областей виртуальной памяти ).тем самым легко добавляя и удаляя куски областей виртуальной памяти в task_struct процесса.ref: Виртуальная память .но области виртуальной памяти сами по себе являются смежными.

, т. е. фактически task_struct содержит указатель на mm_struct, который содержит указатель на заголовки деревьев AVL (одно дерево на каждоеобласть памяти).узлы дерева - это не что иное, как vm_area_struct s, у которого есть начальный и конечный указатели для отметки начала и конца областей виртуальной памяти

, большое спасибо

...