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. |
- Alice 创建一个临时port,她对这个port有
RECEIVEright - Alice 对创建的port添加
SENDright - Alice 使用提前知晓的对其有
SENDright的port,把她刚创建的临时port向Bob发过去 - Bob接收到这个Alice创建的port之后,Bob可以利用这个port和Alice通信,因为这个临时port有
SENDright 和RECEIVEright
Scenario 2 : Bootstrap server (regstrain)
场景1有点类似先有鸡和先有蛋的问题,即最开始Alice咋知道Bob的(最开始 SENDright 的port哪里来的?),所以这里引入了一个中间人— bootstrap
Bob:
- Bob 对
bootstrapserver 持有SEND rightport - Bob 创建另外的port,对其有
RECEIV right, 并且对其创建SEND right,然后利用最开始对bootstrap持有的SEND RIGHTport,把新创建的这个SEND right发过去。 - 同时,发送过去的
SEND right有一个别名,可以方便索引到这个SEND right,这里叫com.apple.Bob
Alice:
- 同样的,Alice对
bootstrap server,持有SEND rightport - Alice发送消息给
bootstrap server,查询com.apple.Bob,想要获取对Bob的SEND right bootstrap server接收到之后,根据Alice提供的别名查询,找到之后,返回对应的SEND right给Alice- 至此,Alice可以使用获得的这个
SEND right和Bob通信了(别忘了上面说的,Bob对这个port有RECEIVE right)
Scenario 3: Bootstrap server (check-in)
这种比较麻烦,出于安全考虑的设计 : bootstrap server 怎么确定这个服务的确就是真的服务呢?而不是某个别有用心的程序冒充的呢?
- 系统初始化的时候,bootstrap server 初始化所有的服务,对这些服务有
RECEIVE right - Alice通过
bootstrap_lookup()想要获取想要的服务(com.apple.Bob)的SEND right - 此时,bootstrap server拿到了这个请求,此时Bob这个服务还不存在,这个时候需要bootstrap server 使用
fork()``exec()等api产生这个服务(当然权限也要设计好) - 此时Bob存在了,醒来了,他使用
bootstrap_check_in()向bootstrap server申请对自己服务的port的RECEIVE right - bootstrap server会对这个申请的port(此时Bob是它唯一的拥有者)创建
SEND right,然后发送给Alice - 至此,两人可以通信了
Reference
*OS Internals Volume I User Mode – Jonathan Levin