我试图弄清楚Linux内核中MACRO当前的细节.当前的最终汇编代码是:
movq %%gs:0xb000,%0
Run Code Online (Sandbox Code Playgroud)
上面的代码可以工作!但是当我打印%% gs时,它的值为0,所以%% gs指向GDT NULL的第一项!! 这个怎么运作?
mov %%gs, %0
Run Code Online (Sandbox Code Playgroud)
相反,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);
Run Code Online (Sandbox Code Playgroud)
我的问题是:
%gs指向GDT NULL的第一项!! ?? 如何从MSR_GS_BASE读取它是一个CPU功能?我需要一些关于此的参考.
在使用GDB调试程序时,有什么方法可以读取特定于x86-64模型的寄存器,尤其是IA32_FS_BASE和IA32_GS_BASE?
使用像Intel的Pintool这样的动态工具包的解决方案是不太可取的,但是同样可以理解。