6
votes

Comment entrer en mode 64 bits sur un X86_64

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.

Quelqu'un peut-il connaître un exemple similaire pour entrer en mode 64 bits? (Via ou sans utiliser le mode 32 bits.)


0 commentaires

3 Réponses :


7
votes

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.


1 commentaires

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 "



2
votes

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:

Saisie en mode long

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.


0 commentaires

3
votes

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.


0 commentaires