Описание кода реализации ptmalloc - программирование
Подтвердить что ты не робот

Описание кода реализации ptmalloc

Я с нетерпением жду понимания того, как динамическое управление памятью работает на низком уровне в системах GNU/Linux (так же, как работает ptmalloc).

Конечно, я прочитал код, но у меня много сомнений. Я, более или менее, понимаю структуры данных, но у меня много утечек информации!

Мой вопрос в том, что кто-то знает о каком-либо ресурсе, подробно объясняющем реализацию. Например, я читал такие статьи, как "Понимание кучи, разбив ее" или "Маллок Маллефикарум" и пост-серии. Они отлично справляются, но, конечно, они более сфокусированы в эксплуатации, чем объясняют многие детали реализации.

Если вы не знаете о каком-либо ресурсе, вот некоторые из моих вопросов.

  • Что такое арена? В коде переменной ar_ptr из heap_info есть комментарий, говорящий "арена для этой кучи", поэтому арена не может быть кучей (как сказано везде).

  • Почему в структуре heap_info нет следующего указателя и есть указатель prev? Это из-за main_arena? И что такое main_arena?

  • Каждая структура heap_info может иметь более одной арены (указывая на разные структуры malloc_state)?

  • Когда создаются новостные арены и какой код обрабатывает их? Я прочитал, что новые арены создаются, когда арена, запрашиваемая для хранения данных, заблокирована (потому что процесс или поток процессов работают с ним), и я также прочитал, что каждый поток процесса имеет другую арену. Важно здесь, если вы знаете , какой код обрабатывает эти ситуации.

  • Я также не понимаю, когда люди говорят, что все операции с памятью рождаются из верхнего куска или самого маленького куска. Вы знаете, где я могу найти этот код?

Кстати, я не хочу углубляться в подробности мьютекса.

Я просматриваю реализацию ptmalloc в glibc 2.12.1. Я хотел бы сделать несколько диаграмм об общей структуре всего, поэтому мне нужно понять эти вещи!

Спасибо.

4b9b3361

Ответ 1

Хорошо, я провел некоторое исследование, и у меня есть ответ на многие из этих вопросов.

  • Арена - это область памяти, в которой будут сохранены все динамические данные процесса. Короче говоря, арена - это структура памяти, которая в прошлом называлась кучей. Учитывая, что в настоящее время (с многопоточным материалом) вы хотите иметь более одной кучи на каждый процесс, вы справляетесь с этим, создавая что-то называемое ареной, но эта арена - не что иное, как куча. Структура heap_info управляет только несколькими существующими аренами процесса.

  • Я не знаю, почему существует только указатель prev. Я знаю, что, как правило, все динамические данные хранятся в main_arena, это арена, созданная для этого процесса. Я не знаю, в каких обстоятельствах main_arena не используется, я знаю, что если поле размер в блоке памяти имеет NON_MAIN_ARENA > бит, тогда main_arena не используется, и алгоритм получает новый адрес арены от очистки 20 менее значительных бит этого указателя куска памяти через heap_for_ptr() > макрос. Подводя итог, в обычных условиях всегда будет использоваться main_arena.

  • Да, как я уже сказал, каждая структура heap_info может иметь несколько аренов. Это происходит из-за блокировки. Если у вас достаточно свободного времени, вы можете прочитать об этом в [1].

  • Я не помню этого. Но дело в том, что если арена используется, заперта, создается новая арена. Найдите любой вызов функции, аналогичной функции new_arena() или new_heap(). Я помню, что имя функции было похоже на это.

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

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

Кстати, я поставил все эти исследования на бумаге, но, учитывая, что это на испанском языке, я не думаю, что он будет полезен здесь, и я не знаю, будет ли это считаться спамом. [2]

[1] http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.16.4439

[2] Здесь у вас есть документ: http://overflowedminds.net/papers/newlog/linux_heap_exploiting_revisited.pdf

Ответ 2

Куча в основном разделена на множество небольших областей, которые независимо обслуживают один или несколько выделенных объектов. Один такой район можно назвать ареной или зоной. В первую очередь куча представляет собой коллекцию объектов общественного питания арены с требованием освободить одну арену за одну операцию. Чтобы сделать это возможным, одна целая арена выделяется как единый непрерывный диапазон адресов памяти.

Разница между ареной или зоной - это какая-то серая. Я не уверен в Linux, но один пример - семейство многоядерных сетевых процессоров реального мира в сетях Cavium под названием Octeon. Который рассматривает выделенную память как арену или зону с той разницей, что эта зона может выделять объекты фиксированного равного размера, где на арене могут быть объекты разного размера. Это, естественно, приведет к фрагментации в случае арены. Но я не могу подтвердить, так ли это с Linux.

Управление памятью на уровне регионов