Linux操作系统拾遗之设备--概览

定义

还是那句话,Linux一切皆文件,就行java一切皆对象一样。那么设备当然也是文件(设备文件)。这些文件并不关联到硬盘或者其他的存储介质上,而是建立了与某个设备驱动程序的连接,已支持扩展设备通信。就应用程序而言,普通文件和设备文件都可以通过库函数操作,只是块设备多了几个用于设备的命令罢了。

分类

打开Linux的dev目录下可以看到

sudo ls -l  /dev/sda
brw-rw---- 1 root disk 8, 0 1013 2017 /dev/sda

$ sudo ls -l  /dev/tty
crw-rw-rw- 1 root tty 5, 0 529 15:24 /dev/tty

这种用b(block)开头的就是块设备,举个例子硬盘就是一个块设备,所谓块设备就是内核以块的方式去读写等操作,c(char)开头的就是字符设备,举个例子打印机,就是以一个一个字节操作的设备,这是最常用的两种设备。他们都是设备文件,他们和不通的文件相比,有两个特殊地方,第一是他们没有文件大小,第二是他们多了一个主设备号和从设备号,这个是设备号是用于内核匹配相应的驱动用的。
当然除了字符设备和块设备外,还有其他设备譬如网卡,网卡没有设备文件,用户程序通过使用套接字与网卡通信。标准库的网络相关函数通过内核socketcall系统调用进而访问网卡。
之所以个设备文件分配名称只是为了便于记忆,但名称本身无法表示其真正的用途,设备文件所在目录也和其功能不相干,这点不要混淆。

动态创建设备文件

/dev 下面有很多的设备文件,我们接触到的设备大部分都在这个下面。他并不是保存在磁盘上的,而是内存中,系统关机或者重启后就会消失,所以关机后卸载的设备在开机的时候是不会创建的,确保/dev下面没有旧设备,通过mount命令可以看到

devtmpfs on /dev type devtmpfs (rw,nosuid,size=65796688k,nr_inodes=16449172,mode=755)

通过udevd这个守护进程,它允许从用户层动态创建设备文件,即从用户层管理设备文件。每当内核检测到一个设备时会创建一个内核对象kobject,它借助sysfs文件系统导出到用户层,此外内核还向用户空间发送一个热插拔的消息,这个消息包括了驱动为该设备分配的主从设备号,udevd监听到这个消息会在/dev中创建对应的项,接下来就可以从用户层访问该设备了。

设备注册

上面讲述的只是在用户空间注册设备文件,但内核空间也是需要维护这些设备的。每一个字符设备都有一个cdev的实例,对应的每个块分区都有一个genhd实例,如果设备没有分区,我们可以视为具有单个分区的块设备。相应的有两个map去保存所有设备,分别是cdev_map和bdev_map,map的散列很简单,主设备号%255,由于大部分设备都没有超过255所有这种方式工作的很好。
这里写图片描述

文件系统关联

VFS中,每个文件都恰好一个inode,那么上面说的设备(字符、块)的设备文件自然也会有一个inode对应。inode里面有

struct file_operations  *i_fop;

union { 
    struct block_device *i_bdev;
    struct cdev *i_cdev;
};

i_fop是一组函数指针集合,这些有由VFS来调用。
除了inode当然还得有file结构,
处理如果是块设备使用下面的操作方法集

 const struct file_operations def_blk_fops = {
            .open           = blkdev_open,
            .release        = blkdev_close,
            .llseek         = block_llseek,
            .read           = do_sync_read,
            .write          = do_sync_write,
            .aio_read       = generic_file_aio_read,
            .aio_write      = generic_file_aio_write_nolock,
            ...

file_operations由VFS层用来与用户空间通信,这里面的方法是处理块的通用方法,而这里面的方法会调用根据各自块自己去实现的block_device_operations。具体的后面详细分析

猜你喜欢

转载自blog.csdn.net/u010278923/article/details/80526865