per-cpu变量的地址

时间:2012-10-23 15:11:47

标签: linux kernel thread-local-storage

我正在为x86-64 SMP上运行的2.6.32版本编写一个小的可加载Linux的内核模块。

我的问题是:有没有办法获得内核中声明的每个cpu变量的地址的偏移量。通过偏移,我的意思是地址偏离percpu基地,这可以在gs寄存器中找到。具体来说,我试图找到current_task变量的偏移量,这是一个指向我认为当前任务的任务结构的指针。

我正在查看arch / x86 / include / asm / current.h,它具有get_current()函数。此函数使用宏percpu_read_stable读取current_task per-cpu变量。据我所知,percpu_read_stable基本上扩展为asm例程,如下所示:

asm("movq %%gs:%P1, %0"
  : "=r" (ret__)
  : "m" (per_cpu__current_task))

这是在arch / x86 / include / asm / percpu.h中。 我想从我的模块中读取gs之后的偏移量。如果我尝试使用per_cpu_current_task变量简单地执行printk,则该模块将被终止。

感谢您的关注!

1 个答案:

答案 0 :(得分:2)

好的,我想出了这个特殊符号的偏移量。这个由内核导出。因此在/ proc / kallsyms中有一个条目

000000000000cbc0 D per_cpu__current_task

因此该特定变量的偏移量为0xcbc0。当然,其他版本的偏移量会有所不同。