当前位置: 代码网 > 服务器>服务器>Linux > linux内核启动的入口介绍及说明

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

2025年10月23日 Linux 我要评论
linux内核启动的入口点根据架构不同而有所差异主要分为以下几个关键阶段和入口位置:1.‌链接脚本定义的初始入口‌内核镜像通过vmlinux.lds链接脚本指定入口符号,arm架构

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直接挂载根文件系统

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com