18/03/17 22:21
TheDarkJuster
Buona sera,
Mi sto dilettando a scrivere un so per x64 che USA uefi per farsi arrivare.
Fin qui tutto bene, ho anche scritto una funzione che mi stampa a video lo stato dei registri rax, rbx, cr0 e cr3.
Ora, sono consapevole che la modalità lunga (il funzionamento nativo delle CPU x64) prevede la paginazione sempre attiva, e infatti stampando cr0 vedo che i bit riguardanti la paginazione sono settati.
So che in modalità x64 la gdt è uguale alla x86, quindi non può descrivere tutta la memoria, quindi voglio:
Caricare la mia gdt, che rende "di libero accesso" tutta la memoria che può essere descritta con la gdt (perché voglio gestire solo la paginazione)
Ora... Non riesco a impostare la mia gdt.
A tal proposito mi sono informato: wiki.osdev.org/… e vedo che nel descrittore della gdt il riferimento all'inizio della gdt è espresso come indirizzo virtuale (logico, visto che in x64 disattivare la paginazione porta la CPU in uno stato di errore), quindi ho creato dello spazio all'interno del mio programma uefi e lo uso per contenere la gdt.
Il problema è che dopo aver fatto lgdt il sistema si riavvia, quindi sicuramente qualcosa sbaglio....
Suppongo che, per i motivi sopra elencati anche l'indirizzo del descrittore della gdt sia da intendere virtuale, ed è ciò che passo alla istruzione lgdt, eppure non funziona....
Qualcosa mi è sfuggito?
Mi sto dilettando a scrivere un so per x64 che USA uefi per farsi arrivare.
Fin qui tutto bene, ho anche scritto una funzione che mi stampa a video lo stato dei registri rax, rbx, cr0 e cr3.
Ora, sono consapevole che la modalità lunga (il funzionamento nativo delle CPU x64) prevede la paginazione sempre attiva, e infatti stampando cr0 vedo che i bit riguardanti la paginazione sono settati.
So che in modalità x64 la gdt è uguale alla x86, quindi non può descrivere tutta la memoria, quindi voglio:
Caricare la mia gdt, che rende "di libero accesso" tutta la memoria che può essere descritta con la gdt (perché voglio gestire solo la paginazione)
Ora... Non riesco a impostare la mia gdt.
A tal proposito mi sono informato: wiki.osdev.org/… e vedo che nel descrittore della gdt il riferimento all'inizio della gdt è espresso come indirizzo virtuale (logico, visto che in x64 disattivare la paginazione porta la CPU in uno stato di errore), quindi ho creato dello spazio all'interno del mio programma uefi e lo uso per contenere la gdt.
Il problema è che dopo aver fatto lgdt il sistema si riavvia, quindi sicuramente qualcosa sbaglio....
Suppongo che, per i motivi sopra elencati anche l'indirizzo del descrittore della gdt sia da intendere virtuale, ed è ciò che passo alla istruzione lgdt, eppure non funziona....
Qualcosa mi è sfuggito?
aaa