在我抽屉里躺半年多了,此前看过电子的,喜欢的不行,买了纸质的在桌子里睡觉。昨天想看一下select()的实现,搜索到了设备驱动那一章节。
非常透彻的讲解。基于linux2.4内核源码说的。
计算机最基本的三个物质基础就是cpu 内存 以及IO设备(eg:网卡/硬盘),严格地说,离开了对设备的操作即IO操作,计算机本身也就失去了意义。
文件操作是对设备操作的组织与抽象,而设备操作则是文件操作的最终实现。每一项设备都至少由文件系统的一个文件,更确切地说是节点,代表,因而都有一个文件名,应用程序通过设备的文件名寻访具体的设备,设备像普通文件一样受到文件系统访问权限控制的保护。应用程序可以通过系统调用open()打开设备文件,建立起来和目标设备的链接,或曰“上下文”,代表着该设备文件节点中记载着建立这种连接所需的信息,对于执行该应用程序的进程而言,建立起来的连接就表现为一个打开的文件。
打开了代表着目标设备的文件,即建立起来与设备的连接之后,就可以通过read write ioctl 等常规文件操作去操作目标设备,从应用程序的角度,设备文件逻辑行的空间是个线程空间,从这个逻辑空间到具体设备的物理空间的映射则由内核提供,并划分成文件操作与设备驱动两个层次。
对于一个具体的设备来说,文件操作和设备驱动成为同一事物的不同层次,概念上可以把一个系统划分成应用,文件系统以及设备驱动这三个层次,尽管具体的划分和安排可以不同,例如文件系统层和设备驱动层都在内核中,但是也有的系统把文件系统放在内核外面作为应用层的一个进程。
文件系统通常建立咋块设备上,但是字符设备上也可以建立文件系统,界限也模糊。因为字符设备也越来越复杂,而且出现了既像块设备又像字符设备的新设备如网卡,若说网卡是字符设备,可是输入输出又是有结果的,成块的-报文包帧,说他是块设备吧,块又不是固定大小的,几个字节或者上千字节,并且块设备和字符设备有个区别,就是块设备的介质必须是存储介质,并且支持随机访问-即对指定地址的访问,因为系统调用lseed对于块设备是不可缺少的操作。字符设备的介质一般是传输介质,只支持顺序访问,因为lseek对于字符设备意义不大,从这个意义上说,网卡又是字符设备。
常规都是把成块输入输出并且打算在上面建立普通文件系统的设备才称为块设备。
在代表这设备的文件节点,记载着与特定设备建立连接所需要的信息,这个信息由三部分构成,1.文件、设备的类型,2 主设备号,3,次设备号,其中设备类型和主设备号结合在一起唯一确定了设备的驱动程序和界面,而次设备号说明目标设备是同类设备的第几个。
早起unix把所有的设备文件节点防砸i/dev目录中,是这个目录下是平面的,
要使设备在系统中可见,成为应用程序可以访问的设备,要在文件系统中有一个代表此项的文件节点,这是通过系统调用mkmod实现的,
书到用时方很晚,没学进去的总是要付出代价去偿还的,还是平时就积少成多潜心多学习的好,不然兴趣就是安慰自己的空谈,行动不会说谎。