MIT 6.1810: xv6 book Chapter6: Interrupts and device drivers 笔记

驱动driver是操作系统中用来管理特定设备的代码

系统调用希望设备执行IO操作时,运行在内核线程 中的驱动代码会请求设备开始操作

操作结束后设备引发中断,驱动的interrupt handler找出完成操作的类型,执行后续操作

Code: Console input

控制台驱动 通过RISC-V上的UART硬件接受人类输入的字符

对于软件来说,UART表现为一系列内存映射的控制寄存器 ,地址开始于#define UART0 0x10000000L

LSR 输入字符是否正在等待被驱动读取

THR 传输时,驱动将一个字节写入THR,导致UART在FIFO队列中添加一个字节,后续通过RS232端口发送

kernel/uart.c uartinit()函数使UART每接收到一个字节的输入时引发接收中断receive interrupt ,发送一字节输入后引发传输结束中断transmit complete interrupt

Code: Console output

输出缓存(uart_tx_buf)使得进程不必等待UART结束发送

每次UART完成一个字节的发送,会引发一个中断。uartintr检查发送是否结束,并调用uartstart发送剩余被阻塞的字节

缓冲和中断实现了设备和进程的分离,也被称为IO并发

Timer interrupts

相关寄存器:

time 由硬件以恒定速率增加的计数,用作当前时间

stimecmp CPU将要引发时钟中断的时间 (对于qemu模拟的RISC-V,1000000时间单位约为1/10秒)

usertrap在处理时钟中断时,会调用yield来保证CPU能在可运行进程间多路复用

因为当前进程可能从当前CPU切换到另一个,所以在处理interrupt相关代码前需要小心保存相关寄存器的值

Real world

UART使用programmed IO ,软件驱动数据移动,这种方式简单,但在大量数据下传输速率慢;

**DMA(direct memory access)**设备驱动直接向内存中读写数据,现代磁盘和网络设备使用这种驱动

高速设备通过一些手段减少中断:

1.引发一次中断代表接下来的一系列请求

2.轮询polling 彻底禁用中断,转而周期性检查设备是否需要注意

xv6不是实时系统,现实中某些对实际时间要求很高的操作系统,如汽车自动驾驶控制器,需要对中断做出很快的反应

相关推荐
蒸蒸yyyyzwd4 小时前
AI应用相关可能的面试问题
笔记
叼烟扛炮5 小时前
[Git 实战] 学习笔记:从生成 SSH 密钥到解决 TortoiseGit 推送报错全指南
linux·运维·笔记·git·学习
蒸蒸yyyyzwd6 小时前
学习笔记 八股手撕
笔记·学习
揣一尾游鱼yu7 小时前
Spring上(IOC)笔记
java·笔记·spring·ioc
小李不想当小白9 小时前
BKP备份寄存器与RTC实时时钟(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
瑞码空间11 小时前
JSP与Servlet核心开发与CRUD实战笔记
java·笔记·servlet·jsp
La Pulga11 小时前
【FreeRTOS源码学习笔记】链表的实现
数据结构·笔记·stm32·mcu·链表·嵌入式·freertos
wuyoutrans14 小时前
以色列专利OA答复翻译,重点要避开哪些坑?
笔记
宝绿特塑业再生科技14 小时前
HDPE再生颗粒户外家具表面粉化机理与改性技术全解析
笔记·户外家具·再生塑料·塑木桌椅
凉、介15 小时前
深入理解 ARMv7-A | Generic Timer
笔记·学习·嵌入式·arm