nixp.ru v3.0

24 мая 2017,
среда,
13:01:30 MSK

DevOps с компанией «Флант»
Fatal написал 15 октября 2004 года в 23:51 (285 просмотров) Ведет себя как мужчина; открыл 123 темы в форуме, оставил 484 комментария на сайте.

Подскажите, пожалуйста, через какой системмный вызов во FreeBSD запрашивается память в куче, и соответственно освобождение. И если можно и в Linux. Я чё-то копался все не нашел, да и время стало очень мало.

vnp

Памятья в куче управляют malloc/free — в чистом виде библиотечные функции. Для увеличения кучи, malloc при случае вызывает системный вызов sbrk. Обратной операции (сокращения кучи) не предусмотрено.

Fatal

Вы меня не правильно поняли, мне нужны именно системные вызовы, через которые и построены библиотечные malloc, calloc, realloc.

metal

www.gnu.org, дока по glibc — там все написано.

Fatal
metal
www.gnu.org, дока по glibc — там все написано.

Нельзя ли поточнее ссылке, я копался, но что-то не нашел

vnp
Fatal
Вы меня не правильно поняли, мне нужны именно системные вызовы, через которые и построены библиотечные malloc, calloc, realloc.

Umm, боюсь, что я-то как раз понял правильно. Искомые вызовы не существуют. Беда такая. Их нет.

Для порядка напишите программу

#include 
int main() { char * foo = malloc(100); return 0; }

и прoгоните ее через strace. Очень помогает.

Fatal

Системные вызовы обязаны существовать, вы меня натолкнули на мысль просмотреть ассамблерный код, который соорудит gcc

Fatal

В асм коде он вызывает туж библиотечную функцию.

А что такое strace, в man я не нашёл

vnp
Fatal
В асм коде он вызывает туж библиотечную функцию.

А что такое strace, в man я не нашёл

strace это такая программа. strace program отслеживает и печатает системные вызовы, которы делает program.

metal

malloc мспользует mmap для запросов на выделение большого кол-ва памяти. В остальных случаях (как я понимаю) используется brk.

Во FreeBSD и многих других юниксах вместо strace используется truss или ее более продвинутые аналоги (например, в солярисе). Список всех системных вызовов FreeBSD находится тут:

/usr/src/sys/kern/syscalls.c

Fatal

понято, спасибо!