驱动学习之字符设备驱动的原理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了驱动学习之字符设备驱动的原理相关的知识,希望对你有一定的参考价值。

1:嵌入式系统的整体工作原理

  应用层->API->设备驱动->硬件

  比如,在应用层,现在使用read函数去读取一个设备文件,这个read函数是属于应用层的,它不能直接读取设备文件,而是通过内核层的函数(其实就是和file_operations结构体中read这个函数指针相绑定的函数,这个函数才是真正操作硬件的函数)来实现读取文件,


2:file_operations结构体

(1)这个结构体里面存放的是一个驱动里面操作文件的各种函数指针,比如,现有一个驱动,它可以打开一个文件,那么这个驱动对应的fire_operation结构体里面的open函数指针就和这个驱动的打开文件的操作函数相绑定,当调用这个驱动去打开文件时,就会到这个驱动的fire_operation结构体中去找到open函数指针,进而找到驱动代码中对应的打开文件的函数。

(2)每个驱动都有一个fire_operations结构体,用来管理这个驱动的操作函数。

(3)设备驱动相内核注册时提供该结构体类型的变量。

2:注册字符驱动设备

(1):为什么要注册:因为注册后内核才能找到这个驱动

(2):谁去负责注册:驱动自己去注册

(3)向谁注册:向内核注册

(4)注册函数从哪来:注册函数是register_chrdev,有内核提供

(5)注册后的结果:注册后内核就能记录这个驱动的file_operations,将来要用到这个驱动的时候就可以通过这个驱动的file_operation来找到相应的驱动。

3:register_chrdev(驱动注册函数)

static inline int register_chrdev(unsigned int major,const char *name,const struct file_operations *fops)
{
return __register_chrdev(major, 0, 256 , name, fops);
}


(1)路径为/include/linux/fs.h,所以以后使用的时候需要添加#include<linux/fd.h>

(2)作用:驱动向内核注册自己的file_operations

(3)返回值:注册成功返回0,注册失败返回一个负整数

(4)参数

  unsigned int major:主设备号,主设备号是内核或者自己给设备(硬件)定义的编号,将来要操作这个硬件的时候只要去调用这个编号(范围是0-255)就行。这设备号可以有内核自动分配,也可以由程序员自己指定,假如自己指定的编号比如是38已经被占用了,那么file_operations就会返回一个负整数,注册失败。

  const char *name:当前设备驱动的名字,便于程序员查看这个驱动的具体作用。

  const struct file_operations *fops:把这个驱动的file_operations结构体变量传给内核,用于注册这个驱动。

(5)static:为了防止和其他文件的函数重名

(6)inline:这个函数是定义在头文件中的,在预处理的时候头文件内容是在.c文件中原地展开的,所以当有多个.c文件调用这个头文件中时就会提示重复定义的错误。另一个原因是,这个函数的内容很短,使用inline就可以减少函数调用的开销,提高函数调用的速度


4:内核如何管理字符设备驱动

(1)内核张有一个数组用来存储注册的字符设备驱动

(2)register_chrdev内部将我们要注册的驱动信息(主要是)存储在书中中相应的位置中

(3)使用cat /proc/devices去查看当前系统中已经注册的设备

5:proc文件系统

(1)/proc 文件系统是一种内核和内核模块用来向进程(process) 发送信息的机制(所以叫做/proc)。这个伪文件系统让你可以和内核内部数据结构进行交互,获取 有关进程的有用信息,在运行中(on the fly) 改变设置(通过改变内核参数)。 与其他文件系统不同,/proc 存在于内存之中而不是硬盘上。如果你察看文件/proc/mounts (和mount 命令一样列出所有已经加载的文件系统),你会看到其中 一行是这样的:

grep proc /proc/mounts

/proc /proc proc rw 0 0

/proc 由内核控制,没有承载/proc 的设备。因为/proc 主要存放由内核控制的状态信息,所以大部分这些信息的逻辑位置位于内核控制的内存。对/proc 进行一次‘ls -l‘ 可以看到大部分文件都是0 字节大的;不过察看这些文件的时候,确实可以看到一些信息。这怎么可能?这是因为/proc 文件系统和其他常规的文件系统一样把自己注册到虚拟文件系统层(VFS) 了。然而,直到当VFS 调用它,请求文件、目录的 i-node 的时候,/proc 文件系统才根据内核中的信息建立相应的文件和目录。

(2)加载proc 文件系统

如果系统中还没有加载proc 文件系统,可以通过如下命令加载proc 文件系统:

mount -t proc proc /proc

上述命令将成功加载你的proc 文件系统。更多细节请阅读mount 命令的man page。

(3)察看/proc 的文件

/proc 的文件可以用于访问有关内核的状态、计算机的属性、正在运行的进程的状态等信息。大部分/proc 中的文件和目录提供系统物理环境最新的信息。尽管/proc 中的文件是虚拟的,但它们仍可以使用任何文件编辑器或像‘more‘, ‘less‘或‘cat‘这样的程序来查看。当编辑程序试图打开一个虚拟文件时,这个文件就通过内核中的信息被凭空地(on the fly) 创建了。这是一些我从我的系统中得到的一些有趣结果

参考

http://www.2cto.com/os/201202/119552.html






本文出自 “11664570” 博客,请务必保留此出处http://11674570.blog.51cto.com/11664570/1872407

以上是关于驱动学习之字符设备驱动的原理的主要内容,如果未能解决你的问题,请参考以下文章

驱动学习之驱动体验

驱动学习之静态映射和动态映射

驱动学习之驱动的设备文件

驱动学习之LED驱动框架

SPISPI学习之SPI驱动相关

SPISPI学习之SPI驱动相关