Perl: что делает checkstack.pl в источнике linux?

Я делаю проект в ядре linux, и я хотел знать, что делает этот checkstack.pl? Я никогда не изучал perl, поэтому не мог понять программу. Будет здорово, если бы я мог понять программу концептуально, если бы не по строкам. Любые усилия были оценены.

Источник: текст ссылки

Предположим, я хочу немного написать код моей собственной настройки, могу ли я написать его в программе на C. Мой главный вопрос: почему этот код написан или должен быть написан в perl?

Ответ 1

Он создает список размера фрейма стека, используемого каждой функцией в ядре (т.е. общее количество локального пространства пробелов, используемого каждой функцией для локальных переменных и еще чего-то).

То, как это происходит, - это разобраться в разборке ядра и найти 2 вещи: имена функций и инструкции, которые настраивают стек. Он ищет имена функций, ища строки, соответствующие $funcre (qr/^$x* <(.*)>:$/), и он ищет инструкции по настройке стека, которые соответствуют $re или $dre; последние два сильно зависят от архитектуры, для которой было скомпилировано ядро, что и является первым крупным блоком, если проверки if/else проверяются. $re выполняет поиск функций, которые корректируют стек на фиксированную сумму (подавляющее большинство функций), а $dre выполняет поиск функций, которые корректируют стек на переменную величину (редко).

objdump является частью binutils; objdump -d - это команда для дизассемблирования объектного файла. Использование этого script состоит в том, чтобы разобрать ядро ​​(objdump -d vmlinux) и передать вывод в script. Вывод script представляет собой список всех функций в ядре, отсортированных по размеру самого большого стека. Я предполагаю, что цель script заключается в том, чтобы разработчики ядра могли избежать, мучительно следя за тем, чтобы все фреймы стека были как можно меньше, и этот script позволяет им проверять это.

Ответ 2

Как уже объяснялось выше, Perl script используется для определения использования кода ядра, я считаю, что Perl используется из-за того, что синтаксический анализ вывода objdump -d не будет таким простым, если это будет сделано через код C.

Вы можете найти использование стека во время выполнения, взяв адрес первого аргумента и адрес последней локальной переменной, а затем вычтите их, например:

int stack_usage_func(char i)
{
    int j,k,l;

    char buf[256];
    char m;
    unsigned long stack_use = &i - &m;
    //do all processing
    return stack_use
}

Возврат функции должен дать вам использование стека во время выполнения, я не скомпилировал код, поэтому, пожалуйста, игнорируйте, если он дает ошибки компиляции, но логика должна работать.