DECLARE_PER_CPU(struct task_struct *, current_task);
#define this_cpu_read_stable(var) percpu_stable_op("mov", var)
static __always_inline struct task_struct *get_current(void)
{
return this_cpu_read_stable(current_task);
}
#define percpu_stable_op(op, var)
({
typeof(var) pfo_ret__;
switch (sizeof(var)) {
case 8:
asm(op "q "__percpu_arg(P1)",%0"
: "=r" (pfo_ret__)
: "p" (&(var)));
break;
}
pfo_ret__;
})
current_task 为一个 struct task_struct 类型的指针,追踪宏调用,在x86-64 下命中了 case 8: 的汇编代码, 展开的代码为
asm("mov" "q ""%%""gs" ":" "%" "P1"",%0" : "=r" (pfo_ret__) : "p" (&(current_task)));
// 变换一下为
asm("movq %%gs:%P1, %0" : "=r"(pfo_ret__) : "p"(&(current_task)));
这行代码的含义为将 约束输入部分必须为有效的地址(p约束), 将CPU id(通过段寄存器gs和偏移通过GDT得到,这里后文分析了)通过寄存器(r约束)赋值给 pfo_ret__.
参考
GCC文档
C语言ASM汇编内嵌语法zz
总结
以上所述是小编给大家介绍的C 表达式中的汇编指令,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对易采站长站网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!










