输入输出设备:案例

输入输出设备:案例

2025 南京大学《操作系统原理》
输入输出设备:案例

#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;
}
2025 南京大学《操作系统原理》
输入输出设备:案例

#2: 键盘控制器

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

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

center

2025 南京大学《操作系统原理》
输入输出设备:案例

#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
}
2025 南京大学《操作系统原理》
输入输出设备:案例

#4: 打印机

center

2025 南京大学《操作系统原理》
输入输出设备:案例

打印机是个怎样的设备?

center

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

PostScript 和打印机

PostScript: 一种描述页面布局的 DSL

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

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

  • 将汇编语言翻译成机械部件动作的设备
    • PCL, PostScript, IPP (AirPrint)
<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
2025 南京大学《操作系统原理》
输入输出设备:案例

如果想要 “无穷无尽” 的 I/O 设备?

计算机硬件生态的 “扩展性”

  • 想卖大价钱的 “大型机”:IBM, DEC, ...
  • 车库里造出来的 “微型机”:名垂青史的梦想家
    • IBM PC/AT: ISA (Industry Standard Architecture) 总线
    • Apple II: 50-pin slot connector (Apple II Bus)

center

2025 南京大学《操作系统原理》
输入输出设备:案例

#5: 总线

提供设备的 “虚拟化”:注册转发

  • 把收到的地址 (总线地址) 和数据转发到相应的设备上
  • 例子: port I/O 的端口就是总线上的地址
    • IBM PC 的 CPU 其实只看到这一个 I/O 设备
2025 南京大学《操作系统原理》
输入输出设备:案例

PCIe 总线

今天获得 “CPU 直连” 的标准设备

  • 接口
    • 75W 供电
      • 所以我们需要 6-pin, 8-pin 的额外供电
  • 数据传输
    • PCIe 6.0 x16 带宽达到 128GB/s
      • 于是我们有了 800Gbps 的网卡 😂
    • 总线自带 DMA (专门执行 memcpy 的处理器)
  • 中断管理
    • 将设备中断转发到操作系统 (Message-signaled Interrupts)
2025 南京大学《操作系统原理》
输入输出设备:案例

PCIe 总线 (cont'd)

支撑了现代 I/O 设备的体系

  • 高速设备都是直插 PCIe 的
    • FPGA
    • 显卡
    • 网卡
    • ……
  • USB Bridge
  • NVMe
2025 南京大学《操作系统原理》