《LINUX设备驱动程序》学习札记(二)

简介:

总结章节:第三节 字符设备驱动
这一章主要是讲一些字符设备驱动程序的相关知识。在进行字符设备驱动程序学习之前,我们必须得弄明白一个问题:驱动程序时给谁用的。
很多驱动程序的初学者,按照一般编程语言(C,java等等)编写应用程序的经验,函数就是用来调用的。这种调用关系,在应用空间来看,限制不是很明显。很多初学者都会误认为,在驱动程序中写的函数是为了以后应用程序来调用,比如:在驱动中程序中实现了switch()函数的功能,按照应用程序的观念,在应用程序中应该可以调用switch()函数,从而来实现某种功能。这种错误的思维在从用户空间应用程序程序员到驱动程序程序员的转变过程中,经常会遇到这种问题。这其实是对驱动程序的本质属性没有弄透彻。驱动程序,就是内核的一部分,驱动程序的代码是内核代码的一部分。应用程序不能直接利用驱动程序来达到访问硬件的目的,我们应该明白,应用程序是通过访问/dev/下的设备文件,来间接的访问硬件,驱动程序通过系统调用来实现将信息传递给/dev/下的设备文件。无论驱动程序中定义了什么函数,应用空间都不能使用,哪怕是函数形态一样,如果可以访问的话,那就危险了。驱动程序中的函数永远都是提供给系统内核使用的,由系统来自动调用,不需要应用程序干预。
搞清楚上面的问题之后,来看看字符设备驱动的一些重要的概念和数据结构。
1.    设备号
在linux 2.6内核中,用32位的dev_t类型的数据来表示,其中12位用来表示主设备号,其余20位用来表示次设备号。主设备号是用来表示设备所对应的驱动程序的,也就是说,如果设备的主设备号相同,那么这些设备的驱动程序是同一个。次设备号是给内核使用的,用来确定设备文件所指向的设备。尽管主设备号和次设备号的位数都固定了,但是,我们不应做出任何假设,如果我们需要从一个dev_t  dev(以后的使用中,设备号都是指dev_t类型的设备号)中得到主设备号和次设备号,应该使用下面的宏:
                       MAJOR(dev_t dev);
                       MINOR(dev_t dev);
如果我们想用主设备号和此设备号来得到dev_t类型的设备号,应该使

2.    分配设备号
通常情况下,我们应该尽量使用动态分配设备号的方式。
       int  alloc_chrdev_region(dev_t  *dev,  unsigned int firstminor,  unsigned count,  char  *name);
这个函数将把申请范围内身亲到的第一个设备号传给*dev.
当然,在已经知道设备号的前提下,使用
      int  register_chrdev_region(dev_t  first,  unsigned int count,  char  *name)
其中   first是申请设备号范围内的其实设备号。first中的minor部分常常设为0.
但是,不论使用了哪种方式来分配设备号,我们都需要使用
     void  unregister_chrdev_region(dev_t  first, unsigner int count).
另外,由于动态分配设备号所分配的设备号不是确定的,那么对于创建设备文件就比较麻烦了,但是我们可以使用脚本来自动创建,关于自动创建设备文件的脚本的理解详见我的博客中的关于awk的解释。

3.    重要的数据结构  file_operations    file    inode
 关于这些数据结构的内容,我就不多说了,只想说明一些关键性的问题,file_operations数据结构定义了一些操作,一个设备文件只有一个 inode,但是可以有多个file结构。file是在打开设备文件后由内核自动创建的。file结构用来表示一个打开的文件,而inode用来表示一个文件了。驱动程序的编写实质性的工作就是对这些结数据结构进行填充,对相关数据结构中的函数进行实现
4.设备注册
设备注册的函数就不用讲了。按照函数语法使用就可以了。

 

 


版权申明:
转载文章请注明原文出处http://blog.csdn.net/feiyinzilgd/archive/2010/12/30/6108417.aspx
并请联系谭海燕本人或者前往谭海燕个人主页留言

目录
相关文章
|
5天前
|
安全 Linux
蓝易云 - Linux学习之RAID
以上就是Linux中RAID的基本概念和使用方法。
9 1
|
7天前
|
安全 Linux
蓝易云 - Linux学习之RAID
最后,你可以使用 `mdadm --detail /dev/md0`命令检查RAID状态。
15 2
|
10天前
|
安全 物联网 Linux
学习Linux对网络安全的重要性
**学习Linux对网络安全至关重要:** 1. 开源操作系统广泛应用于服务器、网络设备,掌握Linux是安全专家必备技能。 2. Linux内置安全特性,如最小权限和防火墙,加上丰富的安全工具,提供强大保障。 3. 可定制性允许灵活配置,满足安全需求,开源社区提供持续更新和教育资源。 4. 学习Linux能提升攻防能力,用于系统加固和渗透测试,适应跨平台安全场景。 5. 随着云计算和物联网发展,Linux在网络安全中的角色日益关键。
35 3
|
15天前
|
Linux 程序员 芯片
【Linux驱动】普通字符设备驱动程序框架
【Linux驱动】普通字符设备驱动程序框架
|
25天前
|
Linux 虚拟化 iOS开发
Linux系统——远程连接Linux系统(图形化、命令行、使用命令行学习Linux系统、FinalShell)
Linux系统——远程连接Linux系统(图形化、命令行、使用命令行学习Linux系统、FinalShell)
27 3
|
27天前
|
物联网 Linux 芯片
学习嵌入式是选择单片机还是Linux?
单片机通常指的是一种集成了处理器、存储器和各种外设接口的微控制器芯片,常见的有STC、51系列、AVR、ARM Cortex-M等。单片机具有低成本、低功耗、实时性强等特点,适用于对资源要求较低、功耗要求较低、实时性要求较高的嵌入式系统。学习单片机开发可以让您深入了解嵌入式系统的底层原理和硬件编程,对于对嵌入式系统底层开发感兴趣的人来说,是一个很好的选择。
23 4
|
4天前
|
Unix 关系型数据库 Linux
技术笔记:linux学习心得
技术笔记:linux学习心得
10 0
|
4天前
|
存储 Linux
深入了解Linux设备管理:字符、块和网络设备文件
深入了解Linux设备管理:字符、块和网络设备文件
15 0
|
28天前
|
传感器 物联网 Linux
物联网设备的操作系统之争:Linux vs RTOS
【6月更文挑战第4天】在遥远的数码星球,物联网城中的Linux先生与RTOS小姐展开激烈角逐,分别在操作系统领域各显神通。Linux先生以其开源、兼容性强、功能丰富占据服务器、桌面及嵌入式设备市场,适合处理复杂任务和需要强大计算能力的设备。而RTOS小姐以实时性、高效响应和低资源占用见长,适用于资源有限、强调实时性的物联网设备。设备制造商在两者间抉择,引发物联网设备操作系统的选择大战。通过Python与FreeRTOS示例,展现了两者在智能家居和生产线控制等场景的应用。在物联网世界,Linux与RTOS共同推动设备智能化,为生活带来更多便捷。
69 3
|
5天前
|
网络协议 算法 Linux
技术笔记:Linux学习:TCP粘包问题
技术笔记:Linux学习:TCP粘包问题