проблема при размещении пользовательских полей в структуре malloc_chunk - PullRequest
0 голосов
/ 12 сентября 2011

Я пытаюсь поместить head-тег и foot-тег в struct malloc_chunk, вот так:

  struct malloc_shunk {
       INTERNAL_SIZE prev_size;
       INTERNAL_SIZE size;
       }

Вот что я сделал:

1

  struct malloc_shunk {
       INTERNAL_SIZE foot_tag;
       INTERNAL_SIZE prev_size;
       INTERNAL_SIZE size;
       }

перед тем, как поместить head_tag ​​в malloc_chunk, я просто добавил только foot_tag и скомпилировал glibc. Я сделал небольшую тестовую программу, которая выделяет 60 байт из системы, а затем освобождает ее. Я вижу, что malloc вернулся правильно, бесплатно пожаловался, сказав «неверный указатель». Возвращенный указатель malloc был 0x9313010. Это делает указатель на начало malloc_chunk равным 0x9313004. Поэтому, когда free передается 0x9313010, он преобразует его в 0x9313004 через (mem2chunk) и проверяет его на выравнивание. Так как мой размер слова равен 4, проверка выравнивания с 0x9313010 - вот где у меня проблемы. Подскажите, пожалуйста, должен ли указатель Mem (возвращаемый malloc) быть выровнен по двойному слову. (поскольку здесь он может не удовлетворять этому критерию, поскольку различие между указателем, возвращаемым функцией malloc и началом фрагмента, будет здесь 12 байтов, а не 8).

  1. Чтобы когда-либо появиться 1. проблема, я просто добавил 1 метку в структуру, чтобы она стала

    struct malloc_shunk { INTERNAL_SIZE foot_tag; INTERNAL_SIZE prev_size; INTERNAL_SIZE размер; INTERNAL_SIZE head_tag; } Теперь разница между указателем, возвращаемым функцией malloc и началом фрагмента, будет 16, что всегда будет выровнено по двойному слову. Но здесь я сталкиваюсь с более серьезной проблемой, так как время, когда первый malloc называется ареной, настраивается, и бункеры инициализируются. Размер жертвы здесь не равен нулю, как это должно быть в обычных случаях. Проблема в том, что жертва-> размер на самом деле оказывается местом, где хранится «top», а не «last_remainder». Я хотел бы спросить ваше мнение, если есть какой-либо другой способ / обходной путь / решение, чтобы я мог преодолеть эту инициализацию проблемы арены, с которой я сейчас сталкиваюсь.

Спасибо и С уважением, Капил

1 Ответ

0 голосов
/ 15 ноября 2011

Из всего, что я узнал, постарайтесь не изменять структуру malloc_chunk. Даже если вам необходимо убедиться, что верхний указатель изначально равен 0, иначе куча не будет сформирована. Это функция sYSMALLOC () в _int_malloc (), которая сначала MMAP получает больший кусок от ядра. Он будет вызван, только если вершина изначально равна 0.

...