天天看点

linux内核--设备驱动程序(学习笔记)

字符设备驱动

linux内核--设备驱动程序(学习笔记)

一个字符设备要能够工作,需要三部分配合:

  1. 有一个设备驱动程序的ko模块,包含中断处理函数、设备操作函数。模块初始化时,将设备号注册到内核的全局数据结构cdev_map中。
  2. /dev目录下有一个文件表示该设备,这个文件在特殊的devtmpfs文件系统上,有相应的dentry和inode。inode中有设备号,通过设备号可以在cdev_map中找到设备驱动程序。
  3. 用户可以打开一个字符设备文件,类似打开一个普通文件。字符设备文件的相关操作file_operations会指向设备驱动中的设备操作函数。

中断处理程序

linux内核--设备驱动程序(学习笔记)

外部设备发起的中断,叫做外部中断。外部中断,会到达中断控制器,中断控制器会发送中断向量给CPU。

每一个CPU,有一个idt_table,里面存放了不同的中断向量的处理函数。硬件终端的处理函数由do_IRQ统一处理,do_IRQ根据中断向量查找设备驱动程序中注册的中断处理函数。

块设备驱动

linux内核--设备驱动程序(学习笔记)
  1. 所有的块设备被一个map结构管理从dev_t到gendisk的映射
  2. /dev/xxx在devtmpfs文件系统上,存放有块设备号和dev_t。
  3. mount一个设备,就是把伪文件系统bdev中的block_device信息,放到具体文件系统的super_block中
  4. gendisk中存放有block_device_operations,可以进行块设备操作

    注意两个文件系统:devtmpfs和伪文件系统bdev。

    通过devtmpfs中的设备号dev_t在伪文件系统bdev中找到block_device。

    通过bdev中的block_device,找到主流文件系统的super_block中,接下来就可以

    通过主流文件系统(如ext4)的file_operations对块设备进行操作了。

    由于主流文件系统有很多,而且未来可能推出新的,写操作系统内核时不可能每次都针对新的文件系统进行更改,因此devtmpfs和伪文件系统只是为了获取和打开block_device,最终对block_device进行读写是交给主流文件系统的。

参考:

https://time.geekbang.org/column/article/101719

继续阅读