Understandinng IPC Mechanisms of Fuchsia OS
Published:
Fuchsia 定义了几种资源
- Processor Time
- Memory & AS
- Device-IO Memory
- Interrupts
- Signaling & Waiting
Kernel Objects
- Kernel Objects 有一个独特的 64bit uint (kernel object id / koid)
- 这个独特指的是在一次系统运行中是 unique 的
- 特殊值:
const ZX_KOID_INVALID = 0
as null sentinelconst ZX_KOID_KERNEL = 1
the only one kernel- 从源代码粗略看来,
ZX_KOID_INVALID
被大量使用而ZX_KOID_KERNEL
没有实际用处(只在一个VM的单元测试中被用到)
- Kernel 生成的 koid 只有 63bit,留一个 MSB 给手动分配的 koid
Jobs, Processes & Threads
- 一个 Job 有多个 Processes、一个 Process 有多个 Threads
- 最小的隔离级别应该还是 Process (通过 VMAR 推断)
Handles 和 Rights
- Handles 是32bit uint (type zx_handle_t)
- reference to a kernel object
- rights to the kernel objects
- process it is bounded to
- Handle 的设计思想是让 User-mode Program reference到 Kernel Object
- Kernel Object 的 Handle 对于 User-mode Program 而言是不可见的
- Calling process 会维护一个 Handle Table. 当Syscalls被执行时,Kernel 会通过 Handle Parameters 和 Handle Table 做一些检查
- 一个 Object 可有多个 Handles, 每个 Handle 可以有一个对应的 Right。 对绝大多数的 Objects 而言,当最后一个 Handle 被关掉后,这个 Object 被销毁或者进入进入等待被销毁的状态
- Handle 可以在 Process 之间被传递(尚不清楚是移动还是复制)
Syscalls
- Syscalls 可以被大致分为三类
- 没有任何限制的 Syscalls,这种 Syscall 数量很少,可以被任何 Thread 调用,比如
- zx_clock_get_monotonic(void) 获得系统启动之后的流逝时间
- zx_nanosleep(void) 高精度睡眠函数
- 把一个 Handle 作为第一个参数的 Syscalls,这种是绝大多数的 Syscall 类型
- zx_channel_write()
- zx_port_queue()
- 创建一个新 Object 而且不把 Handle 作为第一个参数。这种 Syscalls 的 Access 被 calling process 所在的 Jobs给控制
- zx_event_create()
- zx_channel_create()
- 没有任何限制的 Syscalls,这种 Syscall 数量很少,可以被任何 Thread 调用,比如
IPC
- Fuchsia 中定义了3种IPC方式
- Channel
- Socket: 双向 IPC 通信(只可以传 Data),
- FIFO
- Fucshia 似乎不把 Signaling 作为IPC的方式(Linux中的 signaling 是一种 IPC 方式)
- Channel
- 双向 IPC 通信(可以传送 Data 和 Handle)
- 维护各自的 Message Queue
- 清掉最后一个 Handle,Queue 会被清掉
- 清掉最后一个 Handle 不会对 Message 的 Lifetime 产生影响
IPC Limits
Zircon 中的 IPC 都是异步的,为了防止过多异步操作导致 livelocks 和 deadlocks,Zircon 限制了 IPC message queue buffer 的大小。一旦超出限制,就会报错
避免这种限制的一个方式就是尽量使得 message queue 增长和消耗的速率接近相等。
Glossary
- Kernel 生成 koid 的算法还没确定下来,需要改变。手动分配 koid 的算法取决于单个程序
- Wait One, Wait Many 和 Ports
- 一些特殊的 Kernel Objects
- Port
- Event
- VMO
- VMARs (Virtual Memory Address Regions)