Zircon内核对象
Zircon是一个基于对象的内核。 用户空间代码几乎完全通过对象句柄与OS资源交互。 句柄可被认为是具有作用于特定资源的特定OS子系统的活动会话。
Zircon积极地管理以下资源:
- 处理器时间
- 内存和地址空间
- 设备IO内存
- 中断
- 信号和等待
应用程序可用的内核对象
IPC
任务
信号
内存和地址空间
等待原语
驱动程序可用的内核对象
内核对象和LK
一些内核对象封装一个或多个LK层的结构,例如,Thread对象封装了thread_t
。
但Channel
未封装任何LK级别的对象。
内核对象生命周期
内核对象采用引用计数的方式追踪。
大多数内核对象在系统调用期间生成,并通过作为系统调用输出值的句柄将refcount保持在大小为1。
只要句柄对象依然挂载到句柄表上,它就会保持活跃状态。
如果句柄与关闭它们的句柄表相分离(例如,通过sys_close()
调用),这将会同时减少内核对象的引用次数。
通常,当最后一个句柄关闭时,内核对象引用计数将减至0,并触发析构函数的运行。
当创建(引用到对象)的新句柄和(通过某些内核代码)获取直接指针引用时,引用值都会增加。 因此,内核对象的生命周期可能比创建它的进程的生命周期更长。
Dispatcher
内核对象以C++的类方式实现,它们派生自Dispatcher
并覆盖其已实现的方法。
例如,Thread
对象的代码可以在ThreadDispatcher
中找到。
有很多代码只关注一般意义上的内核对象,在这种情况下,你看到的名称是fbl::RefPtr<Dispatcher>
。
内核对象安全
原则上,内核对象没有内在的安全概念,也不进行授权检查,安全权限由每个句柄进行控制。 单个进程可以提供两个不同权限的句柄,它们指向同一对象。