sel4提供了基于endpoints实现的进程间通信,用于进程之间发送少量的信息和cap。
ipc是通过内核endpoints实现的,相应的有endpoints的结构体和endpoints cap的结构体。endpoints类似notification都有一个队列保存着当前挂载的队列,但endpoints同notification不同,notification是用来发送通知,并没有携带信息和cap。具体结构体如下所示:
block endpoint {
field epQueue_head 64
padding 16
field_high epQueue_tail 46
field state 2
}
block endpoint_cap(capEPBadge, capCanGrantReply, capCanGrant, capCanSend,
capCanReceive, capEPPtr, capType) {
field capEPBadge 64
field capType 5
field capCanGrantReply 1
field capCanGrant 1
field capCanReceive 1
field capCanSend 1
padding 7
field_high capEPPtr 48
}
void sendIPC(bool_t blocking, bool_t do_call, word_t badge, bool_t canGrant, bool_t canGrantReply, tcb_t *thread, endpoint_t *epptr)
void receiveIPC(tcb_t *thread, cap_t cap, bool_t isBlocking)
void cancelIPC(tcb_t *tptr)
为了简单起见,我们举了一个简单但非常实用的例子:有两个进程,一个进程发送信息,另外一个进程接收信息。具体流程如下: