Как найти текущее местоположение прерывания программы

Я попытался добавить это в функцию системного вызова brk:

void *addr = sbrk(0);
printk("current-add-is-%p-\n", addr);

Но во время компиляции ядра возвращалась ошибка, связанная с неявным объявлением функции sbrk. И я не смог найти где определяется sbrk!! Все, что мне нужно, это измерить, что всякий раз, когда какой-либо пользовательский процесс пытается расширить свой адрес прерывания программы, я буду знать его текущий адрес прерывания программы, чтобы я мог измерить, сколько памяти запрашивают процессы.

Спасибо.


person Arjun Bora    schedule 07.03.2016    source источник


Ответы (2)


Похоже, вы пытаетесь сделать что-то не так.

Системного вызова «sbrk» нет, есть «brk». За исключением того, что тогда он будет называться sys_brk, но у вас нет причин называть его. Поэтому, если вы хотите узнать, как узнать текущий адрес прерывания, прочтите исходники brk.

Впрочем, куда именно вы это подложили, если не нашли исходников brk?

person employee of the month    schedule 07.03.2016
comment
Не могли бы вы сказать, что вы подразумеваете под чтением источников brk, поместите это в метод системного вызова brk. Я так понимаю, что нет системного вызова sbrk. Но справочная страница sbrk говорит, что sbrk(0) даст текущий адрес прерывания программы, поэтому просто попробовал sbrk(0) - person Arjun Bora; 09.03.2016
comment
@ArjunBora: справочные страницы описывают функции, доступные для программ в пользовательском пространстве. Код пространства ядра работает с набором различных функций. - person Tsyvarev; 09.03.2016
comment
@Tsyvarev Хорошо, так я могу найти текущий адрес прерывания программы из пространства ядра? эквивалент sbrk(0) Спасибо. - person Arjun Bora; 09.03.2016
comment
@ArjunBora: Как сказал ответчик, вы можете изучить реализацию системного вызова brk - так на самом деле реализован sbrk(). Возможно, вы сможете повторно использовать части его кода для выполнения необходимой задачи (получения текущего адреса останова). Для поиска реализации системного вызова вы можете использовать grep -r . --include "*.c" -e "SYSCALL_DEFINE1(brk" в каталоге верхнего уровня с исходниками ядра. - person Tsyvarev; 09.03.2016
comment
@ArjunBora: адрес приостановки текущей задачи должен быть в current->mm->brk. - person Ian Abbott; 09.03.2016

Добавьте эту строку кода:

printf("Address of program break is %p\n", (void *)sbrk(0));

Он вернет сообщение на терминал с шестнадцатеричным адресом прерывания программы (например, 0x#### #### ####.)

Если вы хотите, чтобы адрес был не в шестнадцатеричном формате, используйте %u или аналогичный. Использование sbrk(0) задокументировано в справочных страницах (руководстве для программистов Linux).

Чтобы просмотреть документацию, введите в командной строке: man sbrk и появится документация.

person Andrea    schedule 15.12.2020