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