Assembly 如何在x86_64上进入64位模式

Assembly 如何在x86_64上进入64位模式,assembly,x86-64,bare-metal,Assembly,X86 64,Bare Metal,我在xv6中找到了一个很好的组件,它向我展示了如何从16位保护模式移动到32位保护模式 有人知道进入64位模式的类似例子吗?(通过或不使用32位模式。)要启用64位功能,必须将CPU切换到长模式 要在64位x86处理器(x86-64)上进入长模式,请执行以下操作: 对于x86(以及一些其他体系结构)的底层信息来说,是一个很好的资源。例如,在长模式下是一个非常好的writeup,以及如何从保护模式和直接从实模式进入它: 进入长模式 进入长模式可以从实际模式和保护模式进行, 但是,“英特尔”和AMD

我在xv6中找到了一个很好的组件,它向我展示了如何从16位保护模式移动到32位保护模式


有人知道进入64位模式的类似例子吗?(通过或不使用32位模式。)

要启用64位功能,必须将CPU切换到长模式

要在64位x86处理器(x86-64)上进入长模式,请执行以下操作:

对于x86(以及一些其他体系结构)的底层信息来说,是一个很好的资源。例如,在长模式下是一个非常好的writeup,以及如何从保护模式和直接从实模式进入它:

进入长模式 进入长模式可以从实际模式和保护模式进行, 但是,“英特尔”和AMD64手册仅介绍了受保护模式。 早期的AMD文档解释了这个过程是从真实模式开始的 嗯


如果要直接转到64位模式,可以执行以下操作:

%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.
%x定义PML4_基0x70000;PML4表的地址。
%xdefine CR0_PE 1官方文件:“第9.8.5节初始化IA-32e模式”
%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.