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使用grub命令行引导进入windows系统

    Linux使用grub命令行引导进入windows系统

    这篇文章介绍了在误删Linux EFI引导后如何使用GRUB命令行进入Windows系统的方法,步骤包括设置启动目录、使用chainloader加载Windows启动文件、以及在GRUB命令行无响应时如何重启
    2026-01-01
  • Apache中利用mod_rewrite实现防盗链

    Apache中利用mod_rewrite实现防盗链

    自从上次在博客中推荐《you are my everything》以后,服务器的流量突然多了起来,有几次甚至导致了VPS的当机。后来经过分析:盗链这个MP3的网页包括诸如QQ空间、校内网空间、更有甚者还放到了Taobao小店、个人博客也有不少,全部作为了背景音乐,并且导致各种爬虫疯狂抓取这个文件。找到了问题原因就只有一个办法了,就是利用Apache的mod_rewrite模块把盗链行为拒之门外。
    2008-04-04
  • Ubuntu系统下安装ImageMagick出错的解决过程

    Ubuntu系统下安装ImageMagick出错的解决过程

    由于项目需要, 所以要在Ubuntu下面安装ImageMagick,但在安装过程中遇到了些问题,通过查找相关的资料最终得以解决了,所以下面这篇文章主要给大家介绍了关于Ubuntu系统下安装ImageMagick出错的解决过程,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-07-07
  • Linux中特殊权限SUID、SGID与SBIT的深入讲解

    Linux中特殊权限SUID、SGID与SBIT的深入讲解

    linux对文件的权限管理简直是让人叹为观止,所以这篇文章主要给大家介绍了关于Linux中特殊权限SUID、SGID与SBIT的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-09-09
  • Linux修改用户密码使用期限账号到期时间问题

    Linux修改用户密码使用期限账号到期时间问题

    在Linux系统中,通过chage命令能够管理和查看用户密码的使用期限,特别是对root用户的密码过期时间进行设置,chage命令可以设置密码过期时间,提醒用户在密码过期前修改密码,例如,可以设定root用户的密码180天后过期,并在到期前15天提醒用户修改密码
    2024-10-10
  • VSCode远程连接Linux部署的Docker实践

    VSCode远程连接Linux部署的Docker实践

    文章介绍了如何在远程Linux上使用VSCode进行Docker开发,包括确保Docker运行、安装VSCode插件(如Docker、DockerDX、ContainerTools)以及这些插件的功能和使用场景
    2026-02-02
  • Linux 4.0 不再需要重启

    Linux 4.0 不再需要重启

    在大多数的服务器或者数据中心里,喜欢用linux的一个原因是你不需要频繁的进行重启操作。诚然,某些关键性的补丁必须要进行重启,但你也可以等到数月后再做此操作。现在,得益于 linux 内核的最新更新 你也许可以数年间都不用重启。
    2015-03-03
  • Linux学习之CentOS(二十九)--Linux网卡高级命令、IP别名及多网卡绑定的方法

    Linux学习之CentOS(二十九)--Linux网卡高级命令、IP别名及多网卡绑定的方法

    本篇文章详细的介绍了Linux网卡高级命令、IP别名及多网卡绑定的实现方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2016-11-11
  • linux记录用户登录日志与命令执行日志方式

    linux记录用户登录日志与命令执行日志方式

    文章介绍了在/etc/profile文件末尾增加代码并执行source使其生效后,不同用户会在/var/log/history目录下以用户名为目录名的子目录中,进入对应目录后有以用户登录时间及IP为名字的文件,文件内容为用户执行命令的日志信息
    2024-12-12
  • Linux lvm实例之如何创建一个专用于MySQL数据存储的LVM卷组

    Linux lvm实例之如何创建一个专用于MySQL数据存储的LVM卷组

    这篇文章主要介绍了使用Linux创建一个专用于MySQL数据存储的LVM卷组的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05

最新评论