Я пишу небольшой загружаемый модуль ядра 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, модуль будет убит.
Спасибо за Ваше внимание!