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

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

时间: 2024-08-24 19:51:01

驱动学习之字符设备驱动的原理的相关文章

linux驱动学习(1)——字符设备驱动开发

(一)驱动程序介绍 (a)Linux驱动程序学习 知识结构: 1. Linux驱动程序设计模式(40%) 2. 内核相关知识(30%) 3. 硬件相关知识(30%) (b)驱动分类: ①字符设备: 字符设备是一种按字节来访问的设备,字符驱动则负责驱动字符设备,这样的驱动通常实现 open, close,read和 write 系统调用. ②块设备: 在大部分的 Unix 系统, 块设备不能按字节处理数据,只能一次传送一个或多个长度是512字节( 或一个更大的 2 次幂的数 )的整块数据,而Lin

LCD驱动分析(一)字符设备驱动框架分析

LCD驱动也是字符设备驱动,也遵循字符设备驱动的流程: a. 分配主设备号 b. 构建file_operations结构体中的open,write,read...等函数 c. 调用register_chrdev()函数注册字符设备 d. 调用class_register()注册类 e. 调用device_create()创建设备,linux会在sysfs目录下自动创建字符设备. 以上的步骤同样适用于分析输入子系统,只不过上面的各个步骤可能分散在不同的文件与函数中完成. 1.linux/drive

从Linux内核LED驱动来理解字符设备驱动开发流程

目录 博客说明 开发环境 1. Linux字符设备驱动的组成 1.1 字符设备驱动模块加载与卸载函数 1.2 字符设备驱动的file_operations 结构体中的成员函数 2. 字符设备驱动--设备号注册卸载 2.1 设备号注册 2.2 设备号注销 3. 字符设备驱动--文件操作 参考资料 示例代码 @(从Linux内核LED驱动来理解字符设备驱动开发流程) 博客说明 撰写日期 2018.12.08 完稿日期 2019.10.06 最近维护 暂无 本文作者 multimicro 联系方式 [

Linux 设备驱动--- 阻塞型字符设备驱动 --- O_NONBLOCK --- 非阻塞标志【转】

转自:http://blog.csdn.net/yikai2009/article/details/8653697 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 阻塞 阻塞操作 非阻塞操作 阻塞方式-read- 实现 阻塞方式-write- 实现 非阻塞方式的读写操作 实例 --- 读阻塞的实现 实例 --- 按键驱动阻塞实现 1在 open 函数 查看看是 阻塞方式 还是 非阻塞方式 2在 read 函数中同样查看 3应用程序中 1以阻塞方式运行 2以非阻塞方式运行

【linux驱动笔记】字符设备驱动相关数据结构与算法

欢迎转载,转载时需保留作者信息,谢谢. 邮箱:[email protected] 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:http://blog.csdn.net/xiayulewa   1.1.1.   设备号 alloc_chrdev_region(&dev, 0, 1, "buttons") /  register_chrdev_region: 动态申请设备号, 设备号组成了链表节点. 最后的结果为:所有的ch

字符设备驱动、平台设备驱动、设备驱动模型、sysfs的关系

Linux驱动开发的童鞋们来膜拜吧:-)  学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动.设备驱动模型和sysfs等相关概念和技术.对于初学者来说会非常困惑,甚至对Linux有一定基础的工程师而言,能够较好理解这些相关技术也相对不错了.要深刻理解其中的原理需要非常熟悉设备驱动相关的框架和模型代码.网络上有关这些技术的文章不少,但多是对其中的某一点进行阐述,很难找到对这些技术进行比较和关联的分析.对于开发者而言,能够熟悉某一点并分享出来已很难得,但对于专注传授技术和经验给

[kernel]字符设备驱动、平台设备驱动、设备驱动模型、sysfs几者之间的比较和关联

转自:http://www.2cto.com/kf/201510/444943.html Linux驱动开发经验总结,绝对干货! 学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动.设备驱动模型和sysfs等相关概念和技术.对于初学者来说会非常困惑,甚至对Linux有一定基础的工程师而言,能够较好理解这些相关技术也相对不错了.要深刻理解其中的原理需要非常熟悉设备驱动相关的框架和模型代码.网络上有关这些技术的文章不少,但多是对其中的某一点进行阐述,很难找到对这些技术进行比较和关

字符设备驱动(程序设计)—①

via:http://blog.sina.com.cn/s/blog_7ec8fc2c010157lc.html 1.驱动程序设计 1)驱动分类 驱动这里分为 字符设备驱动.网络接口驱动.块设备驱动!这三类,其中前两者是重点. ①.字符设备 字符设备是一种 按自己来访问 的设备,字符驱动则负责驱动字符设备,这样的驱动通常是先 open.close.read和write 系统调用! ②.块设备 在大部分 Unix 系统中,块设备不能按照字节处理数据,只能一次传送一个或则会多个长度是 512 字节(

字符设备驱动体验,字符设备驱动学习

字符设备驱动学习 在Linux系统中,驱动程序通常采用内核模块的程序结构来进行编码.因此,编译/安装一个驱动程序,其实质就是编译/安装一个内核模块. 一.编译安装字符设备驱动程序 memdev文件中:在这个文件里和真实的硬件无关,只是虚构了一个数组 1 #include <linux/module.h> 2 #include <linux/fs.h> 3 #include <linux/init.h> 4 #include <linux/cdev.h> 5