Live2D

输入输出设备

输入输出设备的分类

可分为块设备和字符设备

  • 块设备将信息存储在固定大小的块中,每个块有自己的位置。硬盘就是常见的块设备。

  • 字符设备发送或接收的是字节流,不用考虑任何块结构,没有办法寻址。鼠标就是常见的字符设备。

因为块设备存储的数据量比较大,一般会有缓冲区。CPU写入缓冲区的数据攒够一部分才会转发给设备。(CPU不会直接和设备打交道,而是通过中间的设备控制器进行处理,如硬盘有硬盘控制器,USB有USB控制器)

 

CPU如何与控制器进行通信?

  • 每个控制器被分配一个I/O端口,可以通过特殊的汇编指令,如in/out操作这些寄存器。

  • 数据缓冲区,可内存映射I/O,直接分配一段内存空间给它,就像读写内存一样读写数据缓冲区。如区域ioremap。

设备读取完后如何通知CPU呢

控制器的寄存器一般会有状态标志位,可以通过检测状态标志位,来确定输入或者输出操作是否完成。那么可以通过轮询等待进行判断,也可以通过中断的方式,通知操作系统输入输出操作已经完成。

 

中断的分类

中断有两种,一种是通过代码调用INT产生软中断。一种是硬件中断,通过中断控制器触发的。

除了中断通知CPU的方式,还可以通过DMA的方式读取或写入大量数据。DMA可以在CPU不参与的情况,自动完成对内存的读写。

img

中断处理流程

  • 外部设备给中断控制器发送物理中断信号

    • 中断控制器将物理中断信号转换成为中断向量 interrupt vector,发给各个 CPU

      • 每个 CPU 都会有一个中断向量表,根据 interrupt vector 调用一个 IRQ 处理函数。注意这里的 IRQ 处理函数还不是咱们上面指定的 irq_handler_t,到这一层还是 CPU 硬件的要求

        • 在 IRQ 处理函数中,将 interrupt vector 转化为抽象中断层的中断信号 irq,调用中断信号 irq 对应的中断描述结构里面的 irq_handler_t

字符设备总结

 

  • 需要设备驱动程序的ko模块,里面有模块初始化函数,中断处理函数,设备操作函数。这里面封装了对于外部设备的操作。

  • 在/dev目录下有一个文件表示这个设备,这个文件在特殊的devtmpfs文件系统上,因而也有相应的dentry和inode。这里的inode是一个特殊的inode,里面有设备号。通过该inode可以找到驱动程序。

  • 打开字符设备文件和打开普通文件有相似之处。都有文件描述符,struct file,指向字符设备文件的dentry和inode。

posted @ 2022-05-16 11:20  eminemrapgod  阅读(103)  评论(0编辑  收藏  举报