我正在尝试跟踪内核中特定进程的 PC 值。
为此,我查看了内核源代码,发现 pc 被存储在里面task_struct->stack
,为了理解堆栈,我需要将它类型转换为struct thread_info *
.
因此,在 gdb 中,我设置了一个断点b scheduler_tick
(每 10 毫秒调用一次)。但是,当我打印出来时p/x ((struct thread_info *)curr->stack)->cpu_context.pc
,我收到的值为$4 = 0x804d19d8
。
0x80000000
考虑到上面的地址0x80000000
被配置为我的内核中的内核空间,我预计 PC 会在下面。查看objdump
内核的输出后,我看到 pc 指向__schedule
.
PC不应该指向我从用户空间启动的进程的用户空间指令吗?
我的理解是,当触发中断时,会保存寄存器状态,处理中断,然后恢复寄存器状态,因此程序继续进行,就好像“什么都没发生”一样。