系统调用从用户态进入内核态,只是理解这条路径的起点。沿着一次 read() 往下看,还会遇到几个紧密相关的问题:
read()是怎么进入内核的?- 时钟中断为什么能让正在运行的线程停下来?
- Page Fault 为什么有时是正常行为,有时又会变成
SIGSEGV? - 系统调用进了内核,是否一定会发生线程上下文切换?
这些问题可借助一条 read(fd, buf, count) 调用串起来看。用户程序执行 read(),glibc 把系统调用号和参数放到约定寄存器里,CPU 执行 syscall 进内核。内核检查 fd、缓冲区地址、文件状态,再决定从 Page Cache、文件系统、socket 缓冲区或设备驱动里取数据。
2026/7/21大约 18 分钟
