Как получить глобальное состояние блокировок в ядре Linux? - PullRequest
1 голос
/ 19 февраля 2020

Я пишу код для ядра Linux и заметил, что прерывания отключены, когда мне нужно, чтобы они были включены, чтобы процесс мог обрабатывать сигнал. Было бы просто фантастически c, если бы я мог просто получить список всех блокировок, удерживаемых в данный момент в системе, так как я подозреваю, что блокировка где-то отключила прерывания ... Это при условии, что это был замок, который отключал прерывания. Если нет, то было бы также неплохо узнать, как это произошло (или где). Хранит ли ядро ​​Linux какие-либо записи об этом?

1 Ответ

6 голосов
/ 19 февраля 2020

Да, ядро ​​определенно может отслеживать текущие блокировки, но это дорого и делается только для целей отладки. Вы должны сконфигурировать и скомпилировать ваше ядро ​​с включенной отладкой (в частности, CONFIG_LOCKDEP, что также зависит от других параметров конфигурации).

Как только это будет сделано, в struct task_struct имеются различные поля , такие как lockdep_depth (количество блокируемых в данный момент блокировок) и held_locks (массив struct held_lock, представляющий удерживаемые в данный момент замки), которые могут быть полезны для вас. Вы можете проверить эти поля для задачи current, когда ваш модуль работает, чтобы узнать, что происходит.

Взгляните на две частные функции lockdep_print_held_locks() и print_lock() из kernel/locking/lockdep.c, чтобы узнать, как извлечь полезную информацию из этих struct held_lock. Вы также можете использовать отладчик ядра kgdb , чтобы конкретно посмотреть, что происходит, когда выполняется код вашего ядра.

...