当前位置: 首页 > news >正文

内核篇 – Linux内核编译、裁剪、启动与交互

欢迎来到系统移植的第三篇文章,本文详细介绍了Linux内核的编译、裁剪与启动流程。主要内容包括:1. 内核概念与职责,包括进程管理、内存管理等功能;2. 内核编译流程详解,从获取源码到生成镜像文件;3. 内核裁剪方法,通过menuconfig移除不需要的模块;4. 完整的启动流程分析,从uboot跳转到内核初始化;5. 内核与用户空间的交互方式;6. 内核调试技巧及常见问题解决方法。文章以I.MX6ULL开发板为例,提供了实用的操作指南和注意事项,适合嵌入式开发者参考。


一、内核

1.什么是内核?

(1)内核(Kernel)是操作系统的核心部分,负责管理计算机的硬件资源,并为上层应用程序提供运行环境。可以把它理解为“硬件与软件之间的翻译官”或“资源大管家”。

(2)内核的职责:

职责说明
进程管理创建、调度、终止进程;决定哪个程序占用 CPU、运行多久(如 CFS 调度算法)
内存管理分配和回收内存,通过虚拟地址空间(MMU)让每个进程以为自己独占全部内存
文件系统管理管理磁盘/Flash 上的文件和目录,提供统一的文件操作接口(open、read、write)
设备驱动控制硬件外设(串口、网卡、USB、GPIO 等),为上层提供标准化访问方式
网络管理处理网络协议栈(TCP/IP),收发网络数据包

2.内核版本与来源

在 I.MX6ULL 开发板上,我使用的 Linux 内核版本是4.1.15。这个版本由 NXP 官方针对 I.MX6ULL 进行适配和优化,正点原子等厂商在其基础上做了进一步的驱动开发和配置,最终提供给开发者。

内核源码可以从以下途径获得:

  • 厂商(NXP)官网下载

  • 开发板厂商(如正点原子)提供的资料包

  • 老师或公司提供的代码仓库

内核源码是开源的,遵循 GPL 协议,我们可以在遵守协议的前提下自由使用和修改。

uname -r //查询内核版本


二、内核编译流程详解

编译内核之前,请确保已安装交叉编译工具链(第一篇内容)并配置好 PATH。

步骤1:获取并解压内核源码

tar -xjf linux-4.1.15.tar.bz2
cd linux-4.1.15

步骤2:配置内核

厂商通常会提供一个默认配置文件(defconfig),用于生成适合该开发板的.config文件。

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_alientek_emmc_defconfig

或者将厂家提供的配置文件拷贝为.config驱动选项默认配置文件中

cp arch/arm/configs/imx_alientek_emmc_defconfig .config

步骤3:编译内核镜像

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage -j4

如果在对应内核源码的顶层Makefile中,已经通过?=为这两个变量设置了默认值:

ARCH ?= arm

CROSS_COMPILE ?= arm-linux-gnueabihf-

就只需直接make zImage即可。当然,如果换一个没有预设这些变量的内核源码,我会手动加上它们,或者通过export环境变量来指定。

步骤4:编译设备树(dtb)

生成的文件位于arch/arm/boot/dts/imx6ull-alientek-emmc.dtb

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx6ull-alientek-emmc.dtb

步骤5:准备 tftp 共享目录

zImagedtb文件拷贝到 Ubuntu 的 tftp 共享目录(如/var/tftp或自定义目录),以便开发板通过tftp命令下载。

cp arch/arm/boot/zImage /var/tftp/
cp arch/arm/boot/dts/imx6ull-alientek-emmc.dtb /var/tftp/


三、内核裁剪

1,为什么需要裁剪?

  • 减少内核镜像(zImage)的体积,节省存储空间(尤其是 Flash 有限的设备)

  • 移除无用的驱动,加快内核启动速度

  • 避免与后续自己编写的驱动产生冲突(例如 LED、KEY 驱动)

2,实际操作

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

通过图形化菜单找到需要裁剪的模块,按N键将其排除(或取消*号)。

3.常见裁剪项

  • 移除内核自带的 LED 驱动:Device Drivers → LED Support → 取消选择

  • 移除按键驱动:Device Drivers → Input device support → 取消不需要的按键驱动

  • 移除无用的文件系统、网络协议、调试选项等

修改完成后,保存退出,.config文件会被更新。然后重新编译内核:

make zImage

四、内核启动流程(从 uboot 跳转开始)

1.Uboot:

内核启动前,通过uboot完成硬件、软件的初始化,将内核从emmc搬移到内存,并完成向内核的传参,引导内核启动。

2.kernel

(1)解压内核映像,跳转到解压后的内核入口点。

(2)执行init目录下main.c中的start_kernel函数完成对内核的初始化:

①完成对设备树的解析

②初始化控制台:设置内核的打印机之,以便后续的输出可以显示出来。

③初始化内存管理子系统:建立初始的内存管理结构,准备好内存分配机制。

④启动中断和处理机制:设置和启动中断处理机制,使得内核可以响应硬件中断。

⑤初始化内核调度器:初始化内核调度器,以便管理进程调度。

