Zircon内核对象
Zircon是基于对象的内核。用户模式下的代码基本上都是通过对象句柄与OS资源交互。句柄可以被认为是某个OS子系统与某个资源之间的活动会话。
Zircon动态地管理着如下资源:
- 处理器时间
- 内存和地址空间
- 设备IO内存
- 中断
- 信号和等待
应用层内核对象
IPC
任务
信号
内存和地址空间
等待
驱动层内核对象
内核对象与LK层
许多内核对象封装了一个或者多个LK层结构体,比如线程对象封装了 thread_t
,相反通道对就没有封装任何LK层对象。
内核对象生命周期
内核对象可以被重新计数。大多数的内核对象在系统调用时产生,被句柄持有计数等于1时处于活动状态,句柄绑定这个句柄值作为系统调用的输出。句柄对象一旦被附加到句柄表中,它就处于活动状态了。当句柄从关闭(调用sys_close()
)它们的句柄表中卸载时就会递减内核对象的计数。通常最后一个句柄被关闭时内核对象计数会等于0,此时会触发析构函数的运行。
当引用对象的新句柄被创建或者(某些内核代码)获取直接指针引用时,计数会递增。所以一个内核对象的生命周期可能会比创建它的进程的生命周期还要长。
调度器
内核对象是一个派生自Dispatcher
并实现了方法的C++类。所以你会看到线程对象的代码在 ThreadDispatcher
中。有许多代码只关心通用意义上的内核对象,这种情况下你看到的名字就是 fbl::RefPtr<Dispatcher>
。
内核对象安全
原则上说,内核对象没有内在的安全概念,也不会做安全检查。一个单独的进程可能由于同一对象的不同权限拥有两个不同的句柄。