Monday, December 7, 2009

调试KERNEL时,找出当前进程信息的方法

我们知道,一个常用的内核数据结构叫做 current. 它指向当前的进程,包括很多有用的信息,比如PID, 进程名等。如果是自己写内核代码,那么可以直接引用current。 但是如果是调试的话,直接p current是不行的。因为current是一个宏。

那么这时如何找出current呢?在Linux 2.6版本中,current是放在堆栈(STACK)的最低下。假如内核栈是8K。起始地址为0XC100,2000. 那么current就在0XC100,0000 (堆栈是倒着长的). 根据这个情况,可以用如下方法找出current。
1)找出ESP。p $esp. 假设输出为0XC123,4566
2) 把esp与上0XFFFF,E000 (低13位置为0)。 得到0XC123,4000. 这个值就是CURRENT的值了。可以转换后进行使用,比如
3) p ((* struct thread_info) 0xc1234000)->task->comm

以上方法在X86-32, ARM上都可以。 其他体系结构不太清楚,似乎也可以。或者那位知道的可以补充。

No comments: