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

被折叠的 条评论
为什么被折叠?



