Sel4的通知机制类似于记录型信号量。比如:进程1在等待通知,但进程2还未发送该通知,则会导致进程1暂时被挂载在该notification队列上。一旦进程2发送该通知,则将进程1从该notification队列上取出,并重新加入调度队列。
利用sel4的通知机制可以实现进程之间的同步。下面主要介绍了notification结构体、notification cap的结构体、内核函数和用户程序API。
notification结构体主要包括四个部分:
结构体如下所示:
block notification {
padding 16
field_high ntfnBoundTCB 48
field ntfnMsgIdentifier 64
padding 16
field_high ntfnQueue_head 48
field_high ntfnQueue_tail 48
padding 14
field state 2
}
notification的三种状态:
enum notification_state {
NtfnState_Idle = 0,
NtfnState_Waiting = 1,
NtfnState_Active = 2
};
notification cap结构体主要包括了四个部分:
具体如下所示:
block notification_cap {
field capNtfnBadge 64
field capType 5
field capNtfnCanReceive 1
field capNtfnCanSend 1
padding 9
field_high capNtfnPtr 48
}
void bindNotification(tcb_t *tcb, notification_t *ntfnPtr)
将notification绑定到指定的tcb,该函数:
void unbindNotification(tcb_t *tcb)
notification和tcb取消绑定,该函数:
void sendSignal(notification_t *ntfnPtr, word_t badge)
给notification发送通知,该函数根据当前notification所处的状态做不同的处理:
void receiveSignal(tcb_t *thread, cap_t cap, bool_t isBlocking)
notification等待通知,该函数根据当前notification所处的状态做不同的处理:
void seL4_Signal(seL4_CPtr dest)
进程向notification发送通知。
seL4_MessageInfo_t seL4_Wait(seL4_CPtr src, seL4_Word *sender)
进程等待notification的通知,进程进入阻塞态直到被唤醒。
seL4_MessageInfo_t seL4_Poll(seL4_CPtr src, seL4_Word *sender)
进程等待notification的通知,但是进程不进入阻塞态。