系统调用
用户线程运行比监督线程少的特权:某些CPU指令可能不被使用,它们只能访问内存映射的有限部分。系统调用(可能)允许用户线程执行对它们不直接可用的操作。
在定义系统调用时,确保只通过系统调用接口来访问API的私有数据是非常重要的。私有内核数据不应该直接提供给用户模式线程。例如,k_queue
api被故意不提供,因为它们直接将队列的登记信息存储在队列缓冲区中,从用户模式可见的登记信息。
允许用户注册在监督模式下运行的回调函数的api不应该作为系统调用公开。仅保留这些选项以供监控模式访问。
本节介绍了如何声明新的系统调用,并讨论了与它们相关的一些实现细节。
组件
所有系统调用都具有以下组件:
- 一个前缀为
__syscall
的C原型。它将在include/下的某个头中声明,或在另一个SYSCALL_INCLUDE_DIRS
目录中声明。这个原型从来不是手动实现的,而是由scripts/gen_syscalls.py
脚本创建的。生成的是一个内联函数,它要么直接调用实现函数(如果从监督模式调用),要么通过特权提升和验证步骤(如果从用户模式调用)。 - 一个实现函数,它是系统调用的实际实现。如果从用户模式调用,实现函数可以假设传入的所有参数都已被验证。
- 一个验证函数,它包装实现函数,并对传入的所有参数进行验证。
- 一个解编组函数,它是一个自动生成的处理程序,必须包含在用户源代码中。
C原型
C原型表示如何从用户模式或监督模式中调