Подробно о MSR _GS _BASE в linux x86 64

Я попытался выяснить подробности текущего MACRO в ядре Linux. Окончательный ассемблерный код текущего::

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, является ли это функцией процессора? Мне нужны некоторые ссылки по этому поводу.

6
задан Peter Cordes 19 April 2019 в 02:08
поделиться