Skip to content

Latest commit

 

History

History
95 lines (72 loc) · 3.62 KB

ch01-02-process-object.md

File metadata and controls

95 lines (72 loc) · 3.62 KB

对象管理器:Process 对象

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 单元测试