RISC-V uses loads for input, stores for output (MMIO)
(Some processors may have special input and output instructions)
某些物理地址是用来响应 I/O 设备的
假设 CPU 要和键盘交互,每次 CPU 和键盘交互时,都会去到某个物理地址
I/O chunk 包含两个部分:control register (if I/O is ready) & data register
(这里的 register 和 cpu 里的 register 不是一个概念,就是一个约定俗成的名字)
Polling
processor 循环读取 control register,等 I/O 准备好了,设置 Ready bit -> 1
processor 读取(input)或写入(output)数据进 data register
再重置 ready bit 为 0
I/O device speeds
Memory Mapped I/O
RISC-V uses loads for input, stores for output (MMIO) (Some processors may have special input and output instructions) 某些物理地址是用来响应 I/O 设备的 假设 CPU 要和键盘交互,每次 CPU 和键盘交互时,都会去到某个物理地址 I/O chunk 包含两个部分:control register (if I/O is ready) & data register (这里的 register 和 cpu 里的 register 不是一个概念,就是一个约定俗成的名字)
Polling
Polling RISC-V Example
Polling cost
一个小例子: 假设我们在一台主频为 1GHz 的机器上,使用 400 clock cycles/polling 的鼠标(鼠标polling 30 次/s 来避免错过用户操作) 每秒鼠标 polling 耗费的 clock cycles = 30 400 = 12K % Processor for polling: 12 10^ 3 / (1 * 10^9) = 0.0012% (可以看出鼠标 polling 不怎么吃性能,但如果是 hard disk polling,就没这么轻松了) 为了解决 polling 造成的资源浪费,我们可以用 exception 来帮着触发 I/O,当 I/O 完成数据传输的时候,我们用 interrupt 中断当前进程。
Interrupt
没必要像警犬一样竖着耳朵监听 I/O 操作: 假设家人出门没带钥匙,要我们帮着开门。 我们在卧室看书,也不知道家人什么时候到家,于是看会书就跑去阳台,看看人回来了没 (polling) 实际上,大多数人都不会这样做,而是先专注做自己的事情,等门铃响了再去开门。
等门铃响,就很像 interrupt 机制
等 I/O 准备好了,中断当前进程,并把 control 传给 interrupt handler 注:interrupt 是异步的,也是由外部事件引起的,e.g. disk I/O; key press interrupt 不会组织任何指令完成,只是中断它;interrupt 也不和任何指令相关联,但它可能在某个指令运行的时候突然出现 (第5步,I/O完成之后跳回之前正在运行的指令)
Exception
exception 是同步的,exception 发出以后,就要停下当前进程,去运行 exception e.g. divide by 0; bus error; illegal memory access; syscall; overflow error C 语言最常见的 exception: segmentation fault (core dumped)
Exception 步骤
异常出现、存储PC和registers、转向 trap handler、执行 handler 代码、恢复 registers 和 PC
Trap
执行 interrupt 或 exception 时, 跳转去 "interrupt or trap handler" 的过程
Polling vs. Interrupts
Low data rate(e.g. 鼠标、键盘)
用 interrupts 就好,避免一直傻等 I/O ready
High data rate(e.g. network, disk)
一开始用 interrupts 等数据,等开始拿数据以后,转为 polling(keep grabbing data until it stops:假设总共要收一吨货,来一点搬一点,比等货都运到了再卸车高效)
Real Solution: Direct Memory Access (DMA)
I/O 设备那么多,各个都要引起 CPU 的注意,这不是很心累么 CPU 干脆把 I/O 处理外包给别人——DMA engine
programmed I/O (PIO) vs. DMA
来自 SU20 视频的小比喻: polling: 去餐厅等餐,半天不上菜,一直问菜好了吗 interrupt:线上预点单,菜好了去取餐 DMA:点外卖,等餐取餐送餐让外卖小哥搞定
Operation of a DMA transfer