macOS IPC Study basic

算是个读书笔记吧,把利用Port进行IPC的这个过程转成自己的理解。

Scenario 1 : Alice && Bob

Alice 提前知道Bob,即:

1
Alice processes a `SEND` right to a port whose `RECEIVE` right is held by Bob.
  1. Alice 创建一个临时port,她对这个port有 RECEIVEright
  2. Alice 对创建的port添加 SENDright
  3. Alice 使用提前知晓的对其有 SENDright的port,把她刚创建的临时port向Bob发过去
  4. Bob接收到这个Alice创建的port之后,Bob可以利用这个port和Alice通信,因为这个临时port有 SENDright 和 RECEIVEright

Scenario 2 : Bootstrap server (regstrain)

场景1有点类似先有鸡和先有蛋的问题,即最开始Alice咋知道Bob的(最开始 SENDright 的port哪里来的?),所以这里引入了一个中间人— bootstrap

Bob:

  1. Bob 对 bootstrapserver 持有 SEND rightport
  2. Bob 创建另外的port,对其有 RECEIV right, 并且对其创建 SEND right,然后利用最开始对 bootstrap持有的 SEND RIGHTport,把新创建的这个 SEND right发过去。
  3. 同时,发送过去的 SEND right有一个别名,可以方便索引到这个 SEND right,这里叫 com.apple.Bob

Alice:

  1. 同样的,Alice对 bootstrap server,持有 SEND rightport
  2. Alice发送消息给 bootstrap server,查询 com.apple.Bob,想要获取对Bob的 SEND right
  3. bootstrap server接收到之后,根据Alice提供的别名查询,找到之后,返回对应的 SEND right给Alice
  4. 至此,Alice可以使用获得的这个 SEND right和Bob通信了(别忘了上面说的,Bob对这个port有 RECEIVE right)

Scenario 3: Bootstrap server (check-in)

这种比较麻烦,出于安全考虑的设计 : bootstrap server 怎么确定这个服务的确就是真的服务呢?而不是某个别有用心的程序冒充的呢?

  1. 系统初始化的时候,bootstrap server 初始化所有的服务,对这些服务有 RECEIVE right
  2. Alice通过 bootstrap_lookup()想要获取想要的服务(com.apple.Bob)的 SEND right
  3. 此时,bootstrap server拿到了这个请求,此时Bob这个服务还不存在,这个时候需要bootstrap server 使用 fork()``exec()等api产生这个服务(当然权限也要设计好)
  4. 此时Bob存在了,醒来了,他使用 bootstrap_check_in()bootstrap server申请对自己服务的port的 RECEIVE right
  5. bootstrap server会对这个申请的port(此时Bob是它唯一的拥有者)创建 SEND right,然后发送给Alice
  6. 至此,两人可以通信了

Reference

*OS Internals Volume I User Mode – Jonathan Levin