相关疑难解决方法(0)

关于linux x86 64中MSR_GS_BASE的详细信息

我试图弄清楚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功能?我需要一些关于此的参考.

assembly x86-64 linux-kernel memory-segmentation

6
推荐指数
1
解决办法
3087
查看次数

使用GDB读取MSR

在使用GDB调试程序时,有什么方法可以读取特定于x86-64模型的寄存器,尤其是IA32_FS_BASE和IA32_GS_BASE?

使用像Intel的Pintool这样的动态工具包的解决方案是不太可取的,但是同样可以理解。

x86 gdb x86-64 msr memory-segmentation

4
推荐指数
3
解决办法
845
查看次数

标签 统计

memory-segmentation ×2

x86-64 ×2

assembly ×1

gdb ×1

linux-kernel ×1

msr ×1

x86 ×1