概念:在Linux系统中,所有设备都被映射成【设备文件】来处理,设备文件linux系统有哪些文件类型,应用程序可以像操作普通文件一样对硬件设备进行操作。
一、设备类型
整理自:(相当不错linux安全加固,建议有时间看下原文)
《第一章设备驱动简介1.3.节设备和模块的分类》
《Linux设备驱动之字符设备驱动》
通常情况下,以Linux的设备可分辨为3种基本设备类型:字符设备、块设备,网路设备
一个字符设备或块设备都在/dev目录下对应一个设备文件。
linux用户程序通过设备文件(或称设备节点)来使用驱动程序操作字符设备和块设备。
字符设备
是指只能一个字节一个字节读写的设备,不能随机读取设备显存中的某一数据,读取数据须要根据先后数据。
字符设备是面向流的设备wps for linux,常见的字符设备有滑鼠、键盘、串口、控制台和LED设备等。
本控制台(/dev/console)和并口(/dev/ttyS0)是字符设备的事例,由于它们挺好地诠释了流的具象.
字符设备通过文件系统结点来存取,比如/dev/tty1和/dev/lp0.
在一个字符设备和一个普通文件之间惟一有关的不同就是,你常常可以在普通文件中移来移去,而且大部份字符设备仅仅是数据通道,你只能次序存取.但是,存在看上去象数据区的字符设备,你可以在上面移来移去.诸如,framegrabber常常这样,应用程序可以使用mmap或则lseek存取整个要求的图象.
字符设备文件(类型为C):
备注:
悉心的人,可能会发觉设备文件是无文件大小的,取而代之的是两个号码:主设备号+此设备号(见下文)
块设备
是指可以从设备的任意位置读取一定厚度数据的设备。块设备包括硬碟、磁盘、U盘和SD卡等
就像字符设备,块设备通过坐落/dev目录的文件系统结点来存取.
一个块设备(比如一个c盘)应当是可以驻有一个文件系统的.
在大部份的Unix系统,一个块设备只能处理这样的I/O操作,传送一个或多个宽度时常是512字节(或一个更大的2的幂的数)的整块.
Linux,相反,准许应用程序读写一个块设备象一个字符设备一样--它容许一次传送任意数量的字节.结果就是,块和字符设备的区别仅仅在内核以及在内部管理数据的形式上,但是因而在内核/驱动的软件插口上不同.就像一个字符设备,每位块设备都通过一个文件系统结点被存取的,它们之间的区别对用户是透明的.块驱动和字符驱动相比,与内核的插口完全不同.
块设备文件(类型为B):
网路插口
任何网路事务都通过一个插口来进行,就是说,一个才能与其他主机交换数据的设备.
一般,一个插口是一个硬件设备,并且它也可能是一个纯粹的软件设备,例如环回插口.
一个网路插口负责发送和接收数据报文,在内核网路子系统的驱动下,毋须晓得单个事务是怎样映射到实际的被发送的报文上的.
好多网路联接(非常这些使用TCP的)是面向流的,并且网路设备却经常设计成处理报文的发送和接收.
一个网路驱动对单个联接一无所知;它只处理报文.
既然不是一个面向流的设备,一个网路插口就不象/dev/tty1这么容易映射到文件系统的一个结点上.
Unix提供的对插口的存取的形式一直是通过分配一个名字给它们(比如eth0),并且这个名字在文件系统中没有对应的入口.
内核与网路设备驱动间的通信与字符和块设备驱动所用的完全不同.不用于read和write,而是由内核调用和报文传递相关的函数.
备注:linux文件类型还包括:普通文件(-),套接字文件(S),链接文件(L),可见:《linux文件类型全解析》linux系统有哪些文件类型,剩下还有其他:目录(D),资料传输档案(FIFO,PIPE),
二、主设备号与次设备号
查看主设备号与次设备号:ls-al/dev
查看当前已加载的设备驱动程序的主设备号:cat/proc/devices
第一列为主设备号,第二列为设备名
每位字符设备和块设备都必须有主次设备号,主设备号相同的设备是同类设备(使用同一驱动程序)
区别是否同类设备,可以更好的对设备进行管理和优化,主要彰显在:
系统可能包含几个同样类型的设备,由同一个设备驱动程序管理(不须要重复加载驱动到内核)
可以将同类设备合并上去,以便插入到内核的数据结构中进行管理
三、其他
参照:《Linux内核--设备文件命名(官方文档)》,《对于Linux内核tty设备的一点理解》
以下是在Mac系统中的一些小实验:
tty
1.打开两个终端,都切换到root
step1:终端1:
#通过tty获取当前终端的对应的文件地址:
root#tty
/dev/ttys001
#持续监控ttys001文件内容
root#tail-f/dev/ttys001
step2:终端2:
root#echo'hello/dev/ttys0001'>/dev/ttys001
step3:终端1输出了一下内容:
hello/dev/ttys0001
2.ssh到一台linux系统,都切换到root
step1:终端1:
#通过tty获取当前终端的对应的文件地址:
root#tty
/dev/pts/0
#持续监控ttys001文件内容
root#tail-f/dev/pts/0
step2:终端2:
echo'hello/dev/pts/0'>/dev/pts/0
step3:终端1输出了一下内容:
hello/dev/pts/0