seL4 系统调用
seL4微内核为线程间通信提供了一个消息传递服务。这个服务也被使用于内核提供的服务的通信中。这是一个标准的消息格式,每个消息包含了数据字以及有可能有一些能力。这些消息的结构体和编码被详细的在第四部分记载。
线程通过调用他们能力空间中的能力来发送消息。当用这种方式调用一个终端节点的时候,消息需要经过内核传递到其他线程中。当内核对象的能力被调用时,这消息将会被解释成想一个关于内核对象类型特定的方式的方法调用。例如,调用一个线程控制块(TCB)能力用一个正确格式化的消息将会暂停目标线程。
seL4内核提供了如下系统调用:
seL4_Send() 通过已被命名的能力来传递消息,然后允许应用程序继续。如果这个调用的能力是一个终端节点而且没有收件者马上接受这个消息。这个发送的线程将会阻塞直到这个消息能够被传递。无错的代码和响应将会被接受的线程和内核对象返回。
seL4_NBSend() 执行一个无阻塞的消息发送,它和seL4_Send() 差不多除了当消息不能够被马上接受的时候不大一样,这个货默认会把消息扔掉,其他的差不多,对的代码和响应也是由接受的线程或内核对象返回。
seL4_Call() 是一个阻塞发送线程直到回复消息被接收的seL4_Send(),当发送的消息被发送给其他线程(通过一个终端节点),一个附加的回复能力被添加到消息中,被交给收件者去给他权力回复发送者。这个回复的能力存储在收件者的TCB的一个特定目标槽中。当内核服务调用能力,使用seL4_Call()能够允许内核返回一个错误代码或者其他响应在回复消息中。
seL4_Reply() 被使用响应一个seL4_Call(),使用的能力一般来自于seL4_Call()的系统调用和回复线程的TCB(线程控制单元),它传递消息给这个调用的线程,在进程中唤醒它。
这是一个每个线程的TCB仅有一个回复能力的空间,所以seL4_Reply系统调用仅能够被拿来回复大部分最近的调用者。seL4_Cnode_SaveCaller()方法能够描述晚一点的能被拿来存储能力进常规能力空间,它能够和seL4_Send() 配合使用。
seL4_ReplyWait()是方法seL4_Reply()和seL4_Wait()的结合,它的存在是因为要求高效:
回复请求和等待下一个的相似环节能被单个内核系统调用执行,代替他们两个。
seL4_Yield() 是唯一一个不请求能力的系统调用,它将导致被调用的线程放弃占用的时间片让给其他运行在同一优先级的线程,如果没有运行态是同一级的线程,这个系统调用就没有影响。