Да, ядро определенно может отслеживать текущие блокировки, но это дорого и делается только для целей отладки. Вы должны сконфигурировать и скомпилировать ваше ядро с включенной отладкой (в частности, 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 , чтобы конкретно посмотреть, что происходит, когда выполняется код вашего ядра.