Linux是一套免费运用和自在传达的类Unix操作体系,是一个依据POSIX和UNIX的多用户、多使命、支撑多线程和多CPU的操作体系。它能运转首要的UNIX工具软件、应用程序和网络协议。它支撑32位和64位硬件。Linux承继了Unix以网络为中心的规划思维,是一个功用安稳的多用户网络操作体系。
想要深化了解linux设备驱动,你有必要清晰以下几个问题:
• 应用程序、库、内核、驱动程序的联系
• 设备类型
• 设备文件、主设备号与从设备号
• 驱动程序与应用程序的差异
• 用户态与内核态
• Linux驱动程序功用
一、应用程序、库、内核、驱动程序的联系
1) 应用程序调用一系列函数库,经过对文件的操作完结一系列功用。
应用程序以文件办法拜访各种硬件设备(Linux特有的笼统办法,把悉数的硬件拜访笼统为对文件的读写、设置)
函数库:
部分函数无需内核的支撑,由库函数内部经过代码完结,直接完结功用
部分函数涉及到硬件操作或内核的支撑,由内核完结对应功用,咱们称其为体系调用
2) 内核处理体系调用,依据设备文件类型、主设备号、从设备号(后边会解说),调用设备驱动程序。
3) 设备驱动直接与硬件通讯。
二、设备类型
硬件是千变万化的,没有八千也有一万了,就像国际上有三种人:男人、女性、女博士相同,linux做了一个很巨大也很困难的分类:把悉数的硬件设备分为三大类:字符设备、块设备、网络设备。
1) 字符设备:字符(char)设备是个能够像字节省(相似文件)相同被拜访的设备。
对字符设备宣布读/写恳求时,实践的硬件I/O操作一般紧接着产生;
字符设备驱动程序一般至少要完结open、close、read和write体系调用。
比方咱们常见的lcd、触摸屏、键盘、led、串口等等,就像男人是用来干活的相同,他们一般对应详细的硬件都是进行出具的收集、处理、传输。
2) 块设备:一个块设备驱动程序首要经过传输固定巨细的数据(一般为512或1k)来拜访设备。
块设备经过buffer cache(内存缓冲区)拜访,能够随机存取,即:任何块都能够读写,不用考虑它在设备的什么地方。
块设备能够经过它们的设备特别文件拜访,可是更常见的是经过文件体系进行拜访。
只要一个块设备能够支撑一个装置的文件体系。
比方咱们常见的电脑硬盘、SD卡、U盘、光盘等,就像女性相同是用来存储信息的。
3) 网络接口:任何网络业务都经过一个网络接口构成,即一个能够和其他主机交流数据的设备。
拜访网络接口的办法仍然是给它们分配一个仅有的名字(比方eth0),但这个名字在文件体系中不存在对应的节点。
内核和网络设备驱动程序间的通讯,彻底不同于内核和字符以及块驱动程序之间的通讯,内核调用一套和数据包传输相关的函数(socket函数)而不是read、write等。
比方咱们常见的网卡设备、蓝牙设备,就像女博士相同,数量稀疏但又不可或缺。
linux中悉数的驱动程序终究都能归到这三种设备中,当然他们之间也没有十分严厉的边界,这些都是程序中对他们的差异罢了,比方一个sd卡,咱们也能够把它封装成字符设备去操作也是没有问题的。就像。。。
三、设备文件、主设备号、从设备号
有了设备类型的差异,那么应用程序应该怎样拜访详细的硬件设备呢?
或许说现已确认他是一个男人了,那么怎样从万千国际中差异他与他的不同呢?
答案是:名字,在linux驱动中也便是设备文件名。
那么重名怎样办?
答案是:身份证号,在linux驱动中也便是设备号(主、从)。
设备文件:
在linux体系中有一个约定俗成的说法:“悉数皆文件”,应用程序运用设备文件节点拜访对应设备, Linux下的各种硬件设备以文件的办法存放于/dev目录下,能够运用ls /dev 检查Linux把对硬件的操作悉数笼统成对文件的操作(open,read,write,close,…)
每个设备文件都有其文件特点(c或许b),运用ls /dev -l 的指令检查, 标明其是字符设备或许块设备,网络设备没有在这个文件夹下,用来明其性别(男人、女性)
主设备号、从设备号
在设备管理中,除了设备类型外,内核还需要一对被称为主从设备号的参数,才干仅有标识一个设备,相似人的身份证号
主设备号:
用于标识驱动程序,相同的主设备号运用相同的驱动程序,例如:S3C2440 有串口、LCD、触摸屏三种设备,他们的主设备号各不相同;
从设备号:
用于标识同一驱动程序的不同硬件
例:PC的IDE设备,主设备号用于标识该硬盘,从设备号用于标识每个分区,2440有三个串口,每个串口的主设备号相同,从设备号用于差异详细归于那一个串口。
四、驱动程序与应用程序的差异
应用程序以main开端
驱动程序没有main,它以一个模块初始化函数作为进口
应用程序自始至终履行一个使命
驱动程序完结初始化之后不再运转,等候体系调用
应用程序能够运用glibc等规范C函数库
驱动程序不能运用规范C库
五、用户态与内核态的差异
驱动程序是内核的一部分,作业在内核态
应用程序作业在用户态
数据空间拜拜访题
无法经过指针直接将二者的数据地址进行传递
体系供给一系列函数协助完结数据空间转化
get_user
put_user
copy_from_user
copy_to_user
六、Linux驱动程序功用
对设备初始化和开释资源
把数据从内核传送到硬件和从硬件读取数据
读取应用程序传送给设备文件的数据和回送应用程序恳求的数据
检测和处理设备呈现的过错(底层协议)
用于差异详细设备的实例