Адрес переменной для каждого процессора

Я пишу небольшой загружаемый модуль ядра Linux для версии 2.6.32, работающий на x86-64 SMP.

Мой вопрос: есть ли способ получить смещение адреса переменной для каждого процессора, объявленной в ядре. Под смещением я подразумеваю смещение адреса от базы percpu, которая находится в регистре gs. В частности, я пытаюсь найти смещение переменной current_task, которая, как мне кажется, является указателем на структуру задачи текущей задачи.

Я смотрю на arch / x86 / include / asm / current.h, в котором есть функция get_current (). Эта функция считывает переменную current_task для каждого процессора с помощью макроса percpu_read_stable. Насколько я понимаю, percpu_read_stable в основном расширяется в подпрограмму asm, подобную этой:

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

Это находится в arch / x86 / include / asm / percpu.h. Я хочу прочитать смещение после gs из моего модуля. Если я попытаюсь просто выполнить printk с переменной per_cpu_current_task, модуль будет убит.

Спасибо за Ваше внимание!


person Abhi    schedule 23.10.2012    source источник


Ответы (1)


Хорошо, я вычислил смещение для этого конкретного символа. Этот экспортируется ядром. Следовательно, есть запись в / proc / kallsyms

000000000000cbc0 D per_cpu__current_task

Таким образом, смещение для этой конкретной переменной равно 0xcbc0. Конечно, смещение будет отличаться для других версий.

person Abhi    schedule 25.10.2012