分类: LINUX
2013-10-27 14:44:20
内核字符设备驱动框架
UART驱动是字符设备驱动的一种。这种驱动虽然简单,但是和平时开发息息相关,所以专门写一篇文章来分析。对于嵌入式开发来说,应用程序和串口之间的输入输出交互是再也平常不过的事情了。分析串口驱动了解这种交互的过程,对提高我们对驱动设计以及内核设计思想的了解很有好处。由于串口驱动很成熟了,一般不会出什么问题,所以文章中没有过多的开发经验介绍,但是对修炼“内功”很有帮助。
串口驱动是一种字符设备驱动,我们在学习串口驱动之前,需要了解一些字符设备驱动的相关架构。字符设备驱动是uart、看门狗等一类设备的驱动。字符设备驱动的框架必须提供一个统一的框架来管理这一类型的驱动。概括的讲,字符设备驱动框架提供两个功能:
1、提供一种字符设备驱动管理机制,将所有字符设备驱动加以抽象之后统一管理。
2、另一个方面,在linux的世界里,万物皆文件,字符设备也不例外,应用程序看到字符设备就是某个目录下的一个文件而已,而对设备的操作,相应的接口也就是open、read、write等。字符设备驱动必须提供给文件系统操作的机制。
综合上面两点,我们逐个分析。首先,字符设备驱动框架提供一个抽象两统一管理各种字符设备驱动。此处,内核提出设备号的概念。一个设备号分为两部分,主设备号和从设备号。
主设备号区分不同驱动,从设备号区分使用同一驱动的不同设备
当我们为某个字符设备写一个驱动,为了将这个驱动注册到内核统一管理(使得用户态程序能使用到这个驱动和字符设备),首先必须给这个字符设备申请一个设备号,这个设备号是驱动框架管理这个设备驱动的依据(实际上可以理解成这个设备编号就是我们在学校的学号,在公司的工号)。这个设备号,可以静态指定,也可以动态分配。
字符设备设备号的管理并不是本文的重点,所以用下面的图备忘
得到了字符设备号之后,就可以将相应的字符设备添加到内核中去了。内核中使用如下的数据结构来管理各种字符设备。添加字符设备函数是cdev_add
上面说道了字符设备驱动框架对字符类驱动的统一管理。下面再说一下字符设备驱动框架和文件系统的交互流程。我们知道linux系统中字符设备也是一种文件。用户态程序要操作字符设备首先打开相应的文件。这个open操作就将字符设备的相应操作函数挂接到文件系统上来,通过文件系统框架完成对字符设备的操作。