1. Linux内核源码获取与编译
1.1 内核源码获取与版本选择
Linux内核源码的官方发布站点是kernel.org,这里提供三种主要版本分支:
- Mainline(主线版本):由Linus Torvalds维护的最新开发版本,包含所有新特性和改进,但稳定性可能不足
- Stable(稳定版本):经过测试的稳定发布版本,适合大多数生产环境
- Longterm(长期支持版本):提供长期维护(通常2-6年)的特别稳定版本,适合企业级应用
实际开发建议:嵌入式项目优先选择长期支持版本(如5.15 LTS),桌面/服务器可根据需求选择稳定版
源码目录结构解析:
code复制arch/ # 处理器架构相关代码(ARM/x86等)
drivers/ # 设备驱动代码
fs/ # 文件系统实现
include/ # 内核头文件
init/ # 系统初始化代码
kernel/ # 核心子系统(调度、信号等)
mm/ # 内存管理
net/ # 网络协议栈
1.2 芯片厂商SDK包解析
芯片厂商(如Rockchip、NXP)提供的SDK通常包含三大核心组件:
-
Bootloader(通常为U-Boot):
- 负责硬件初始化
- 加载内核镜像
- 提供预启动环境
-
Linux内核:
- 已适配芯片特定外设
- 包含专用驱动和补丁
- 优化电源管理和性能
-
根文件系统:
- 包含BusyBox等基础工具
- 设备节点配置
- 启动脚本和配置文件
典型SDK目录结构示例:
code复制buildroot/ # 文件系统构建工具
kernel/ # 定制化内核源码
uboot/ # 移植版U-Boot
docs/ # 芯片手册和参考设计
tools/ # 烧录和调试工具
1.3 内核编译实战
以i.MX6ULL平台为例的编译流程:
bash复制# 设置交叉编译工具链
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
# 配置内核(使用默认配置)
make imx_v7_defconfig
# 图形化配置(可选)
make menuconfig
# 编译内核镜像
make zImage -j$(nproc)
# 编译设备树
make dtbs
# 编译模块(如需)
make modules
关键输出文件:
arch/arm/boot/zImage:压缩内核镜像arch/arm/boot/dts/*.dtb:设备树二进制文件drivers/*/*.ko:可加载内核模块
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 字符设备驱动基础框架
2.1 最小驱动模块结构
一个最简单的可加载模块需要以下要素:
c复制#include <linux/module.h>
#include <linux/init.h>
/* 模块加载函数 */
static int __init demo_init(void)
{
printk(KERN_INFO "Driver loaded\n");
return 0;
}
/* 模块卸载函数 */
static void __exit demo_exit(void)
{
printk(KERN_INFO "Driver unloaded\n");
}
/* 注册入口/出口函数 */
module_init(demo_init);
module_exit(demo_exit);
/* 元信息声明 */
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("Minimal driver example");
2.2 关键机制解析
-
模块加载/卸载:
insmod:直接加载单个模块,不处理依赖modprobe:自动处理依赖关系,需先将模块放入/lib/modules/$(uname -r)/
-
printk输出查看:
bash复制# 查看内核日志 dmesg # 实时监控内核输出 tail -f /var/log/kern.log -
模块信息查询:
b复制
