系统调用指令

系统调用指令

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

系统调用:向操作系统的 “函数调用”

syscall: “跳转并获得无限的权力”

center

call  printf@plt  // PLT; dynamic linked
call  pmm_alloc   // locally linked

syscall = “jal”:  // sysret: 逆操作
    mov %rip, %rcx
    mov %rflags, %r11
    set SS = kernel, SS = kernel, CPL = 0
    jmp IA32_LSTAR  // System Target Address Register
2024 南京大学《操作系统:设计与实现》
系统调用指令

syscall 之后

CPU: 我只是无情的执行指令的机器

while (true) {
    inst = fetch();
    decode(&decode_state, inst);
    exec(&decode_state);
}
  • 此时 RIP = IA32_LSTAR, CPL = 0
  • 操作系统可以配置 IA32_LSTAR
    • setjmp() → 在另一个栈中执行 → longjmp() → sysret
    • 执行时可以直接访问 I/O 设备和内核数据结构
    • 操作系统 = C 程序
2024 南京大学《操作系统:设计与实现》
系统调用指令

一些细节

现在还是 “VR 眼镜模式”

  • 进程的内存被 “拆散”,并且被 Page Table 重组了
inst = fetch();
  • 从 M[LSTAR] 的虚拟地址处取指令

操作系统内核:配置内存映射

  • 低配版 (0): 只使用分段 (Linux 1.x; like Minix)
  • 低配版 (1): 物理内存 → 0xc0000000 (Linux 2.x)
  • 今天:Complete kernel virtual memory map !@#&)*!@**^&)@#
2024 南京大学《操作系统:设计与实现》
系统调用指令

让我们调试它!

Everything is a state machine

  • QEMU 本身就是一个状态机模拟器
    • 在一条 syscall 上打一个断点
    • 观察寄存器/内存的变化

这其实也是个挑战

  • 我们怎么 “在一个 syscall 指令上打断点”?
2024 南京大学《操作系统:设计与实现》