← 前一天目录后一天 →

每日科普 · 2026-09-23 周三

考研 408 × 求职面试

知识点 · 操作系统 · 高频

用户态与内核态及系统调用

CPU 通常划分特权级:用户态运行应用程序,不能执行特权指令、访问内核地址;内核态运行操作系统,可控制硬件与所有内存。 1. 为什么区分:防止用户程序破坏系统、越权访问,保证安全与稳定。 2. 何时切换:进程执行普通计算时在用户态;需要文件、进程、内存、网络等服务时,必须请求内核。 3. 系统调用:它是用户程序与操作系统之间的受控入口,如 open、read、write、fork、exec、mmap、socket。 4. 典型过程:用户程序准备参数和系统调用号,执行 syscall/trap 等陷入指令,CPU 切到内核态并跳转处理程序;内核检查参数、执行服务,最后返回用户态。 系统调用不是普通函数调用,会发生状态切换,有保存现场、权限检查等开销。库函数如 printf 可能封装 write,但不等于所有库函数都是系统调用。

每日一题 · 操作系统

用户态与内核态及系统调用

以下关于用户态、内核态和系统调用的说法,正确的是( ) A. 用户态程序可以直接执行 I/O 特权指令 B. 系统调用只是普通函数调用,不会发生状态切换 C. 用户程序通过陷入指令主动进入内核态请求操作系统服务 D. 内核态不能访问用户地址空间

解析

选 C。用户态无权执行特权指令,A 错;系统调用需从用户态陷入内核态,伴随状态切换和现场保存,不是普通函数调用,B 错;内核态权限更高,通常可访问用户地址空间,D 错。系统调用的本质是提供受控入口:用户程序用陷入指令主动触发,CPU 切到内核态,由内核完成服务后返回。

面试小贴士 · 操作系统

用户态与内核态及系统调用

面试常问:为什么要分态、系统调用过程、与库函数/中断区别。答:特权级隔离、陷入切态、参数传递、返回及开销。易错:printf 不一定是系统调用;陷入是主动的,中断多来自外部;切换有成本,但不等于进程切换。

代码实现 · C

代码示例

#define _GNU_SOURCE
#include <unistd.h>
#include <sys/syscall.h>
#include <stdio.h>

int main(void) {
    // 直接发起 getpid 系统调用;CPU 从用户态陷入内核态
    long pid = syscall(SYS_getpid);
    printf("pid=%ld\n", pid);
    return 0;
}
← 前一天目录后一天 →