输入输出设备原理

输入输出设备原理

2024 南京大学《操作系统:设计与实现》
输入输出设备原理

孤独的 CPU

CPU 只是 “无情的指令执行机器”

  • 取指令、译码、执行

center

Altair-8800 (1975), with Intel 8080A; 256B 板卡 RAM
(你需要在面板上拨动开关输入执行指令的起始地址)
2024 南京大学《操作系统:设计与实现》
输入输出设备原理

实现输入/输出

例子:发射核弹

  • 使计算机能感知外部状态 (眼睛、耳朵)、对外实施动作 (手)
2024 南京大学《操作系统:设计与实现》
输入输出设备原理

答案:一根线、一条指令 (树莓派上就有)

GPIO (General Purpose Input/Output)

  • 极简的模型:Memory-mapped I/O 直接读取/写入电平信号

center

2024 南京大学《操作系统:设计与实现》
输入输出设备原理

GPIO: 一根可以读写数据的线

center

led = LED(2)
led.on(); time.sleep(0.03); led.off()
  • 真正的核弹发射器也是类似的原理……
2024 南京大学《操作系统:设计与实现》
输入输出设备原理

I/O 设备:“计算” 和 “物理世界” 之间的桥梁

I/O 设备 = 一个能与 CPU 交换数据的接口/控制器

  • 就是 “几组约定好功能的线” (寄存器)
    • 通过握手信号从线上读出/写入数据
  • 给寄存器 “赋予” 一个内存地址 (Address Decoder)
    • CPU 可以直接使用指令 (in/out/MMIO) 和设备交换数据
    • 是的,就这么简单

center

2024 南京大学《操作系统:设计与实现》
输入输出设备原理

例子 (1): 串口 (UART)

“COM1” (Communication 1)

#define COM1 0x3f8

static int uart_init() {
  outb(COM1 + 2, 0);   // 控制器相关细节
  outb(COM1 + 3, 0x80);
  outb(COM1 + 0, 115200 / 9600);
  ...
}

static void uart_tx(AM_UART_TX_T *send) {
  outb(COM1, send->data);
}

static void uart_rx(AM_UART_RX_T *recv) {
  recv->data = (inb(COM1 + 5) & 0x1) ? inb(COM1) : -1;
}
2024 南京大学《操作系统:设计与实现》
输入输出设备原理

例子 (2): 键盘控制器

IBM PC/AT 8042 PS/2 (Keyboard) Controller

  • Port 0x60 (data), 0x64 (status/command)
  • command = 0xED → LED 灯控
  • command = 0xF3 → 设置重复速度和重复延迟
    • PS/2 接口的 6 根线分别是什么作用?

center

2024 南京大学《操作系统:设计与实现》
输入输出设备原理

例子 (3): 磁盘控制器

ATA (Advanced Technology Attachment)

  • IDE 接口磁盘 (40pin data 很 “肥” 的数据线 + 4pin 电源)
    • primary: 0x1f0 - 0x1f7; secondary: 0x170 - 0x177
void readsect(void *dst, int sect) {
  waitdisk();
  out_byte(0x1f2, 1);          // sector count (1)
  out_byte(0x1f3, sect);       // sector
  out_byte(0x1f4, sect >> 8);  // cylinder (low)
  out_byte(0x1f5, sect >> 16); // cylinder (high)
  out_byte(0x1f6, (sect >> 24) | 0xe0); // drive
  out_byte(0x1f7, 0x20);       // command (write)
  waitdisk();
  for (int i = 0; i < SECTSIZE / 4; i ++)
    ((uint32_t *)dst)[i] = in_long(0x1f0); // data
}
2024 南京大学《操作系统:设计与实现》
输入输出设备原理

持久化存储:复杂性的分解

1-Bit 的存储

  • 磁、坑、电……
  • 无论如何存储,设备都使用 “处理器能理解” 的接口

Serial ATA 接口

  • “几根导线”,可以工作在 IDE Mode/AHCI Mode

center

2024 南京大学《操作系统:设计与实现》
输入输出设备原理

例子 (4): 打印机

center

2024 南京大学《操作系统:设计与实现》
输入输出设备原理

打印机是个怎样的设备?

center

  • 打印机将字节流描述的文字/图形打印到纸张上
2024 南京大学《操作系统:设计与实现》
输入输出设备原理

PostScript 和打印机

PostScript 一种描述页面布局的 DSL (Page DL)

  • 类似于汇编语言 (由 “编译器”,如 latex,生成)
    • PDF 是 PostScript 的 superset

打印机 (没错,实现自己的打印机没有那么困难)

  • 将汇编语言翻译成机械部件动作的设备
    • PCL, PostScript, 甚至直接支持 PDF
<ESC>*t300R          // Set resolution to 300 DPI
<ESC>*r1A            // Start raster graphics
<ESC>*b100W          // Set width of raster data (100 bytes)
<ESC>*b0M            // Set compression mode (0 = uncompressed)
<ESC>*b100V          // Send 100 bytes of raster data
<binary raster data> // Actual image data
<ESC>*rB             // End raster graphics
2024 南京大学《操作系统:设计与实现》
center
输入输出设备原理

然后我们就可以造计算机了!

2024 南京大学《操作系统:设计与实现》