内核对象
内核对象可以是三类数据之一:
- 一个核心内核对象,如信号量、线程、管道等。
- 一个线程堆栈,它是一个
z_thread_stack_element的数组,用K_THREAD_STACK_DEFINE()声明 - 属于已定义的子系统集之一的设备驱动程序实例(const结构体设备)
已知的内核对象和驱动程序子系统的集合在 include/kernel.h中被定义为k_objects。
内核对象对用户线程完全不透明。用户线程在进行API调用时使用到内核对象的地址,但可能永远不会取消对这些地址的引用,这样做将导致内存保护故障。所有的内核对象都必须放置在用户线程无法访问的内存中。
由于用户线程可能不直接操作内核对象,因此它们的所有使用都必须通过系统调用。为了对内核对象执行系统调用,由系统调用处理程序函数检查内核对象地址是否有效,以及调用线程是否有足够的权限来处理它。
对对象的权限还具有对对象的引用的语义。这对于某些执行临时分配的对象api或者本身已经从运行时内存池分配的对象来说非常重要。
如果对象丢失所有引用,可能会发生两个事件:
- 如果对象具有关联的清理函数,则可以调用清理函数以释放对象正在使用的任何运行时分配的缓冲区。
- 如果该对象本身是动态分配的,则将释放该对象的内存。
对象放置
仅被监督线程使用的内核对象没有任何限制,可以位于二进制
本文介绍了Zephyr内核中用户模式下的内核对象,包括核心内核对象、线程堆栈和驱动程序实例。讨论了对象放置、动态对象的创建与释放、权限管理以及初始化状态。还提到了如何创建新的内核对象类型和配置选项。
订阅专栏 解锁全文
251

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



