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