Understandinng IPC Mechanisms of Fuchsia OS

1 minute read

Published:

Fuchsia 定义了几种资源

  1. Processor Time
  2. Memory & AS
  3. Device-IO Memory
  4. Interrupts
  5. Signaling & Waiting

Kernel Objects

  1. Kernel Objects 有一个独特的 64bit uint (kernel object id / koid)
    • 这个独特指的是在一次系统运行中是 unique 的
    • 特殊值:
    • const ZX_KOID_INVALID = 0 as null sentinel
    • const ZX_KOID_KERNEL = 1 the only one kernel
    • 从源代码粗略看来,ZX_KOID_INVALID被大量使用而ZX_KOID_KERNEL没有实际用处(只在一个VM的单元测试中被用到)
  2. Kernel 生成的 koid 只有 63bit,留一个 MSB 给手动分配的 koid

Jobs, Processes & Threads

  1. 一个 Job 有多个 Processes、一个 Process 有多个 Threads
  2. 最小的隔离级别应该还是 Process (通过 VMAR 推断)

Handles 和 Rights

  1. Handles 是32bit uint (type zx_handle_t)
    • reference to a kernel object
    • rights to the kernel objects
    • process it is bounded to
  2. Handle 的设计思想是让 User-mode Program reference到 Kernel Object
    • Kernel Object 的 Handle 对于 User-mode Program 而言是不可见的
  3. Calling process 会维护一个 Handle Table. 当Syscalls被执行时,Kernel 会通过 Handle Parameters 和 Handle Table 做一些检查
  4. 一个 Object 可有多个 Handles, 每个 Handle 可以有一个对应的 Right。 对绝大多数的 Objects 而言,当最后一个 Handle 被关掉后,这个 Object 被销毁或者进入进入等待被销毁的状态
  5. Handle 可以在 Process 之间被传递(尚不清楚是移动还是复制)

Syscalls

  1. Syscalls 可以被大致分为三类
    1. 没有任何限制的 Syscalls,这种 Syscall 数量很少,可以被任何 Thread 调用,比如
      • zx_clock_get_monotonic(void) 获得系统启动之后的流逝时间
      • zx_nanosleep(void) 高精度睡眠函数
    2. 把一个 Handle 作为第一个参数的 Syscalls,这种是绝大多数的 Syscall 类型
      • zx_channel_write()
      • zx_port_queue()
    3. 创建一个新 Object 而且不把 Handle 作为第一个参数。这种 Syscalls 的 Access 被 calling process 所在的 Jobs给控制
      • zx_event_create()
      • zx_channel_create()

IPC

  1. Fuchsia 中定义了3种IPC方式
    • Channel
    • Socket: 双向 IPC 通信(只可以传 Data),
    • FIFO
  2. Fucshia 似乎不把 Signaling 作为IPC的方式(Linux中的 signaling 是一种 IPC 方式)
  3. 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

  1. Kernel 生成 koid 的算法还没确定下来,需要改变。手动分配 koid 的算法取决于单个程序
  2. Wait One, Wait Many 和 Ports
  3. 一些特殊的 Kernel Objects
    • Port
    • Event
    • VMO
  4. VMARs (Virtual Memory Address Regions)