sel4源碼解析(一) - sel4內核對象


sel4是微內核,它只提供了少數供用戶程序使用的機制。不像linux內核提供了大量的服務。本文主要介紹sel4提供的七個內核對象,着重講述了untyped這一內核對象。

sel4內核對象

Sel4提供了七個內核對象,這七個內核對象構成了一個進程基本運行環境。它們分別是:

  • CNodes:CNodes本質是一個結構體數組,該數組的元素是cte(capability table entry),該cte中包含一個cap_t結構體和mdb_node_t結構體(todo)。一個進程的CNodes稱爲Cspace,CNodes的cte稱爲slot。

  • Thread Control Blocks:同一般的進程控制塊類似,表示一個進程的運行狀態;

  • Endpoints:類似於記錄型信號量。進程1想要receive信息,但進程2還未send該信息,導致進程1暫時被掛載在該Endpoints隊列上。一旦進程2 send該信息,則將進程1從該endpoints隊列上取出,並重新加入調度隊列;

  • Notification:sel4實現的通知機制,讓進程之間可以使用notification完成同步;

  • Virtual address space:進程的虛擬地址空間;

  • Interrupt :

  • Untyped:

untyped

sel4 untyped表示爲一塊連續未分配的物理內存,用戶程序可以通過untyped cap來使用這塊物理內存。下面介紹了untyped cap結構體以及在untyped內存上創建TCB內核對象。

untyped cap結構體

untyped cap結構體:

  • capFreeIndex:表示起始空閒地址的偏移;
  • capIsDevice:表示當前這段連續的物理內存是否爲設備地址空間;
  • capBlockSize:表示當前這段連續的物理內存空間大小;
  • capPtr:指向當前這段連續的物理內存起始地址。

capFreeIndex和capPtr的區別是:untyped的內存可能有一部分被使用了,應爲capFreeIndex表示當前的untyped空閒內存,所以capFreeIndex會隨之改變。而capPtr表示untyped物理內存起始地址,所以capPtr不會改變。

block untyped_cap {
    field capFreeIndex 48	// 起始空閒地址的偏移
    padding 9
    field capIsDevice 1
    field capBlockSize 6
    field capType 5
    padding 11
    field_high capPtr 48	// untyped的內存起始地址
}

創建內核對象TCB

seL4_Untyped_Retype函數是使用untyped的物理內存的唯一API,其有八個參數,分別是:

  • seL4_Untyped _service:untyped的cap;
  • seL4_Word type:創建的內核對象類型,本例是seL4_TCBObject;
  • seL4_Word size_bits:創建內核對象所佔內存的大小,這裏TCB是固定的(由Kernel指定),故爲0;
  • seL4_CNode root:CNode的基地址;
  • seL4_Word node_index:
  • seL4_Word node_depth:
  • seL4_Word node_offset:存放在CNode表中的untyped cap的偏移;
  • seL4_Word num_objects:將要創建的內核對象cap的個數。

具體的創建流程如下:

  1. 用戶程序調用函數seL4_Untyped_Retype;
seL4_Untyped_Retype(child_untyped, seL4_TCBObject, 0, seL4_CapInitThreadCNode, 0, 0, child_tcb, 1);
  1. 進入內核,根據系統調用編號,執行decodeUntypedInvocation函數。該函數執行的操作如下:
    a. 從ipc buffer裏面取出創建內核對象的相關信息;
    b. 根據root、node_index和node_depth找到對應的CNode cap;
    c. 檢查該CNode的尺寸是否容得下node_offset以及對應node_offset的slot是否爲空;
    d. 根據untyped cap信息得到untyped內存的空間內存的起始地址,並判斷是否能夠存放內核對象;
    e. 調用invokeUntyped_Retype函數。

  2. invokeUntyped_Retype函數更新該untyped cap存放的空閒內存信息,並調用createNewObjects函數;

  3. createNewObjects函數的功能如下:
    a. 在untyped cap指向的空閒空間初始化tcb;
    b. 生成tcb cap;
    c. 將該tcb cap插入到第2步找到得的CNode對應的slot裏。

  4. 完成。

相關閱讀

sel4源碼解析(一) - sel4內核對象
sel4源碼解析(二) - CSpace
sel4源碼解析(三) - sel4系統調用處理流程
sel4源碼解析(四) - ipc
sel4源碼解析(五) - Notification
sel4源碼解析(六) - 進程
sel4源碼解析(七) - vspace

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章