Zircon的进程是传统意义上程序的实例:由一个或多个线程执行的一组指令以及相关的资源集合组成。
进程对象是以下资源的容器集合:
通常,它与正在执行的代码相关联,直到强制终止或程序退出为止。 进程由作业(Jobs)所拥有。每个进程属于一个作业,并且从资源和权限限制以及生命周期的控制的角度上看,由多个进程组成的应用程序被视为单个实体。
进程的定义如下:
// zircon-object/src/task/process.rs
// 进程
#[allow(dead_code)]
pub struct Process {
/// 内核对象核心结构,定义于 zircon-object/src/object/mod.rs
base: KObjectBase,
/// 引用计数,定义于 zircon-object/src/object/mod.rs
_counter: CountHelper,
/// 属于的作业,定义于 zircon-object/src/task/job.rs
job: Arc<Job>,
/// policy,定义于 zircon-object/src/task/job_policy.rs
policy: JobPolicy,
/// VMAR,定义于 zircon-object/src/vm/vmar.rs
vmar: Arc<VmAddressRegion>,
ext: Box<dyn Any + Send + Sync>,
/// Exceptionate(Kernel-owned exception channel endpoint),定义于 zircon-object/src/task/exception.rs
exceptionate: Arc<Exceptionate>,
debug_exceptionate: Arc<Exceptionate>,
/// 进程的内部可变部分
inner: Mutex<ProcessInner>,
}
// 进程的内部可变部分
#[derive(Default)]
struct ProcessInner {
/// 进程的状态
status: Status,
max_handle_id: u32,
/// 句柄(Handle),定义于 zircon-object/src/object/handle.rs
handles: HashMap<HandleValue, (Handle, Vec<Sender<()>>)>,
/// Futex(A primitive for creating userspace synchronization tools),定义于
futexes: HashMap<usize, Arc<Futex>>,
threads: Vec<Arc<Thread>>,
// special info
debug_addr: usize,
dyn_break_on_load: usize,
critical_to_job: Option<(Arc<Job>, bool)>,
}
// 进程的状态
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub enum Status {
Init,
Running,
Exited(i64),
}
介绍并实现 Handle,Rights
Handle
(句柄)是内核的“文件描述符”,它表示用户空间进程如何引用内核对象,通过Channel
可以将Handle
传递给其他进程.
对象可能有多个句柄(在一个或多个进程中)引用它们。对于所有的Object
,当最后指向它们的Handle
关闭时,该Object
同时也将被销毁,或者放置到结束状态下,并且这样的操作不可回滚。
在某种程度上可以将句柄理解为指针, 在对句柄或者其指向对象进行操作时受到Right
(权限)的控制, 就好像在用户态不能执行某些特权级指令一样。并且在指向对象的数个句柄中,Right
级别可以不一样。
使用上一节的方法,实现一个空的 Process 对象
添加成员变量 handles: BTreeMap<HandleValue, Handle>
实现 create,add_handle,remove_handle 函数
实现 get_object_with_rights 等其它相关函数
实现 handle 单元测试