我正在尝试跟踪内核中特定进程的PC值
为此,我查看了内核源代码,并发现pc存储在task_struct->stack
内,为了理解堆栈,我需要将其转换为struct thread_info *
。
因此,在gdb中,我设置了一个断点b scheduler_tick
(每隔10ms调用一次)。
但是,当我打印出p/x ((struct thread_info *)curr->stack)->cpu_context.pc
时,我收到的值为$4 = 0x804d19d8
。
我预计PC会低于0x80000000
,因为0x80000000
以上的地址被配置为我内核中的内核空间。在查看内核的objdump
输出后,我发现pc指向__schedule
。
对于我从用户空间开始的进程,PC不应该指向用户空间指令吗? 我的理解是,当一个中断被触发时,寄存器状态被保存,中断被服务,然后寄存器状态被恢复,所以程序继续,就像“没有”发生一样。