输入输出设备
可分为块设备和字符设备
-
块设备将信息存储在固定大小的块中,每个块有自己的位置。硬盘就是常见的块设备。
-
字符设备发送或接收的是字节流,不用考虑任何块结构,没有办法寻址。鼠标就是常见的字符设备。
因为块设备存储的数据量比较大,一般会有缓冲区。CPU写入缓冲区的数据攒够一部分才会转发给设备。(CPU不会直接和设备打交道,而是通过中间的设备控制器进行处理,如硬盘有硬盘控制器,USB有USB控制器)
CPU如何与控制器进行通信?
-
每个控制器被分配一个I/O端口,可以通过特殊的汇编指令,如in/out操作这些寄存器。
-
数据缓冲区,可内存映射I/O,直接分配一段内存空间给它,就像读写内存一样读写数据缓冲区。如区域ioremap。
设备读取完后如何通知CPU呢
控制器的寄存器一般会有状态标志位,可以通过检测状态标志位,来确定输入或者输出操作是否完成。那么可以通过轮询等待进行判断,也可以通过中断的方式,通知操作系统输入输出操作已经完成。
中断的分类
中断有两种,一种是通过代码调用INT产生软中断。一种是硬件中断,通过中断控制器触发的。
除了中断通知CPU的方式,还可以通过DMA的方式读取或写入大量数据。DMA可以在CPU不参与的情况,自动完成对内存的读写。
中断处理流程
-
外部设备给中断控制器发送物理中断信号
-
-
中断控制器将物理中断信号转换成为中断向量 interrupt vector,发给各个 CPU
-
-
-
-
在 IRQ 处理函数中,将 interrupt vector 转化为抽象中断层的中断信号 irq,调用中断信号 irq 对应的中断描述结构里面的 irq_handler_t
-
-
-
字符设备总结
-
需要设备驱动程序的ko模块,里面有模块初始化函数,中断处理函数,设备操作函数。这里面封装了对于外部设备的操作。
-
在/dev目录下有一个文件表示这个设备,这个文件在特殊的devtmpfs文件系统上,因而也有相应的dentry和inode。这里的inode是一个特殊的inode,里面有设备号。通过该inode可以找到驱动程序。
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了