linux内核启动的入口介绍及说明

 更新时间:2025年10月23日 09:28:41   作者:赵民勇  
Linux内核启动分为固件初始化、内核解压、架构特定入口(如x86的startup_32/64、ARM的stext)和核心初始化阶段(如sched_init、mem_init),用户空间过渡阶段通过rest_init创建内核线程,完成文件系统挂载和控制权移交

Linux内核启动的入口点根据架构不同而有所差异

主要分为以下几个关键阶段和入口位置:

1.‌链接脚本定义的初始入口

内核镜像通过vmlinux.lds链接脚本指定入口符号,ARM架构通常为_textstext,x86架构则为startup_32startup_64。该入口位于.head.text段,由汇编代码实现。

2.‌架构相关入口函数

  • ARM架构‌:arch/arm/kernel/head.S中的stext函数,负责关闭MMU/D-Cache、校验处理器类型、创建初始页表等硬件初始化。
  • x86架构‌:arch/x86/boot/header.S中的startup_32(32位)或startup_64(64位),完成实模式到保护模式切换、解压内核等操作。

3.‌通用内核入口

架构相关初始化完成后,统一跳转到C语言编写的start_kernel()函数(位于init/main.c),这是内核初始化的核心入口,负责调度器、内存管理等子系统初始化。

4.‌启动流程关键节点

  • Bootloader加载压缩内核镜像并传递参数
  • 解压程序(如head.o/misc.o)解压内核主体
  • 执行架构特定的__primary_switch等函数切换到虚拟地址空间
  • 最终通过rest_init()创建init进程(用户态第一个进程)。

不同架构的入口实现虽存在差异,但均遵循“汇编初始化→跳转C代码→完成核心初始化”的流程模式。

Linux内核启动流程可分为以下几个关键阶段

固件初始化阶段

  • BIOS/UEFI执行硬件自检(POST)并加载引导程序
  • 传统BIOS读取MBR,UEFI通过ESP分区查找引导程序
  • GRUB等引导加载程序将压缩内核(vmlinuz)和initramfs加载到内存

内核解压阶段

  • 执行压缩内核头部的解压程序(head.o/misc.o)
  • 解压后跳转到架构特定入口:x86为startup_32/64,ARM为stext
  • 完成实模式到保护模式切换(32位)或直接进入长模式(64位)

早期初始化阶段

  • 关闭中断并初始化临时页表
  • 检测CPU特性(PAE/SSE等)和内存布局
  • 设置初始堆栈和异常处理机制

核心初始化阶段(start_kernel)

  • 初始化调度器(sched_init)和内存管理(mem_init)
  • 建立伙伴系统和slab分配器
  • 初始化中断子系统(IDT/PIC)和控制台
  • 加载驱动模块并探测硬件设备

用户空间过渡阶段

  • 通过rest_init()创建内核线程kthreadd
  • 挂载根文件系统并执行/sbin/init(或systemd)
  • 移交控制权给用户空间第一个进程(PID 1)

关键架构差异

  • x86:通过bootsect.S→setup.S→head.S三级跳转
  • ARM:直接由stext入口执行向量表和页表初始化
  • 嵌入式系统可能跳过initramfs直接挂载根文件系统

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • linux之如何杀掉指定端口

    linux之如何杀掉指定端口

    这篇文章主要介绍了linux之如何杀掉指定端口问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • CentOS 7将YUM源更换为国内源的保姆级教程

    CentOS 7将YUM源更换为国内源的保姆级教程

    在使用CentOS 7的过程中,默认的YUM源可能会导致下载速度较慢或连接不稳定,为了提高下载速度,您可以将YUM源更换为国内的镜像源,本文将提供一个简单的教程,帮助您轻松完成这一过程,需要的朋友可以参考下
    2025-04-04
  • Centos7下面如何配置静态IP

    Centos7下面如何配置静态IP

    本篇文章主要介绍了Centos7下面如何配置静态IP,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • CentOS8出现-bash:乱码问题及解决方法

    CentOS8出现-bash:乱码问题及解决方法

    这篇文章主要介绍了CentOS8出现-bash:乱码问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • Linux系统之dns域名解析全过程

    Linux系统之dns域名解析全过程

    这篇文章主要介绍了Linux系统之dns域名解析全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • Mysql常用命令 详细整理版

    Mysql常用命令 详细整理版

    MySQL是一个快速的、多线程、多用户和健壮的SQL数据库服务器。MySQL服务器支持关键任务、重负载生产系统的使用,也可以将它嵌入到一个大配置(mass-deployed)的软件中去。
    2010-12-12
  • 实例详解Linux下的Make命令

    实例详解Linux下的Make命令

    众所周知在Linux系统下的make 命令是系统管理员和程序员用的最频繁的命令之一。管理员用它通过命令行来编译和安装很多开源的工具,程序员用它来管理他们大型复杂的项目编译问题。下面这篇文章我们将用一些实例来讨论make命令背后的工作机制。有需要的朋友们可以看看。
    2016-12-12
  • 详解如何在 CentOS 7 中安装或升级最新的内核

    详解如何在 CentOS 7 中安装或升级最新的内核

    这篇文章主要介绍了详解如何在 CentOS 7 中安装或升级最新的内核,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03
  • Linux下Kafka单机安装配置方法(图文)

    Linux下Kafka单机安装配置方法(图文)

    Kafka是一个分布式的、可分区的、可复制的消息系统。它提供了普通消息系统的功能,但具有自己独特的设计。这个独特的设计是什么样的呢
    2015-12-12
  • Linux systemV消息队列和信号量详解

    Linux systemV消息队列和信号量详解

    这篇文章主要介绍了Linux systemV消息队列和信号量,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03

最新评论