Detalhe sobre MSR_GS_BASE no linux x86 64

Eu tentei descobrir os detalhes da corrente MACRO no kernel Linux. O código final de montagem da corrente é:

movq %%gs:0xb000,%0

O código acima pode funcionar! Mas quando eu imprimir o %% gs, seu valor é 0, então o %% gs aponta para o primeiro item do GDT NULL !! ?? Como funciona?

mov %%gs, %0

Em vez disso, a base de gs está em MSR_GS_BASE e a corrente pode ser substituída 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);

Minhas perguntas são:

% gs aponta para o primeiro item do GDT NULL !! ?? Como funciona como lido em MSR_GS_BASE, é um recurso de CPU? Eu preciso de algumas referências sobre isso.

questionAnswers(1)

yourAnswerToTheQuestion