1. CPU初始化概述
1.1 初始复位状态
复位向量: 当CPU复位时,它会从一个固定的地址(通常为0xFFFFFFF0)开始执行。这个地址被称为复位向量。
初始状态: CPU在复位后处于实模式,使用16位地址和数据总线,CS寄存器被设置为0xF000,IP寄存器被设置为0x0000。
1.2 切换到保护模式
保护模式: 保护模式允许CPU使用32位地址和数据总线,支持分段和分页机制。
切换步骤:
设置分段寄存器:初始化GDT(Global Descriptor Table)。
设置CR0寄存器:将CR0寄存器的PE位(Protection Enable)设置为1。
跳转到保护模式:使用长跳转指令(如ljmp)跳转到新的段选择符和偏移地址。
1.3 初始化CPU寄存器
通用寄存器:初始化EAX、EBX、ECX、EDX等通用寄存器。
控制寄存器:初始化CR0、CR2、CR3、CR4等控制寄存器。
其他寄存器:初始化DS、ES、FS、GS等段寄存器。
1.4 初始化CPU特性
CPUID指令:使用CPUID指令获取CPU的特性和功能。
特征检测:检测CPU是否支持某些高级特性,如MMX、SSE、AVX等。
2. 编写CPU初始化模块
2.1 创建项目目录
在EDK II目录下创建一个新的项目目录:
mkdir CpuInitialization
cd CpuInitialization
2.2 创建项目文件
2.2.1 创建.inf文件
创建一个名为CpuInitialization.inf的文件,内容如下:
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = CpuInitialization
FILE_GUID = 12345678-1234-1234-1234-1234567890AB
MODULE_TYPE = UEFI_DRIVER
VERSION_STRING = 1.0
UEFI_SPECIFICATION_VERSION = 0x00020000
PI_SPECIFICATION_VERSION = 0x0001000C
LIBRARY_CLASS = CpuInitialization|DXE_DRIVER
CONSTRUCTOR = CpuInitializationConstructor
[Sources]
CpuInitialization.c
[Packages]
MdePkg/MdePkg.dec
Uefi/Uefi.dec
[LibraryClasses]
UefiLib
BaseLib
[Protocols]
[Guids]
[Ppis