Sel4采用基于capability的访问控制模型,进程对系统资源的访问控制权限组成一个capability space,所有的cap存放在CNode里。CSpace是由CNode构成,CNode可以看成一个数组,数组元素称为slot,每一个slot里面可以存放一个cap或者为空。
Sel4提供CDT(capability derive tree)结构保存权能的拷贝、
CNode
CNodes本质是一个结构体数组,该数组的元素是cte(capability table entry),cte中包含一个cap_t结构体和mdb_node_t结构体。CNodes的cte称为slot,下面是slot的结构体:
- cap:包含权限和指向具体cap的指针;
- cteMDBNode:保存cap之间的关系,比如:untyped cap衍生出的其它对象的cap。
struct cte {
cap_t cap;
mdb_node_t cteMDBNode;
};
CNodes本身是一个内核对象,也有相应的cap。下面是CNode cap的结构体:
- capCNodeGuard:具体的guard数值;
- capCNodeGuardSize:guard占的位数;
- capCNodeRadix:CNode的最大slot个数;
- capCNodePtr:指向CNode的指针;
block cnode_cap(capCNodeRadix, capCNodeGuardSize, capCNodeGuard, capCNodePtr, capType) {
field capCNodeGuard 64
field capType 5
field capCNodeGuardSize 6
field capCNodeRadix 6
field_high capCNodePtr 47
}
capability
capability的结构体的大小是16字节,它包含两部分,一部分是seL4_CapRights,另一部分是指向具体对象cap的指针。下面是cap的结构体和seL4_CapRights结构体:
struct cap {
uint64_t words[2];
};
block seL4_CapRights {
padding 32
padding 28
field capAllowGrantReply 1
field capAllowGrant 1
field capAllowRead 1
field capAllowWrite 1
}
sel4定义了如下几类cap(不同的架构可能会不同,本例是arm32架构):
enum cap_tag {
cap_null_cap = 0,
cap_untyped_cap