Linux设备驱动基础知识
驱动是硬件与用户进程之间的通信桥梁。
用户进程是不可以直接访问硬件的。
数据是驱动先接收到硬件反馈的数据处理后再移交给用户进程的。
驱动不属于任何一个用户进程,可以给多个用户进程调用。
驱动是常驻于内存里,等待用户进程调用。
用户进程如访问越界则会发生段错误,但对其它进程没有影响。
用户进程在cpu的usr模式下工作。
驱动是在svc模式下工作(特权模式),驱动发生错误,会影响整个系统(像windows系统蓝屏)。
写应用程序有bug仅仅是影响该进程,但写驱动时,有可能会导致系统崩溃。
驱动加载到内核后(即驱动工作时),除了初始化工作以外,一般情况下是不会自动去执行操作的,驱动是在被用户进程调用时才会触发操作的,所以也得注意驱动的接口函数的可重入性;
也就是,驱动是实现硬件的各种功能,但怎么去使用则由用户进程调用来决定。
驱动要注意可移植性,驱动里用的栈是定长的(8K), 所以在使用大的缓冲区时需要动态申请(kmalloc/vmalloc)。
C库函数不能在内核驱动里调用,因为C库需要通过系统调用来实现功能;
但在内核里有实现大部分C库的基本功能函数,如内核里的printk可代替C的printf函数
(cat /proc/kallsyms | grep 函数名 //可查看当前内核里是否有提供此功能函数)
内核使用面向对象的做法来实现设备驱动方法的,如用struct cdev的一个变量来描述一个字符设备驱动。
内核源码的目录:
arch
arm
mach-sunxi:每个cpu型号都会有mach-xxxx的目录,此目录里会有几个C文件,这些文件表示基于这个cpu所做的方案,源码里大多是用于描述此方案的硬件资源(如:sun4i.c, sun6i.c, sun8i.c…)
block:实现块设备的接口与管理,大容量的储存设备(如:SD, nand, emmc)
cypto:加密算法
Documentation:文档
drivers:硬件的驱动
firmware:固件,提供给外接芯片启动时加载的程序,如wifi模块(zd1211)
fs:文件系统格式
init:内核启动时初始化的代码
ipc:进程间通信的实现功能代码
kernel:里面实现进程调度的功能
mm:内存管理
net:网络协议栈的实现
scripts:配置内核make menuconfig时产生界面的脚本
sound:声卡驱动相关
内核起用接口标准化的作用,即内核里制定了驱动的接口及应用程序的调用接口。
只要双方都遵循标准的接口,双方就可以实现通信,而不用管具体一方是什么样,怎样实现的。