⑥加载初始进程:内核创建并启动第一个用户空间进程

3.rootfs:

挂载根文件系统(内核启动后挂载的第一个文件系统)(挂载的目的是因为内核只提供了运行环境和系统调用,所以用户态的程序和库都必须从根文件读取)

4.init:

内核 执行第一个用户空间程序(通常是/linuxrc/sbin/init)。此后,内核线程“退居后台”,进程调度和管理由 init 进程负责,系统进入用户态。


五、内核与用户空间的交互方式

(1)系统调用(System Call)

应用程序调用open()read()write()ioctl()等 C 库函数,触发软中断(如swi),进入内核态执行相应驱动或内核函数。

(2)mmap 内存映射

将内核空间的物理内存映射到用户空间,用户程序可以直接读写(例如 framebuffer、寄存器区域),效率高。

(3)copy_to_user / copy_from_user

驱动程序在内核态通过这两个函数安全地在用户空间和内核空间之间拷贝数据。


六、内核调试与常见问题

1.查看内核日志:dmesg
dmesg | tail -20 # 查看最后20条内核日志 dmesg -c # 清除日志缓冲区

内核启动时的打印信息(如硬件检测、驱动加载、挂载文件系统等)都可以通过dmesg查看。

2.内核恐慌(Kernel Panic)

当内核遇到无法恢复的致命错误时,会停止运行并打印Kernel panic信息。常见原因:

  • 驱动不兼容:编译进内核的驱动与当前硬件冲突,内核无法正确管理硬件设备

  • 应用程序或者脚本进行错误的系统调用,内核陷入无法处理的状态

  • 设备树错误:硬件资源描述错误,导致内核无法正确初始化外设

  • 根文件系统挂载失败root=参数错误或 NFS 服务未就绪

  • 内存越界:内核代码或驱动破坏了关键数据结构

遇到内核恐慌时,仔细查看最后的打印信息,通常能定位到具体函数或文件。


七. 补充:vmlinux、Image、zImage、uImage 的区别

文件说明
vmlinux内核编译生成的原始 ELF 文件,未压缩,含有调试符号,体积大,一般用于调试
Image从 vmlinux 中提取的纯二进制内核,未压缩
zImage对 Image 进行 压缩,并在前面加上自解压代码,体积小,是常用格式
uImage在 zImage 前面加上一个 64 字节的 U-Boot 头(包含内核类型、加载地址、大小等),U-Boot 可以直接识别

bootz命令中,使用的是zImage(不是 uImage)。bootz专门用于启动 zImage。

http://www.jsqmd.com/news/727915/

相关文章:

  • 如何在老旧电脑上免费安装Windows 11:终极绕过硬件限制指南
  • 用了半年太阳能路灯,效果到底怎么样? - 速递信息
  • 5分钟免费搞定NVIDIA显卡色彩校准:novideo_srgb终极指南
  • 题解:AcWing 6027 后缀表达式的值
  • 终极网盘直链下载助手:一键获取八大网盘真实下载地址,告别限速烦恼
  • DeepSeek-V4深度解析:技术效率革命如何重塑大模型产业格局
  • 抖音批量下载工具终极指南:免费下载视频、图集、音乐和直播回放
  • 重庆家教真的能帮孩子快速提分吗? - 速递信息
  • 如果把你的三餐全部换成河南人的饮食,你能坚持多久?
  • 从极验滑块验证码看自动化测试:如何用Python模拟用户滑动行为?
  • vulhub系列-83-Gears of War: EP#1(超详细)
  • GPT-Image-2:角色一致性与批量分镜生成实战指南
  • 山洋电气推出60℃耐高温快速打样服务
  • 舒客宝贝咨询伙伴知行咨询 在浙大举办婴童行业私享会 - 速递信息
  • 从三星V9到长江存储Xtacking 4.0:一文看懂2024年各家3D NAND技术路线图(附避坑指南)
  • 终极Illustrator批量替换脚本:5分钟学会10倍效率提升技巧
  • 基金委青年项目a类答辩ppt制作案例模板
  • 原来装太阳能路灯能省这么多电费? - 速递信息
  • 收藏!大模型工程师的日常揭秘:从训练到部署的全流程解析
  • YOLOv5训练loss全是nan?可能是PyTorch版本在‘捣鬼’,实测1.9.1+cu102组合避坑
  • CTF新手必看:Base64隐写术原来这么简单,一个Python脚本就能搞定
  • 濮阳GEO选哪家才不踩坑? - 速递信息
  • 2026年B2B企业公关软文分发服务商选型,关投强公关软文分发效果解析 - 发稿平台推荐
  • net-snmp安装和使用
  • 为内部工具集成 AI 能力时如何选择与接入合适的大模型
  • 从一根琴弦到万物振动:用Python和NumPy手把手复现Fourier分析的诞生时刻
  • 如何让普通鼠标在macOS上超越触控板:Mac Mouse Fix终极指南
  • 2026年阿里云部署OpenClaw/Hermes Agent详解+百炼token Plan速成全攻略教程
  • 非涉密系统
  • Chromium 窗口残留问题深度解析:事件分发与拖拽中断的矛盾与解决