Detalle sobre MSR_GS_BASE en linux x86 64
Intenté averiguar los detalles de MACRO actual en el kernel de Linux. El código de montaje final de la corriente es:
movq %%gs:0xb000,%0
¡El código de arriba puede funcionar! Pero cuando imprimo el %% gs, su valor es 0, entonces el %% gs apunta al primer elemento de GDT NULL !! ¿Cómo funciona?
mov %%gs, %0
En cambio, la base de gs está en MSR_GS_BASE, y la corriente se puede reemplazar como:
/*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);
Mis preguntas son:
% gs apunta al primer elemento de GDT NULL !! Cómo funciona como se lee en MSR_GS_BASE, ¿es una característica de la CPU? Necesito algunas referencias sobre esto.