Perl: что делает checkstack.pl в linux source? - PullRequest
9 голосов
/ 13 ноября 2010

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

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

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

Ответы [ 2 ]

11 голосов
/ 13 ноября 2010

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

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

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

2 голосов
/ 13 ноября 2010

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

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

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
}

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

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