步骤 7 / 7
不进内核的“系统调用”:vDSO
有些只读的小请求,内核干脆把答案放到用户态,省掉一趟切换。
像“现在几点”这种调用非常频繁,每次都陷入内核太亏。 Linux 把一小段内核提供的代码和数据映射进每个进程(叫 vDSO),clock_gettime、gettimeofday 通常直接在用户态读出结果。 这就像前端把不常变的数据放在本地缓存,不必每次都请求后端。
操作系统
程序不能直接碰硬件,想读写文件、上网、打印,都得通过“系统调用”这扇门请内核代办。
以 Linux(x86-64)上一个程序往终端打印一行字为例。
步骤 7 / 7
有些只读的小请求,内核干脆把答案放到用户态,省掉一趟切换。
像“现在几点”这种调用非常频繁,每次都陷入内核太亏。 Linux 把一小段内核提供的代码和数据映射进每个进程(叫 vDSO),clock_gettime、gettimeofday 通常直接在用户态读出结果。 这就像前端把不常变的数据放在本地缓存,不必每次都请求后端。
| 当前状态 | 发生了什么 |
|---|---|
| 用户态 | 程序想打印文字,但无权直接操作硬件 |
| 用户态 | 程序发起 write 系统调用 |
| 用户态 → 内核态 | CPU 切换模式,内核接手 |
| 内核态 | 检查参数,通过后驱动硬件完成输出 |
| 内核态 | 请求不合法,返回错误码 |
| 内核态 → 用户态 | 带着结果返回,程序继续执行 |
| 用户态 | 不陷入内核也拿到时间 |