Linux поток вызовов функций ядра - PullRequest
0 голосов
/ 16 марта 2020

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

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

Я хочу где-нибудь вывести весь поток и проверить его позже. Я говорю о функциях пространства ядра - НЕ о функциях пространства пользователя.

1 Ответ

3 голосов
/ 18 марта 2020

Я хочу знать, что все функции ядра и функции драйвера устройства вызываются

Очевидно, что полнота трассировки зависит от того, где она запущена. И это зависит от вас.

Вы можете отследить то, что вы хотите через удобный trace-cmd. Например, вы можете получить график функции. Во-первых, вам нужно определить точку входа в зависимости от ваших потребностей.
Если речь идет о нажатии на клавиатуру, вам нужно найти его драйвер и некоторые связанные с ним функции.

Пример:
Classi c Драйвер клавиатуры AT и PS / 2 atkbd имеет функцию прерывания atkbd_interrupt. Давайте проверим, есть ли такая точка трассировки:

trace-cmd list -f | grep atkbd_int

Затем начнем запись:

trace-cmd record -p function_graph -g atkbd_interrupt &

Нажмите несколько клавиш и остановите запись: fg, затем Ctrl+C. Теперь вы можете получить график функции:

trace-cmd report | vim -

Это будет что-то вроде:

CPU 1 is empty
CPU 2 is empty
CPU 3 is empty
cpus=4
          <idle>-0     [000] 1095787.266859: funcgraph_entry:                   |  atkbd_interrupt() {
          <idle>-0     [000] 1095787.266863: funcgraph_entry:                   |    input_event() {
          <idle>-0     [000] 1095787.266864: funcgraph_entry:        0.215 us   |      _raw_spin_lock_irqsave();
          <idle>-0     [000] 1095787.266866: funcgraph_entry:        0.386 us   |      input_handle_event();
          <idle>-0     [000] 1095787.266867: funcgraph_entry:        0.163 us   |      _raw_spin_unlock_irqrestore();
          <idle>-0     [000] 1095787.266868: funcgraph_exit:         3.882 us   |    }
          <idle>-0     [000] 1095787.266869: funcgraph_entry:                   |    input_event() {
          <idle>-0     [000] 1095787.266869: funcgraph_entry:        0.123 us   |      _raw_spin_lock_irqsave();
          <idle>-0     [000] 1095787.266870: funcgraph_entry:                   |      input_handle_event() {
          <idle>-0     [000] 1095787.266871: funcgraph_entry:                   |        add_input_randomness() {
          <idle>-0     [000] 1095787.266871: funcgraph_entry:                   |          add_timer_randomness() {
          <idle>-0     [000] 1095787.266872: funcgraph_entry:                   |            mix_pool_bytes() {
          <idle>-0     [000] 1095787.266872: funcgraph_entry:        0.327 us   |              _raw_spin_lock_irqsave();
          <idle>-0     [000] 1095787.266873: funcgraph_entry:        0.877 us   |              _mix_pool_bytes();
          <idle>-0     [000] 1095787.266875: funcgraph_entry:        0.163 us   |              _raw_spin_unlock_irqrestore();
          <idle>-0     [000] 1095787.266876: funcgraph_exit:         3.628 us   |            }
          <idle>-0     [000] 1095787.266876: funcgraph_entry:                   |            credit_entropy_bits() {
          <idle>-0     [000] 1095787.266877: funcgraph_entry:                   |              __wake_up() {
          <idle>-0     [000] 1095787.266877: funcgraph_entry:        0.229 us   |                _raw_spin_lock_irqsave();
          <idle>-0     [000] 1095787.266878: funcgraph_entry:        0.120 us   |                __wake_up_common();
          <idle>-0     [000] 1095787.266879: funcgraph_entry:        0.135 us   |                _raw_spin_unlock_irqrestore();
          <idle>-0     [000] 1095787.266880: funcgraph_exit:         2.719 us   |              }
          <idle>-0     [000] 1095787.266880: funcgraph_entry:        0.108 us   |              kill_fasync();
          <idle>-0     [000] 1095787.266881: funcgraph_exit:         4.833 us   |            }
          <idle>-0     [000] 1095787.266882: funcgraph_exit:       + 10.249 us  |          }
          <idle>-0     [000] 1095787.266882: funcgraph_exit:       + 11.186 us  |        }
          <idle>-0     [000] 1095787.266883: funcgraph_entry:        0.237 us   |        atkbd_event();
          <idle>-0     [000] 1095787.266884: funcgraph_exit:       + 13.347 us  |      }
          <idle>-0     [000] 1095787.266884: funcgraph_entry:        0.138 us   |      _raw_spin_unlock_irqrestore();
          ........                                                         

Это просто маленький кусочек трассировки, например. Я сделал это в моей виртуальной машине QEMU.

...