capability的概念
capability是用于訪問系統(tǒng)中的entity/object的獨(dú)一無二的token啸箫。
在seL4初始化階段终佛,那些可以控制seL4所有資源的capability就已經(jīng)交給了root task片效。如果需要使用任何一種資源裁着,用戶都必須使用內(nèi)核API和相應(yīng)的capability去執(zhí)行操作。capability就是個(gè)數(shù)字衡招,如seL4_CapInitThreadTCB是1,這是root task訪問它自己的TCB的capability每强,seL4_CapInitThreadTCB是libsel4中預(yù)定義的一個(gè)數(shù)字始腾。
CNode的概念
CNode是一個(gè)capability的數(shù)組州刽,CSlot是CNode中的槽位,它只有兩種狀態(tài):有capability或沒有capability(即null)浪箭。
第0號CSlot保持為空穗椅。CSlot的大小為1u<<seL4_SlotBits,所以只會(huì)是2奶栖,4匹表,8,16等2的倍數(shù)宣鄙,所以CNode中CSlot的數(shù)量就是CNodeSize/(1u<<seL4_SlotBits)桑孩。
CSpace的概念
CSpace是一個(gè)線程的所有capability,所以它可以由一個(gè)或者多個(gè)CNode組成框冀。CSpace的尋址方式有兩種:直接調(diào)用(Invocation)和直接CSpace尋址流椒。
CSpace尋址方式1(Invocation)
在啟動(dòng)階段,root task已經(jīng)有一個(gè)CNode被安裝好作為它的CSpace root明也,如seL4_CapInitThreadTCB和seL4_CapInitThreadVSpace這些capability都是在CSpace root中的宣虾,可以直接調(diào)用的。例如:
seL4_TCB_ReadRegisters(seL4_CapInitThreadTCB, 0, 0, num_registers, ®isters);
seL4_TCB_Suspend(seL4_CapInitThreadTCB);
CSpace尋址方式2(直接CSpace尋址)
通過直接指出CSlot的位置温数,這是需要三個(gè)重要的信息:
- _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。