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.

Respuestas a la pregunta(1)

Su respuesta a la pregunta