我试图找出 Linux 内核中当前 MACRO 的详细信息。current的最终汇编代码为:
movq %%gs:0xb000,%0
上面的代码可以工作!但是当我打印 %%gs 时,它的值为 0,所以 %%gs 指向 GDT NULL 的第一项!!??这个怎么运作?
mov %%gs, %0
相反,gs 的基数在 MSR_GS_BASE 中,当前可以替换为:
/*0xb000 is the offset of per_cpu__current_task*/
cur_task = (unsigned long*)(x86_rdmsr64(MSR_GS_BASE) + 0xb000);
println("cur_task:%p",*cur_task);
我的问题是:
%gs 指向 GDT NULL 的第一项!!?? 从 MSR_GS_BASE 读取它是如何工作的,它是 CPU 特性吗?我需要一些关于此的参考。