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有
RECEIVE
right - Alice 对创建的port添加
SEND
right - Alice 使用提前知晓的对其有
SEND
right的port,把她刚创建的临时port向Bob发过去 - Bob接收到这个Alice创建的port之后,Bob可以利用这个port和Alice通信,因为这个临时port有
SEND
right 和RECEIVE
right
Scenario 2 : Bootstrap server (regstrain)
场景1有点类似先有鸡和先有蛋的问题,即最开始Alice咋知道Bob的(最开始 SEND
right 的port哪里来的?),所以这里引入了一个中间人— bootstrap
Bob:
- Bob 对
bootstrap
server 持有SEND right
port - Bob 创建另外的port,对其有
RECEIV right
, 并且对其创建SEND right
,然后利用最开始对bootstrap
持有的SEND RIGHT
port,把新创建的这个SEND right
发过去。 - 同时,发送过去的
SEND right
有一个别名,可以方便索引到这个SEND right
,这里叫com.apple.Bob
Alice:
- 同样的,Alice对
bootstrap server
,持有SEND right
port - 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