Linux学习笔记--insmod 命令

命令作用

insmod ap3216c_drv.ko 是Linux内核模块加载命令,用于将编译好的AP3216C传感器驱动模块插入到运行中的内核。

详细执行流程

阶段1:用户空间执行命令

复制代码
insmod ap3216c_drv.ko

阶段2:内核模块加载

复制代码
// 内核调用模块初始化函数
static int __init i2c_driver_ap3216c_init(void)
{
    printk("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);
    return i2c_add_driver(&i2c_ap3216c_driver);
}

执行步骤

  1. 内核解析.ko文件格式

  2. 分配模块需要的内存空间

  3. 执行模块的初始化函数 i2c_driver_ap3216c_init()

阶段3:注册I2C驱动

复制代码
i2c_add_driver(&i2c_ap3216c_driver);

内核内部操作

  1. i2c_ap3216c_driver 添加到内核的I2C驱动链表

  2. 遍历所有已注册的I2C适配器(总线)

  3. 在每个适配器上查找匹配的设备

阶段4:设备匹配过程

内核检查两种匹配方式:

方式1:设备树匹配
复制代码
static const struct of_device_id of_match_ids_ap3216c[] = {
    { .compatible = "lite-on,ap3216c", .data = NULL },
    { /* END OF LIST */ },
};

匹配流程

复制代码
# 检查设备树中是否有兼容节点
/sys/firmware/devicetree/base/... 查找 compatible = "lite-on,ap3216c"
方式2:传统ID匹配
复制代码
static const struct i2c_device_id ap3216c_ids[] = {
    { "ap3216c", (kernel_ulong_t)NULL },
    { /* END OF LIST */ }
};

匹配流程:检查I2C总线上是否有名称为"ap3216c"的设备

阶段5:调用probe函数(如果匹配成功)

复制代码
static int ap3216c_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
    printk("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);
    ap3216c_client = client;
    
    // 字符设备注册三步曲
    major = register_chrdev(0, "ap3216c", &ap3216c_ops);
    ap3216c_class = class_create(THIS_MODULE, "ap3216c_class");
    device_create(ap3216c_class, NULL, MKDEV(major, 0), NULL, "ap3216c");
    
    return 0;
}

阶段6:系统状态变化

内核空间变化:
  1. /proc/modules 中出现 ap3216c_drv 模块

  2. /proc/devices 中出现字符设备 "253 ap3216c"(假设分配的主设备号是253)

  3. 内核驱动链表添加了 i2c_ap3216c_driver

文件系统变化:
复制代码
1. /sys/class/ap3216c_class/ 目录被创建
2. /dev/ap3216c 设备节点被创建
sysfs变化:

/sys/bus/i2c/drivers/ap3216c/ # I2C驱动目录

/sys/class/ap3216c_class/ap3216c/ # 设备类目录

验证加载结果

方法1:检查模块列表

lsmod | grep ap3216c

输出:

ap3216c_drv 16384 0

方法2:检查设备节点

ls -l /dev/ap3216c

输出:

crw------- 1 root root 253, 0 Jan 1 10:30 /dev/ap3216c

方法3:检查/proc/devices

cat /proc/devices | grep ap3216c

输出:

253 ap3216c

方法4:检查sysfs

检查驱动目录

ls /sys/bus/i2c/drivers/ap3216c/

检查类目录

ls /sys/class/ap3216c_class/

相关推荐
lifallen9 小时前
Skill 的生命周期:问题消失以后
人工智能·学习·ai·ai编程
蜀道山老天师9 小时前
Shell Bash变量与运算符(含条件测试与流程控制)
linux·运维·bash
千谦阙听9 小时前
C++类和对象(中):默认成员函数、构造与析构、拷贝构造、运算符重载
开发语言·c++·学习
冬木家居9 小时前
40㎡客厅变形记,小家住出大自由[特殊字符]
android·经验分享·笔记·智能家居·微信公众平台
Mr.朱鹏9 小时前
Linux 服务器 LVM 根分区在线动态扩容
linux·服务器·数据库
摇滚侠9 小时前
《SpringBoot 3:入门与应用实战》第 12 章 JDBC 与事务 数据库初始化机制 阅读笔记 36
数据库·spring boot·笔记
mengge.cloud10 小时前
存储技术基础小白教程
linux·运维·服务器·wpf·存储
Agudamu116110 小时前
AI 视频学习笔记工具拆解:4款工具谁能把视频变成复习资料
人工智能·学习·音视频
HugoStudio_SWAN10 小时前
洛谷 B4500 / B4449 / B3843 凯撒密码、密码强度与密码合规——加密与安全的三道门
c++·学习·程序人生·算法·安全
tang7778910 小时前
反爬虫场景下代理IP池的动态扩容与失效IP自动清理方案实现
linux·服务器·网络·爬虫代理·住宅代理ip