Что такое разрыв программы?Откуда это начинается, 0x00? - PullRequest
6 голосов
/ 14 июня 2011
int brk(void *end_data_segment);
void *sbrk(intptr_t increment);

Вызов sbrk () с шагом 0 может использоваться для определения текущего местоположения прерывания программы.

Что такое прерывание программы?С чего это начинается, 0x00?

Ответы [ 4 ]

5 голосов
/ 15 июня 2011

Упрощение:

Процесс имеет несколько сегментов памяти:

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

(Конечно, в настоящее время это оченьболее сложный. Есть сегмент родата, неинициализированный сегмент данных, сопоставления, выделенные через mmap, vdso, ...)

Один традиционный способ, которым программа может запросить больше памяти в Unix-подобной ОС, - это увеличениеразмер сегмента данных и использовать распределитель памяти (т. е. malloc() реализация) для управления результирующим пространством.Это делается с помощью системного вызова brk(), который меняет точку, где сегмент данных «ломается» /ends.

3 голосов
/ 14 июня 2011

Прерывание программы - конец сегмента данных процесса.AKA ...

разрыв программы - это первое место после окончания сегмента неинициализированных данных

Откуда он начинается, зависит от системы, но, вероятно, нет0x00.

2 голосов
/ 02 ноября 2017

Вы говорите, что sbrk () - это системный системный вызов и что мы должны использовать malloc (), но malloc (), согласно ее документации, когда он выделяет меньше памяти, чем 128 КиБ (32 страницы), использует это.Таким образом, мы не должны использовать sbrk () напрямую, но malloc () использует его, если выделение больше 128 КиБ, тогда malloc () использует mmap (), который распределяет частные страницы в пространстве пользователя.Наконец, хорошая идея - понять sbrk (), по крайней мере, для понимания концепции «Разрыв программы».

1 голос
/ 09 октября 2017

В наши дни sbrk (2) brk) - это почти устаревшие системные вызовы (и вы можете почти забыть о них и проигнорировать старое понятие прерывания ; фокуспри понимании mmap (2) ).Обратите внимание, что на странице sbrk (2) man написано NOTES :

Избегайте использования brk() и sbrk(): пакет выделения памяти malloc (3) - это портативный и удобный способ выделения памяти.

(выделено мной)


Большинство реализаций malloc (3) (особенно в musl-libc ) скорее используют mmap (2) , чтобы требовать память -и увеличить их виртуальное адресное пространство - из ядра (посмотрите на это виртуальное адресное пространство вики-страничка, у него есть хорошая картинка).Некоторые malloc -s используют sbrk для небольших распределений, mmap для больших.

Используйте strace (1) для поиска системных вызовов (перечисленных в syscalls (2) ), выполняемые каким-либо заданным процессом или командой.Кстати, вы обнаружите, что bash и ls (и, вероятно, многие другие программы) не делают ни одного вызова sbrk.

Исследуйте виртуальное адресное пространство какого-либо процесса с помощью ** Proc одна тысяча пятьдесят-четыре (5) .Попробуйте cat /proc/$$/maps и cat /proc/self/maps и даже cat /proc/$$/smaps и прочитайте немного, чтобы понять вывод.

Помните о ASLR & vdso (7) .

И sbrk не очень подходит для потоков.

(мой ответ сосредоточен на Linux)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...