capability的概念
capability是用于访问系统中的entity/object的独一无二的token。
在seL4初始化阶段,那些可以控制seL4所有资源的capability就已经交给了root task。如果需要使用任何一种资源,用户都必须使用内核API和相应的capability去执行操作。capability就是个数字,如seL4_CapInitThreadTCB是1,这是root task访问它自己的TCB的capability,seL4_CapInitThreadTCB是libsel4中预定义的一个数字。
CNode的概念
CNode是一个capability的数组,CSlot是CNode中的槽位,它只有两种状态:有capability或没有capability(即null)。
第0号CSlot保持为空。CSlot的大小为1u<<seL4_SlotBits,所以只会是2,4,8,16等2的倍数,所以CNode中CSlot的数量就是CNodeSize/(1u<<seL4_SlotBits)。
CSpace的概念
CSpace是一个线程的所有capability,所以它可以由一个或者多个CNode组成。CSpace的寻址方式有两种:直接调用(Invocation)和直接CSpace寻址。
CSpace寻址方式1(Invocation)
在启动阶段,root task已经有一个CNode被安装好作为它的CSpace root,如seL4_CapInitThreadTCB和seL4_CapInitThreadVSpace这些capability都是在CSpace root中的,可以直接调用的。例如:
seL4_TCB_ReadRegisters(seL4_CapInitThreadTCB, 0, 0, num_registers, ®isters);
seL4_TCB_Suspend(seL4_CapInitThreadTCB);
CSpace寻址方式2(直接CSpace寻址)
通过直接指出CSlot的位置,这是需要三个重要的信息:
- _service/root:要操作的CNode,它是CSpace root中的index;
- index:CSlot在CNode中的index;
- 深度:在CNode中寻找到CSlot的距离,对于单层CSpace,深度总是seL4_WordBits(即64位)。例如:
seL4_CNode_Copy(seL4_CapInitThreadCNode, 0, seL4_WordBits, seL4_CapInitThreadCNode, seL4_CapInitThreadTCB, seL4_WordBits, seL4_AllRights);
seL4_BootInfo中描述了许多初始的capability,也包括可用的空CSlot。