我尝试了解Linux内核中MACRO电流的详细信息。
current的最终汇编代码如下:
上面的代码可以正常工作!但当我打印%%gs时,它的值为0,所以%%gs指向GDT NULL的第一项!!?? 它是如何工作的?
相反,gs的基础在MSR_GS_BASE中,当前可被替换为:
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的特性吗?我需要一些关于此的参考资料。