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 の機能ですか? これについては参考文献が必要です。