内核启动
约 715 字大约 2 分钟
2025-11-10
1.前提基础
本教程实际上是阅读 这篇著名的内核启动教程,作者很爱好底层逻辑。
常见的汇编语法主要分为两大体系:Intel 语法 和 AT&T 语法,两者在指令格式、操作数顺序、寄存器命名等方面有显著差异。
- Intel 语法 由
Intel公司定义,广泛用于x86/x86-64架构的汇编程序(如MASM、NASM、FASM等),Windows平台的汇编开发多采用此语法。核心特点:- 操作数顺序:目标操作数在前,源操作数在后(如
mov eax, 123表示将123存入eax寄存器)。 - 寄存器命名:直接使用寄存器名(如
eax、ebx),无需前缀。 - 立即数:直接写数值(如
123、0x1A),无需前缀。 - 内存寻址:使用
[ ]表示内存地址(如mov eax, [ebx]表示从ebx指向的内存地址读取数据到 eax)。 - 指令前缀:段寄存器使用
:分隔(如mov eax, ds:[ebx])。
- 操作数顺序:目标操作数在前,源操作数在后(如
- AT&T 语法 由
AT&T公司定义,最初用于Unix系统,现在是GNU工具链(如gas、gcc生成的汇编)的默认语法,在Linux、macOS等类Unix系统中广泛使用。核心特点:- 操作数顺序:源操作数在前,目标操作数在后(与
Intel相反,如movl $123, %eax表示将 123 存入 eax 寄存器)。 - 寄存器命名:必须加
%前缀(如%eax、%ebx)。 - 立即数:必须加
$前缀(如$123、$0x1A)。 - 内存寻址:使用
( )表示内存地址,且格式为偏移量(基址寄存器, 索引寄存器, 比例因子)(如movl 4(%ebx), %eax表示从ebx + 4指向的内存地址读取数据到eax)。 - 指令后缀:通过后缀指定操作数长度(如
movb表示字节操作,movw表示字操作,movl表示双字操作,movq表示四字操作)。 - 段寄存器:使用
%前缀,且通过%segreg:表示(如movl %ds:(%ebx), %eax)。
- 操作数顺序:源操作数在前,目标操作数在后(与
2.开机启动
虽然这是一系列关于 Linux 内核的文章,但我们不会直接从内核代码入手。当你按下笔记本电脑或台式电脑的电源按钮时,它就开始工作了。主板会向 电源 设备发送信号。电源接收到信号后,会为电脑提供适量的电力。主板接收到 电源正常信号 后,会尝试启动 CPU。CPU 会重置其寄存器中的所有残留数据,并为每个寄存器设置预定义的值。
80386 及更高版本的 CPU 在计算机复位后,会在 CPU 寄存器中定义以下预定义数据:
IP 0xfff0
CS selector 0xf000
CS base 0xffff0000