《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
并请联系谭海燕本人或者前往谭海燕个人主页留言

目录
相关文章
|
2月前
|
监控 Linux 开发者
理解Linux操作系统内核中物理设备驱动(phy driver)的功能。
综合来看,物理设备驱动在Linux系统中的作用是至关重要的,它通过与硬件设备的紧密配合,为上层应用提供稳定可靠的通信基础设施。开发一款优秀的物理设备驱动需要开发者具备深厚的硬件知识、熟练的编程技能以及对Linux内核架构的深入理解,以确保驱动程序能在不同的硬件平台和网络条件下都能提供最优的性能。
158 0
|
10月前
|
Linux 编译器 开发工具
【Linux快速入门(三)】Linux与ROS学习之编译基础(Cmake编译)
【Linux快速入门(三)】Linux与ROS学习之编译基础(Cmake编译)
563 2
|
4月前
|
安全 Ubuntu Linux
Nipper 3.8.0 for Windows & Linux - 网络设备漏洞评估
Nipper 3.8.0 for Windows & Linux - 网络设备漏洞评估
150 0
Nipper 3.8.0 for Windows & Linux - 网络设备漏洞评估
|
10月前
|
存储 安全 Linux
|
6月前
|
存储 IDE Linux
零基础保姆级教程!手把手教你免费玩转Linux CentOS安装+学习环境搭建(附避坑指南)
本文详细介绍了在VMware虚拟机中安装CentOS 6.8的全过程。首先,需确保已安装VMware并开启V-CPU虚拟化功能,可通过BIOS设置或使用LeoMoon CPU-V工具检测。接着,下载CentOS镜像文件,并在VMware中新建虚拟机,配置CPU、内存、硬盘等参数。最后,加载ISO镜像启动虚拟机,按照提示完成CentOS的安装,包括语言、键盘、存储方式、地区、密码设置及硬盘分区等步骤。安装完成后,以root用户登录即可进入系统桌面,开始学习Linux命令和操作。
670 12
零基础保姆级教程!手把手教你免费玩转Linux CentOS安装+学习环境搭建(附避坑指南)
|
5月前
|
运维 安全 Linux
试试Linux设备命令行运维工具——Wowkey
WowKey 是一款专为 Linux 设备设计的命令行运维工具,提供自动化、批量化、标准化、简单化的运维解决方案。它简单易用、高效集成且无依赖,仅需 WIS 指令剧本文件、APT 账号密码文件和 wowkey 命令即可操作。通过分离鉴权内容与执行内容,WowKey 让运维人员专注于决策,摆脱繁琐的交互与执行细节工作,大幅提升运维效率与质量。无论是健康检查、数据采集还是配置更新,WowKey 都能助您轻松应对大规模设备运维挑战。立即从官方资源了解更多信息:https://atsight.top/training。
|
5月前
|
数据采集 运维 安全
Linux设备命令行运维工具WowKey问答
WowKey 是一款用于 Linux 设备运维的工具,可通过命令行手动或自动执行指令剧本,实现批量、标准化操作,如健康检查、数据采集、配置更新等。它简单易用,只需编写 WIS 指令剧本和 APT 帐号密码表文件,学习成本极低。支持不同流派的 Linux 系统,如 RHEL、Debian、SUSE 等,只要使用通用 Shell 命令即可通吃Linux设备。
|
6月前
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
10月前
|
Linux Shell 数据安全/隐私保护
Linux 初学者必学的 10 个命令,学习!
【10月更文挑战第28天】
217 1
Linux 初学者必学的 10 个命令,学习!
|
11月前
|
Linux 编译器 C语言
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
214 2

热门文章

最新文章