没有合适的资源?快使用搜索试试~ 我知道了~
首页Linux设备驱动入门:角色、分类与模块特点详解
本文档是一份关于Linux设备驱动程序的学习笔记,主要涵盖了设备驱动程序的基础概念、类型和驱动模块的特点。首先,设备驱动程序在Linux内核中的角色至关重要,它作为连接用户空间与硬件的桥梁,将特定硬件与内核的标准化接口相匹配,隐藏了硬件工作的底层细节,使得用户操作可以标准化地执行,而无需关心具体驱动的差异。 文章提到,Linux设备驱动程序主要分为三种类型:字符设备、块设备和网络接口。字符设备如串口或终端,允许数据以字节流的形式进行读写;块设备如硬盘,通过预定义的块大小进行数据传输,其接口与字符设备有所不同,但在用户层面是透明的;网络接口则负责处理网络通信,包括硬件设备和虚拟设备,其与内核的交互涉及到专门的数据包传输函数,而非简单的read和write操作。 驱动模块是Linux设备驱动的核心组成部分,它们运行在内核空间,具有以下特点: 1. 模块化:驱动模块需要依赖内核的公共符号表,通过`EXPORT_SYMBOL`或`EXPORT_SYMBOL_GPL`宏导出符号供其他模块使用。这样设计便于模块的独立开发和维护。 2. 内核空间运行:模块不能依赖标准C库等应用层的资源,只允许使用内核提供的函数,确保了系统的稳定性和安全性。 3. 模块层叠:Linux支持模块层叠技术,允许将模块分解为多个层次,便于代码管理和优化开发流程。 理解并掌握Linux设备驱动程序对于开发人员来说是至关重要的,因为它直接影响到操作系统与硬件的交互效率和兼容性。通过深入学习这些内容,开发者可以更好地编写高效、稳定且灵活的驱动程序,以适应各种硬件环境的需求。
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/4781936/bg10.jpg)
release 方法提供释放内存,关闭设备的功能。应完成的工作如下:
(1)释放由 open 分配的、保存在 file->private_data 中的所有内容;
(2)在最后一次关闭操作时关闭设备。
由于前面定义了 scull 是一个全局且持久的内存区,所以他的 release 什么都不做。
六、read 和 write
read 和 write 方法的主要作用就是实现内核与用户空间之间的数据拷贝。因为 Linux 的内核空间和用户空间隔
离的,所以要实现数据拷贝就必须使用在
<asm/uaccess.h>中定义的:
unsigned long copy_to_user(void __user *to,
const void *from,
unsigned long count);
unsigned long copy_from_user(void *to,
const void __user *from,
unsigned long count);
而值得一提的是以上两个函数和
#define __copy_from_user(to,from,n) (memcpy(to, (void __force
*)from, n), 0)
#define __copy_to_user(to,from,n) (memcpy((void __force *)to,
from, n), 0)
之间的关系:通过源码可知,前者调用后者,但前者在调用前对用户空间指针进行了
检查。
至于 read 和 write 的具体函数比较简单,就在实验中验证好了。
七、模块实验
这次模块实验的使用是友善之臂 SBC2440V4,使用 Linux2.6.22.2 内核。
模块程序链接:scull模块源程序
![](https://csdnimg.cn/release/download_crawler_static/4781936/bg11.jpg)
模块测试程序链接:模块测试程序
测试结果:
量子大小为 6:
[Tekkaman2440@SBC2440V4]#cd /lib/modules/ [Tekkaman2440@SBC2440V4]#insmod
scull.ko scull_quantum=6
[Tekkaman2440@SBC2440V4]#cat /proc/devices
Character devices:
1 mem
2 pty
3 ttyp
4 /dev/vc/0
4 tty
4 ttyS
5 /dev/tty
5 /dev/console
5 /dev/ptmx
7 vcs
10 misc
13 input
14 sound
81 video4linux
89 i2c
90 mtd
116 alsa
128 ptm
136 pts
180 usb
189 usb_device
204 s3c2410_serial
252 scull
253 usb_endpoint
254 rtc
Block devices:
1 ramdisk
256 rfd
7 loop
31 mtdblock
93 nftl
96 inftl
179 mmc
[Tekkaman2440@SBC2440V4]#mknod -m 666 scull0 c 252 0
![](https://csdnimg.cn/release/download_crawler_static/4781936/bg12.jpg)
[Tekkaman2440@SBC2440V4]#mknod -m 666 scull1 c 252 1
[Tekkaman2440@SBC2440V4]#mknod -m 666 scull2 c 252 2
[Tekkaman2440@SBC2440V4]#mknod -m 666 scull3 c 252 3
启动测试程序
[Tekkaman2440@SBC2440V4]#./scull_test
write error! code=6
write error! code=6
write error! code=6
write ok! code=2
read error! code=6
read error! code=6
read error! code=6
read ok! code=2
[0]=0 [1]=1 [2]=2 [3]=3 [4]=4
[5]=5 [6]=6 [7]=7 [8]=8 [9]=9
[10]=10 [11]=11 [12]=12 [13]=13 [14]=14
[15]=15 [16]=16 [17]=17 [18]=18 [19]=19
改变量子大小为默认值 4000:
[Tekkaman2440@SBC2440V4]#cd /lib/modules/
[Tekkaman2440@SBC2440V4]#rmmod scull
[Tekkaman2440@SBC2440V4]#insmod scull.ko
启动测试程序
[Tekkaman2440@SBC2440V4]#./scull_test
write ok! code=20
read ok! code=20
[0]=0 [1]=1 [2]=2 [3]=3 [4]=4
[5]=5 [6]=6 [7]=7 [8]=8 [9]=9
[10]=10 [11]=11 [12]=12 [13]=13 [14]=14
[15]=15 [16]=16 [17]=17 [18]=18 [19]=19
[Tekkaman2440@SBC2440V4]#
改变量子大小为 6,量子集大小为 2:
[Tekkaman2440@SBC2440V4]#cd /lib/modules/
[Tekkaman2440@SBC2440V4]#rmmod scull
[Tekkaman2440@SBC2440V4]#insmod scull.ko scull_quantum=6 scull_qset=2
![](https://csdnimg.cn/release/download_crawler_static/4781936/bg13.jpg)
启动测试程序
[Tekkaman2440@SBC2440V4]#./scull_test
write error! code=6
write error! code=6
write error! code=6
write ok! code=2
read error! code=6
read error! code=6
read error! code=6
read ok! code=2
[0]=0 [1]=1 [2]=2 [3]=3 [4]=4
[5]=5 [6]=6 [7]=7 [8]=8 [9]=9
[10]=10 [11]=11 [12]=12 [13]=13 [14]=14
[15]=15 [16]=16 [17]=17 [18]=18 [19]=19
实验不仅测试了模块的读写能力,还测试了量子读写是否有效。
![](https://csdnimg.cn/release/download_crawler_static/4781936/bg14.jpg)
Linux 设备驱动程序学习(2)-调试技术
Linux 设备驱动程序学习(2)-调试技术
今天进入《Linux 设备驱动程序(第 3 版)》第四章调试技术的学习。
一、内核中的调试支持
在前面已经建议过:学习编写驱动程序要构建安装自己的内核(标准主线内核)。最重要的原因之一是:内核开
发者已经建立了多项用于调试的功能。但是由于这些功能会造成额外的输出,并导致能下降,因此发行版厂商通
常会禁止发行版内核中的调试功能。
为了实现内核调试,我在内核配置上增加了几项:
Kernel hacking --->
[*] Magic SysRq key
[*] Kernel debugging
[*] Debug slab memory allocations
[*] Spinlock and rw-lock debugging: basic checks
[*] Spinlock debugging: sleep-inside-spinlock checking
[*] Compile the kernel with debug info
[*] Magic SysRq key
Device Drivers --->
Generic Driver Options --->
[*] Driver Core verbose debug messages
General setup --->
[*] Configure standard kernel features (for small systems) --->
[*] Load all symbols for debugging/ksymoops
书上介绍的还有其他配置,有的我不需要,或是 s3c2440 不支持,菜单里看不见。
二、通过打印调试
(1)printk
首先,printk 有 8 个 loglevel,定义在<linux/kernel.h>中:
#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
剩余203页未读,继续阅读
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/243d140fb2ba470091b0e79228873937_chengqing3968.jpg!1)
楼上看云
- 粉丝: 3
- 资源: 9
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- 解决本地连接丢失无法上网的问题
- BIOS报警声音解析:故障原因与解决方法
- 广义均值移动跟踪算法在视频目标跟踪中的应用研究
- C++Builder快捷键大全:高效编程的秘密武器
- 网页制作入门:常用代码详解
- TX2440A开发板网络远程监控系统移植教程:易搭建与通用解决方案
- WebLogic10虚拟内存配置详解与优化技巧
- C#网络编程深度解析:Socket基础与应用
- 掌握Struts1:Java MVC轻量级框架详解
- 20个必备CSS代码段提升Web开发效率
- CSS样式大全:字体、文本、列表样式详解
- Proteus元件库大全:从基础到高级组件
- 74HC08芯片:高速CMOS四输入与门详细资料
- C#获取当前路径的多种方法详解
- 修复MySQL乱码问题:设置字符集为GB2312
- C语言的诞生与演进:从汇编到系统编程的革命
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)