图片说明

图引自 https://baijiahao.baidu.com/s?id=1637922221053576019&wfr=spider&for=pc
用户态与内核态

OS系统的主要功能是调度系统资源,如CPU、内存、外设等,如果这些重要的资源可以被进程随意访问,那么调度也就没有意义了。

现代OS通过**特殊的硬件特性**来禁止用户直接与底层硬件交互,如CPU就引入了两种执行模式:内核态和用户态,有时用户进程也需要访问一些系统资源,所以linux提供了系统调用(封装了接口),为它们提供服务。

系统调用

用户进程可以通过系统调用来完成某些特殊操作(创建进程、与底层硬件交互等),系统调用会触发CPU内的特殊指令,将CPU转化到内核态,然后实际任务是交给内核例程来完成,完成后再发起中断,由内核态下的调度程序切回用户态。

如fork()创建进程实例是交给内核例程来执行一个内核函数(啥名我忘了)。

总结:

系统调用其实是CPU在内核态下执行内核例程(内核里的特殊线程,有最高权限)。

有几个问题希望有大佬解惑下

1. 用户态、内核态是CPU的两种状态?
2. 触发CPU状态变化的特殊指令为何只能通过系统调用执行,如果我看了机器指令找到了它,能使用它吗?
3. 这些指令是为每一个内核函数写死的?