/***********************************************************************************
*
* 字符设备驱动基本操作及调用流程
*
* 声明:
* 1. 本系列文档是在vim下编辑,请尽量是用vim来阅读,在其它编辑器下可能会
* 不对齐,从而影响阅读.
* 2. 以下所有的shell命令都是在root权限下运行的;
**********************************************************************************/
\\\\\\\--*目录*--//////////////
| 一. make编译快捷方式;
| 二. ctags使用;
| 三. menuconfig编译成内核内部模块;
| 四. 编译内核模块的方法;
| 五. 模块操作;
| 六. 多源文件编译模块Makefile格式;
| 七. 导出符号;
| 八. printk打印等级;
| 九. 模块传参;
| 十. 字符设备;
| 十一. 2种字符设备注册;
| 十二. 驱动中常见的3种结构体;
| 十三. 内核空间与用户空间数据拷贝;
| 十四. 驱动被调用函数流程:
\\\\\\\\\///////////////////
一. make编译快捷方式:
1. export CC=arm-linux-gcc
2. make app
arm-linux-gcc app.c -o app
二. ctags使用:
1. 生成tags文件 ctags -Rn .
2. 把tags文件的路径名添加到vim的配置文件中
cat >> ~/.vimrc << EOF
set tags+=/root/linux-3.5/tags #可以添加多个原文件目录
EOF
3. vim查找符号定义: :ts 三. menuconfig 编译成内核内部模块: 1. cat > test.c << EOF #include int test_init(void) { printk('Hello module.n'); return 0; } void test_exit(void) { printk('Bye module.n'); } //指定模块的初始化函数与退出函数 module_init(test_init); module_exit(test_exit); MODULE_LICENSE('GPL'); MODULE_AUTHOR('lizhichao'); MODULE_DESCRIPTION('simpile module.'); MODULE_VERSION('1.0'); EOF 2. 在test.c所在目录的Makefile文件添加: obj-$(CONFIG_TEST) += test.o 3. 在test.c所在目录的Kconfig文件添加: config TEST bool '----- test module -------' 4. 这时候可以通过menuconfig等配置工具配置test模块的编译 5. 重新编译内核 6. make -j2 zImage 7. 查看模块是否编译到内核 1. nm vmlinux | grep test_init c08d0790 t __initcall_test_init6 c030537c T test_init 2. nm vmlinux | grep test_exit c0305370 T test_exit 8. 重新把内核烧写到SD卡的kernel分区,dwn或者fastboot都行. 9. 系统启动时将调用初始化函数test_init,使用dmesg命令查看是否有正确的输出 四. 编译内核模块的方法 1. Makefile中对变量的引用,可以是$(变量名),也可以是${变量名},但是目前看到$(变量名)居多. 2. 以下是几个对模块编译的make命令: 1. make -C $(内核跟目录路径) M=`pwd` modules 2. make -C $(内核根目录路径) M=`pwd` clean 3. make -s -C $(内核根目录路径) M=$PWD INSTALL_MOD_PATH=$(nfs文件系统根目录) modules_install 3. 实现了上面make命令的shell脚本实例: cat > mm << EOF #!/bin/bash KERNEL=/disk/A9/filesystem/linux-3.5 ROOT_PATH=/disk/A9/filesystem if [ $# -eq 0 ] then make -s -C ${KERNEL} M=$PWD modules elif [ $# -eq 1 -a '$1' = 'clean' ] then make -s -C ${KERNEL} M=$PWD modules clean elif [ $# -eq 1 -a '$1' = 'install' ] then make -s -C ${KERNEL} M=$PWD INSTALL_MOD_PATH=${ROOT_PATH} modules_install else echo 'usage:' echo ' mm' echo ' mm clean' echo ' mm install' fi EOF 4. 实现上面make命令的Makefile实例: ifneq ($(KERNELRELEASE),) obj-m := at24c02.o else KDIR := /home/myzr/myandroid/kernel_imx all: make -C $(KDIR) M=$(PWD) modules clean: rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.order endif 5. 将mm当常用命令来是用: cp mm /bin/ && chmod 777 /bin/mm 五. 模块操作: 1. 动态插入模块到当前运行的系统: insmod test.ko 2. 查看当前运行的系统加载的模块信息: lsmod 3. 查看模块的信息: modinfo test.ko 或者 modinfo test 4. 卸载加载的模块: rmmod test 5. 生成模块的依赖关系: depmod 6. 加载内核模块,主要用于加载make install的模块: modprobe test 7. 卸载内核模块,主要用于卸载make install的模块: modprobe -r test 六. 多源文件编译模块Makefile格式: 1. xxx是模块文件名 2. obj-m += xxx.o xxx-objs = main.o foo.o ... 七. 导出符号: 把符号导出到内核全局符号表,主要是为其他的模块提供函数调用,有两种方式: 1. EXPORT_SYMBOL(foo); //普通方式 2. EXPORT_SYMBOL_GPL(foo); //只有声明为GPL的模块才能调用 八. printk打印等级: 1. 数字越小,等级越高: #define KERN_EMERG '<0>' /* system is unusable */ #define KERN_ALERT '<1>' /* action must be taken immediately */ #define KERN_CRIT '<2>' /* critical conditions */ #define KERN_ERR '<3>' /* error conditions */ #define KERN_WARNING '<4>' /* warning conditions */ #define KERN_NOTICE '<5>' /* normal but significant condition */ #define KERN_INFO '<6>' /* informational */ #define KERN_DEBUG '<7>' /* debug-level messages */ /* Use the default kernel loglevel */ #define KERN_DEFAULT ' 2. cat /proc/sys/kernel/printk 5 4 1 7 数字解析如下: 1. 5 ---> 打印等级小于5的内核消息输出到控制台 2. 4 ---> 默认的打印等级 3. 1 ---> 允许设置的最小等级 4. 7 ---> 允许设置的最大等级 九. 模块传参: 1. 声明定义可传参变量: int num = 500; module_param(num, int, 0644); module_param参数说明: 1. num 参数名 2. int 参数类型
上一篇:Samsung_tiny4412(驱动笔记04)----volatile,container_of,file_operations,file,inode
下一篇:Samsung_tiny4412(驱动笔记01)----linux 3.5,U-Boot,Busybox,SD卡启动环境搭建
推荐阅读最新更新时间:2026-03-25 13:19
- 用于 7VIN 至 16VIN、1.5V 和 1.2V 输出的 LTM4628EV DC/DC 模块稳压器的典型应用电路
- 使用 Analog Devices 的 LTC3728LIGN 的参考设计
- DER-406 - 适用于 A19 灯的 5.76 W 高 PF 非隔离降压-升压型 TRIAC 调光 LED 驱动器
- ADR5045B 5V 输出精密微功率并联模式电压基准的典型应用
- LT3970EDDB-3.42 2.5V 降压转换器的典型应用
- MC78M08BDTG 8V 电流调节器的典型应用
- LT1021DCN8-5 精密电压基准的典型应用
- DER-282 - 100W, 扁平(11 mm), LLC DC-DC转换器
- REF193 低压差开尔文连接电压基准的典型应用电路
- LT3088EM 线性稳压器用于添加软启动的典型应用



Linux内核驱动笔记
三星2410开发板ALLEGRO BRD原文件
现代雷达系统的信号设计
BFR340T






京公网安备 11010802033920号