J'ai trouvé un bon assemblage dans XV6 https: // github .COM / CHRISDEW / XV6 / BLOB / MASTER / BOOTASASM.S qui me montre comment passer d'un mode protégé de 16 bits à 32 bits. P>
Quelqu'un peut-il connaître un exemple similaire pour entrer en mode 64 bits? (Via ou sans utiliser le mode 32 bits.) P>
3 Réponses :
Pour activer les capabophités 64 bits, vous devez éteindre la CPU en mode long.
Pour entrer en mode long sur un processeur X86 64 bits (X86-64): P>
If paging is enabled, disable paging. If CR4.PAE is not already set, set it. Set IA32_EFER.LME = 1. Load CR3 with a valid PML4 table. Enable paging. At this point you will be in compatibility mode. A far jump may be executed to switch to long mode. However, the offset must not exceed 32-bit.
Documentation officielle: Manuel du développeur de logiciels Intel® 64 et IA-32, Volume 3A: Guide de programmation système: " Section 9.8.5 Initialisation du mode IA-32E "
OSDEV est une bonne ressource pour les informations de bas niveau sur x86 (et un peu sur d'autres architectures ). Par exemple, Cet article est une très bonne écriture sur le mode long et comment entrer IT, à partir de mode protégé et directement à partir du mode réel: P>
Saisie en mode long h1>
Saisie en mode long peut être effectué à la fois en mode réel et en mode protégé, Cependant, seul le mode protégé est couvert dans les manuels Intel et AMD64. La documentation anticipée d'AMD explique ce processus fonctionne de mode réel comme bien. p> blockQuote>
Si vous voulez aller directement au mode 64 bits, vous pouvez faire quelque chose comme ceci:
%xdefine PML4_BASE 0x70000 ; Address of PML4-table. %xdefine CR0_PE 1 << 0 %xdefine CR0_PG 1 << 31 %xdefine CR4_PAE 1 << 5 %xdefine CR4_PGE 1 << 7 %xdefine EFER_LME 1 << 8 mov eax, CR4_PAE | CR4_PGE ; Set PAE- (Physical Address Extensions) and mov cr4, eax ; PGE- (Page Global Enable). mov eax, PML4_BASE ; Address of PML4. mov cr3, eax ; Point CR3 to PML4. mov ecx, 0xC0000080 ; EFER MSR selector. rdmsr ; Read from model specific register. or eax, EFER_LME ; Set LME (Long Mode Enable). wrmsr ; Write to model specific register. mov ebx, cr0 ; Get CR0. or ebx, CR0_PG | CR0_PE ; Set PG (Paging) and PE (Protection Enabled). mov cr0, ebx ; Set flags to CR0. lgdt [GDT.ptr] ; Load global descriptor table. jmp GDT.code_0:long_mode_entry ; Jump to long mode.