CPU 内核启动代码解析
2024-01-05 09:03:21
引言
内核启动过程是任何操作系统中最关键的阶段之一。在 Linux 中,此过程涉及一系列初始化步骤,包括 CPU 的初始化。本文将深入分析 Linux 内核 4.19.90 中的 CPU 内核启动代码,特别是 boot_cpu_init 函数。
CPU 初始化概述
CPU 初始化是内核启动过程的早期步骤之一。其目的是为每个 CPU 核心准备一个适当的环境,以便它们能够运行内核代码。此过程包括以下几个关键步骤:
- 启用分页
- 初始化时钟
- 初始化中断
- 初始化 SMP(对多核系统)
boot_cpu_init 函数
boot_cpu_init 函数位于 arch/x86/kernel/cpu.c 中。这是负责初始化每个 CPU 核心并为其准备运行环境的核心函数。
该函数执行以下步骤:
- 启用分页: 启用分页机制以提供虚拟内存支持。
- 初始化时钟: 初始化计时器子系统,包括时间戳计数器 (TSC) 和本地 APIC 时钟源。
- 初始化中断: 初始化中断控制器,包括可编程中断控制器 (PIC) 和高级可编程中断控制器 (APIC)。
- 初始化 SMP(多核系统): 如果系统有多个内核,则启动 SMP 子系统以启用对其他处理器的支持。
- 调用 arch_post_cpu_init: 调用特定于架构的 post-CPU 初始化函数,该函数可能执行其他架构特定的初始化任务。
SMP 支持
对于多核系统,boot_cpu_init 函数负责初始化 SMP 子系统。此子系统允许内核在所有可用内核上调度任务并管理对共享资源的访问。
boot_cpu_init 函数执行以下步骤来初始化 SMP:
- 初始化 APIC 寄存器以启用内核间中断。
- 启动 APIC 定时器以保持内核同步。
- 将当前 CPU 标记为引导 CPU。
- 将其他 CPU 标记为离线并启动 APIC 唤醒以唤醒它们。
中断管理
boot_cpu_init 函数还负责初始化中断控制器。这涉及设置中断向量表、注册中断处理程序并启用中断。
在 x86 架构中,boot_cpu_init 函数使用 PIC 和 APIC 控制器来管理中断。它设置中断向量表以将中断定向到适当的处理程序,并启用中断以允许 CPU 响应外部事件。
时钟管理
时钟管理是内核启动过程的另一个重要方面。boot_cpu_init 函数初始化计时器子系统,包括 TSC 和本地 APIC 时钟源。
TSC 是一款高精度时钟,用于内核调度和时间测量。本地 APIC 时钟源用于生成时钟中断,以通知 CPU 系统时间的变化。
总结
boot_cpu_init 函数是 Linux 内核启动过程中至关重要的函数。它负责初始化每个 CPU 核心并为其准备一个合适的运行环境。该函数处理分页、时钟、中断和 SMP 支持等关键方面,为内核的成功启动奠定了基础。