github上Fuchsia项目相关文章翻译 - Kernel Objects(fuchsia-mirror/magenta/kernel_objects.md)

版权声明:本文为博主原创文章,未经博主允许不得转载。

Magenta Kernel objects – Magenta的内核对象

Magenta is a object-based kernel. User mode code almost exclusively interacts with OS resources via object handles which map kernel objects to processes.

  Magenta是一个基于对象设计的内核。用户模式下,进程必须通过句柄调用的模式访问操作系统资源,而该句柄会将要访问的资源以内核对象的方式映射到用户进程中。
  
Kernel objects in progress – 已有内核对象
• Process – 进程
• Thread – 线程
• Event – 事件
• Message pipe – 消息管道
• Interrupt request – 终端请求
• VMObject – VM对象

Kernel objects planned – 未来要增加的内核对象
• Data pipe – 数据管道
• Job – 任务
• IOPort – IO端口

Kernel Object and LK – 内核对象与LK
Some kernel objects wrap one or more LK-level constructs. For example the Thread object wraps one thread_t. However the Message Pipe does not wrap any LK-level objects.

  部分内核对象包含了一个多个LK组件。例如:线程对象包含一个thread_t,而消息管道不包含任何LK组件。
  
Kernel object lifetime – 内核对象生命周期
Kernel objects are ref-counted. Most kernel objects are born during a syscall and are held alive at refcount = 1 by the handle which binds the handle value given as the output of the syscall. The handle object is held alive as long it is attached to a handle table. Handles are detached from the handle table closing them (for example via sys_close()) which decrements the refcount of the kernel object. Usually, when the last handle is closed the kernel object refcount will reach 0 which causes the destructor to be run.

  对于每个内核对象,都对应有一个refcount变量和一个句柄表。一个内核对象,可能被多个进程调用多次,而每次调用都会产生一个对象句柄,而调用同一内核对象产生的所有句柄都被保存在该对象对应的句柄表中,其对应的refcount变量就记录了对象被调用的次数。
  对于大多数内核对象,它们创建于运行系统调用函数时,并返回操作该对象的句柄。该句柄绑定了系统调用函数的返回值,且将refcount的值加1。
  内核对象存活期间,系统会将其对应的句柄保存在句柄表中;内核对象关闭时(通过调用sys_close()函数),系统会将其句柄从句柄表中移除,并将该内核对象对应的refcount减一。通常情况下,一个内核对象对应的句柄表中的所有句柄都被移除时,它的refcount也就相应的变为了0。

  在某些特殊情况下,不光是在调用内核对象产生新句柄时refcount加1,某些内核代码中指针指向内核对象时,其refcount也会加1。因此,有时候,内核对象的生命周期可能会比通过句柄调用它的进程的生命周期长一些。

Dispatchers
A kernel object is implemented as a C++ class that derives from Dispatcher and that overrides the methods it implements. Thus, for example, the code of the Thread object is found in ThreadDispatcher. There is plenty of code that only cares about kernel objects in the generic sense, in that case the name you’ll see is utils::RefPtr.

  每个内核对象都是以C++类的形式实现的,它继承了Dispatcher类,并实现了该类里的所有接口。比如:Thread对象的代码继承自ThreadDispatcher,而ThreadDispatcher类继承自Dispatcher类。代码中,你会遇到很多通过utils::RefPtr类型的指针调用内核对象的情况。
  
Kernel Object security – 内核对象的安全机制

  原则上,内核对象本身并没有安全机制和权限检验机制,安全权限是由内核句柄控制的。一个进程可以有两个具有不同权限的句柄指向同一个内核对象。

你可能感兴趣的:(Fuchsia)