5

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

我的问题是:有没有办法获得内核中声明的每个 CPU 变量的地址偏移量。偏移量是指地址与 percpu 基址的偏移量,它位于 gs 寄存器中。具体来说,我试图找到 current_task 变量的偏移量,它是指向我相信的当前任务的任务结构的指针。

我正在查看具有 get_current() 函数的 arch/x86/include/asm/current.h。此函数使用宏 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,则该模块将被杀死。

感谢您的关注!

4

1 回答 1

2

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

000000000000cbc0 D per_cpu__current_task

所以这个特定变量的偏移量是 0xcbc0。当然,其他版本的偏移量会有所不同。

于 2012-10-25T18:40:41.623 回答