RIP是一个存储当前指令地址的寄存器。我正在编写一个系统调用来获取用户级进程的程序计数器。以下面的代码为例,sys_getrip()是我正在处理的系统调用。我该如何实施?
我正在使用的平台是Ubuntu 14.04和Linux内核3.14.4。
/*A system call in the kernel level*/
void sys_getrip(){
char *pc =//What's the magic here?
printk(KERN_INFO, "The current program counter of %d is %p", current->pid, pc);
}
/*A test function running in user level*/
void main(void){
...
sys_getrip();
...
...
sys_getrip();
...
}
此处发布了类似的问题:How to print exact value of the program counter in C。我在本文中尝试了通过实现sys_getrip()的方法,如下所示
void sys_getrip(void){
printk(KERN_INFO "RIP = %p\n", __builtin_return_address(0));
}
但是,在这种情况下,main()中sys_getrip()的不同调用给出了相同的RIP值。