From 794d402a4bd2da2fce982c9c6f32af1b005484a7 Mon Sep 17 00:00:00 2001 From: Yu Chen Date: Mon, 2 Aug 2021 09:23:42 +0800 Subject: [PATCH] update docs --- docs/src/ch01-01-kernel-object.md | 2 +- docs/src/ch01-02-process-object.md | 26 ++++++++++++++++++++------ docs/src/ch01-03-channel-object.md | 6 ++++++ docs/src/ch03-02-vmo.md | 6 ++++++ docs/src/ch03-04-vmar.md | 2 ++ docs/src/ch05-00-signal-and-waiting.md | 22 ++++++++++++++++++++++ docs/src/ch05-04-futex-object.md | 2 ++ 7 files changed, 59 insertions(+), 7 deletions(-) diff --git a/docs/src/ch01-01-kernel-object.md b/docs/src/ch01-01-kernel-object.md index b2f9f34..c55ec83 100644 --- a/docs/src/ch01-01-kernel-object.md +++ b/docs/src/ch01-01-kernel-object.md @@ -1,4 +1,4 @@ -# 初识内核对象 +# 初识内核对象 ## 内核对象简介 diff --git a/docs/src/ch01-02-process-object.md b/docs/src/ch01-02-process-object.md index 7796964..ecb805a 100644 --- a/docs/src/ch01-02-process-object.md +++ b/docs/src/ch01-02-process-object.md @@ -1,17 +1,31 @@ #### 对象管理器:Process 对象 -## 句柄和权限 +## 权限 -[句柄]: https://github.com/zhangpf/fuchsia-docs-zh-CN/blob/master/zircon/docs/handles.md [权限]: https://github.com/zhangpf/fuchsia-docs-zh-CN/blob/master/zircon/docs/rights.md -对象可能有多个句柄(在一个或多个进程中)引用它们。 +内核对象的“[权限](https://fuchsia.dev/docs/concepts/kernel/rights)”指定允许对内核对象进行哪些操作。权限与句柄相关联,并传达对关联句柄或与句柄关联的对象执行操作的特权。单个进程可能对具有不同权限的同一个内核对象有两个不同的句柄。 + +## 句柄 + +[句柄]: https://github.com/zhangpf/fuchsia-docs-zh-CN/blob/master/zircon/docs/handles.md + + +句柄是允许用户程序引用内核对象引用的一种内核结构,它可以被认为是与特定内核对象的会话或连接。 + +通常情况下,多个进程通过不同的句柄同时访问同一个对象。对象可能有多个句柄(在一个或多个进程中)引用它们。但单个句柄只能绑定到单个进程或绑定到内核。 + +当句柄绑定到内核时,我们说它是“在传输中”('in-transit')。 + +在用户模式下,句柄只是某个系统调用返回的特定数字。只有“不在传输中”的句柄对用户模式可见。 + +代表句柄的整数只对其所属的那个进程有意义。另一个进程中的相同数字可能不会映射到任何句柄,或者它可能映射到指向完全不同的内核对象的句柄。 + +句柄的整数值是任何 32 位数字,但对应于**ZX_HANDLE_INVALID**的值将始终为 0。除此之外,有效句柄的整数值将始终具有句柄集的两个最低有效位. 可以使用**ZX_HANDLE_FIXED_BITS_MASK**访问代表这些位的掩码。 -对于几乎所有的对象,当最后一个打开的引用对象的句柄关闭时,对象要么被销毁,要么被置于可能无法撤消的最终状态。 +句柄可以从一个进程移动到另一个进程,方法是将它们写入通道(使用[`channel_write()`](https://fuchsia.dev/docs/reference/syscalls/channel_write)),或者使用 [`process_start()`](https://fuchsia.dev/docs/reference/syscalls/process_start)传递一个句柄作为新进程中第一个线程的参数。对于几乎所有的对象,当最后一个打开的引用对象的句柄关闭时,对象要么被销毁,要么被置于可能无法撤消的最终状态。 -句柄可以从一个进程移动到另一个进程,方法是将它们写入通道(使用[`channel_write()`](https://fuchsia.dev/docs/reference/syscalls/channel_write)),或者使用 [`process_start()`](https://fuchsia.dev/docs/reference/syscalls/process_start)传递一个句柄作为新进程中第一个线程的参数。 -可以对句柄或它所引用的对象采取的操作受与该句柄关联的权限管理。引用同一个对象的两个句柄可能具有不同的权限。 在 `Cargo.toml` 中加入 `bitflags` 库: diff --git a/docs/src/ch01-03-channel-object.md b/docs/src/ch01-03-channel-object.md index 0e10ada..6468b6e 100644 --- a/docs/src/ch01-03-channel-object.md +++ b/docs/src/ch01-03-channel-object.md @@ -24,10 +24,16 @@ ## 创建一对内核对象 +## 创建通道 + +创建 Channel 将返回两个句柄,一个指向对象的每个端点。 + > 实现 Channel::create > > 讲一下互相持有对方 Weak 指针的目的,这里有不可避免的 unsafe ## 实现数据传输 +当句柄被写入通道时,它们会从发送进程中删除。当从通道读取带有句柄的消息时,句柄被添加到接收进程中。在这两个事件之间,句柄继续存在(确保它们所指的对象继续存在),除非它们写入的通道的末端关闭——此时发送到该端点的消息被丢弃并且它们包含的任何句柄都已关闭。 + > 实现 read, write 函数,read_write 单元测试 diff --git a/docs/src/ch03-02-vmo.md b/docs/src/ch03-02-vmo.md index a8ee1a7..9da0eae 100644 --- a/docs/src/ch03-02-vmo.md +++ b/docs/src/ch03-02-vmo.md @@ -4,6 +4,12 @@ > 根据文档梳理 VMO 的主要特性 +虚拟拟内存对象(Virtual Memory Objects, VMO)代表一组物理内存页面,或 潜在的页面(将根据需要延迟创建/填充)。 + +它们可以通过 [`zx_vmar_map()`](https://fuchsia.dev/docs/reference/syscalls/vmar_map)被映射到一个进程(Process)的地址空间,也可通过 [`zx_vmar_unmap()`](https://fuchsia.dev/docs/reference/syscalls/vmar_unmap)来解除映射。可以使用[`zx_vmar_protect()`](https://fuchsia.dev/docs/reference/syscalls/vmar_protect)来调整映射页面的权限。 + +也可以直接使用[`zx_vmo_read()`](https://fuchsia.dev/docs/reference/syscalls/vmo_read)来读取VMO和通过使用 [`zx_vmo_write()`](https://fuchsia.dev/docs/reference/syscalls/vmo_write)来写入 VMO。因此,通过诸如“创建 VMO,将数据集写入其中,然后将其交给另一个进程使用”等一次性(one-shot )操作,可以避免将它们映射到地址空间的开销。 + ## 实现 VMO 对象框架 > 实现 VmObject 结构,其中定义 VmObjectTrait 接口,并提供三个具体实现 Paged, Physical, Slice diff --git a/docs/src/ch03-04-vmar.md b/docs/src/ch03-04-vmar.md index 09e94a9..5cf4539 100644 --- a/docs/src/ch03-04-vmar.md +++ b/docs/src/ch03-04-vmar.md @@ -2,6 +2,8 @@ ## VMAR 简介 +虚拟内存地址区域(Virtual Memory Address Regions ,VMARs)为管理进程的地址空间提供了一种抽象。在进程创建时,将Root VMAR 的句柄提供给进程创建者。该句柄指的是跨越整个地址空间的 VMAR。这个空间可以通过[`zx_vmar_map()`](https://fuchsia.dev/docs/reference/syscalls/vmar_map)和 [`zx_vmar_allocate()`](https://fuchsia.dev/docs/reference/syscalls/vmar_allocate)接口来划分 。 [`zx_vmar_allocate()`](https://fuchsia.dev/docs/reference/syscalls/vmar_allocate)可用于生成新的 VMAR(称为子区域或子区域),可用于将地址空间的各个部分组合在一起。 + ## 实现 VMAR 对象框架 > 定义 VmAddressRange,VmMapping diff --git a/docs/src/ch05-00-signal-and-waiting.md b/docs/src/ch05-00-signal-and-waiting.md index 7cd30d0..00e5cff 100644 --- a/docs/src/ch05-00-signal-and-waiting.md +++ b/docs/src/ch05-00-signal-and-waiting.md @@ -1 +1,23 @@ # 信号和等待 + +## 信号 + +对象可能有多达 32 个信号(由 zx_signals *t 类型和 ZX* **SIGNAL** 定义表示),它们表示有关其当前状态的一条信息。例如,通道和套接字可能是 READABLE 或 WRITABLE 的。进程或线程可能会被终止。等等。 + +线程可以等待信号在一个或多个对象上变为活动状态。 + +## 等待 + +线程可用于[`zx_object_wait_one()`](https://fuchsia.dev/docs/reference/syscalls/object_wait_one) 等待单个句柄上的信号处于活动状态或 [`zx_object_wait_many()`](https://fuchsia.dev/docs/reference/syscalls/object_wait_many)等待多个句柄上的信号。两个调用都允许超时,即使没有信号挂起,它们也会返回。 + +超时可能会偏离指定的截止时间,具体取决于计时器的余量。 + +如果线程要等待大量句柄,使用端口(Port)会更有效,它是一个对象,其他对象可能会绑定到这样的对象,当信号在它们上被断言时,端口会收到一个包含信息的数据包关于未决信号。 + +## 事件与事件对 + +事件(Event)是最简单的对象,除了它的活动信号集合之外没有其他状态。 + +事件对(Event Pair)是可以相互发出信号的一对事件中的一个。事件对的一个有用属性是,当一对的一侧消失时(它的所有句柄都已关闭),PEER_CLOSED 信号在另一侧被断言。 + +见:[`zx_event_create()`](https://fuchsia.dev/docs/reference/syscalls/event_create), 和[`zx_eventpair_create()`](https://fuchsia.dev/docs/reference/syscalls/eventpair_create)。 \ No newline at end of file diff --git a/docs/src/ch05-04-futex-object.md b/docs/src/ch05-04-futex-object.md index 1fdbbac..76bd64e 100644 --- a/docs/src/ch05-04-futex-object.md +++ b/docs/src/ch05-04-futex-object.md @@ -6,6 +6,8 @@ > > 为什么快:利用共享内存中的原子变量,避免进入内核 +Futexes 是内核原语,与用户空间原子操作一起使用以实现高效的同步原语(如Mutexes, Condition Variables等),它只需要在竞争情况(contended case)下才进行系统调用。通常它们实现在标准库中。 + ## 实现基础元语:wait 和 wake > 实现 wait 和 wake 函数,并做单元测试