我写操作系统。由于我缺乏经验,我只能对 32 位(我的操作系统是 32 位)执行此操作,但我想将其设为 64 位。
我应该怎么办?
这是我专门用于汇编程序的内核代码:
.set MAGIC, 0x1badb002
.set FLAGS, (1<<0 | 1<<1)
.set CHECKSUM, -(MAGIC + FLAGS)
.section .multiboot
.long MAGIC
.long FLAGS
.long CHECKSUM
.section .text
.extern kernelMain
.global loader
loader:
mov $kernel_stack, %esp
push %eax
push %ebx
call kernelMain
_stop:
cli
hlt
jmp _stop
.section .bss
.space 2*1024*1024; # 2 megabytes of space
kernel_stack:
当然,它还没有完成,但它已经接近了。还有更多信息:我用Ubuntu
编译我的 GNU 汇编器代码;asC++ 代码使用g++.
如果您发现重复,请发布链接。
上面的代码与操作系统的代码一点也不相似。您只需调用 kernelMain 函数,然后无限循环等待硬件中断。无需转换为 64 位模式,此代码在任何模式下看起来都相同。
在 Intel x86 处理器上切换到 64 位模式是通过设置扩展功能启用寄存器 (EFER) 中的 LME 标志(位 8)来完成的。请参阅英特尔® 64 和 IA-32 架构软件开发人员手册,第 3 卷:系统编程指南,第 2.2.1 节
填充此寄存器的指令是wrmsr。
之后,您需要填写 GDT,使其包含一个带有 64 位模式标志(描述符中为 21 位)的代码段,并相应地执行该段中的代码。您可以在此处阅读更多信息:https ://wiki.osdev.org/User:Stephanvanschaik/Setting_Up_Long_Mode