Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
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: http://wiki.osdev.org/Global_Descriptor_Table 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....
Dopo la lgdt la ret non ritorna dove ti aspetti. Quello che è stato messo nello stack prima della lgdt NON vale dopo la lgdt.
Sicuramente una ret di una call fatta prima di cambiare modalità fa un disastro.
La lgdt non va chiamata in quel modo ma nel main (nel flusso principale programma) e va seguita da una
jmp GDT64.Code:Target64
che passi al segmento in long mode appena creato. E da lì parte l'inizializzazione di stack, registri e via verso il codice 64
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
Ho visto questo: https://github.com/luksow/OS e volevo riproporre la stessa cosa per un sistema x64, però alcune cose non mi sono chiare:
1) perchè fa [esp+4] per trovare l'indirizzo della gdt? La calling convention non dovrebbe specificare che è in eax?
2) perchè lui riesce a saltare indietro al main e io no?