xenpaging流程詳解

2021-10-08 09:56:19 字數 3625 閱讀 5496

1) xenpaging初始化。

2) 交換檔案初始化。

3) 訊號處理初始化。

4) 建立page_in執行緒。

5) 將記憶體頁page out到交換檔案上。

² 程式中,通過for迴圈呼叫evict_victim函式將數量為num_pages的頁從虛擬機器中page out出來。

² 當找不到num_pages個滿足page out條件的頁時,盡可能多的將頁page out出來,然後,跳出for迴圈。

6) 進入乙個while大迴圈,完成整個xenpaging開啟過程中的頁交換動作。

² 在5)之後,虛擬機器中一部分頁被交換到檔案中,記憶體釋放掉了。當虛擬機器系統再次用到page out頁時,會觸發缺頁中斷。該中斷被xen捕獲,會進一步觸發xenpaging的還頁動作。此時,xen會重新分配一頁,並從交換檔案中讀取該頁資訊進行填充,最終,重新對映回虛擬機器內部。

² 當balloon向下調整記憶體時,其釋放的頁若為page out的頁,則將該頁丟掉,在位圖里標記為page in。

7) 接收到結束訊號,進行page in動作。

² 當xenpaging接收到sigterm(kill)或者sigint(ctrl+c)訊號時,將執行page in的動作,在將所有交換出的記憶體頁交換回虛擬機器後,進行結束程序前的清理動作。

8) 清理動作xenpaging_teardown。

1) 為xenpaging_t型別的變數paging分配記憶體。

2) 連線xenstore。

3) 初始化shutdown watch。

² 該shutdown watch是用於監控xenstore的@releasedomain值,在虛擬機器關機時,觸發xenpaging的關閉動作。

4) 初始化policy_mru_size。

² policy_mru_size預設為1024 * 16,即對應64m記憶體。policy_mru_size的作用就是防止最近64m被page in的記憶體頁被選中page out出來。該機制的優點是,防止近期頻繁使用到的頁被page out出來,進而降低交換頻率,提高效能。

5) 連線xen。

6) 設定domain id。

7) 初始化shared page。

8) 初始化ring page。

9) 初始化ring。

10) 初始化xen。

11) 開啟事件通道。

12) 繫結事件通道。

13) 獲取domaininfo。

14) 為page out的點陣圖分配記憶體。

² page out的點陣圖是用來記錄哪些頁被page out出來的資料結構。在選頁page out和還頁的過程中都起到關鍵作用。

15) 調節num_pages。

² 當num_pages小於0,或者大於虛擬機器最大頁數。那麼將num_pages置為虛擬機器的最大頁數。

16) 選頁策略初始化。

² 目前的選頁策略是從中間開始,用以避免bios啟動過程中執行paging。

1) 策略選擇犧牲者。

² policy_choose_victim的選頁演算法是從全域性靜態變數current_gfn開始,線性遞增選頁,直到選到的頁不在pageout的點陣圖中且不在unconsumed的點陣圖中則跳出while迴圈,將當前頁選作被pageout出來的犧牲者。

² 另外一種情況,轉了一圈又回到選頁起點,則返回no space錯誤,說明所有pageout點陣圖都被佔滿。

2) 記憶體頁paging提名。

² xc_mem_paging_nominate通過xc呼叫最終呼叫p2m.c中的p2m_mem_paging_nominate。該函式對策略選出的頁進行檢查,看是否符合要求。若不符合則重新「策略選擇犧牲者」。

a. 檢查gfn對應的mfn是否有效。無效則提名失敗。

b. 檢查該頁是否pagable。否則失敗。

c. 檢查該頁是否io記憶體頁。是則失敗。

d. 檢查p2m_is_paging。是則失敗。

e. 檢查p2m_is_shared。是則失敗。

f. 檢查頁計數和型別。

² 通過檢測後,將p2m型別置為p2m_ram_paging_out。

3) xenpaging驅逐頁。

² 通過選頁和提名兩關的頁就「悲劇」地被xenpaging驅逐啦。

² 驅逐過程分為下面幾步:

a. 對映頁。通過xc_map_foreign_pages將虛擬機器中的頁對映到程式中。

b. 複製頁。通過write_page函式將對映頁寫入交換檔案。

c. 清理頁。將頁清零並解除對映。

d. 告訴xen來驅逐頁。xc_mem_paging_evict通過xc呼叫p2m_mem_paging_evict來將頁徹底釋放。並將p2m型別置為p2m_ram_paged。

page in按觸發條件分為兩大類:

1) 由缺頁引起的page in。

² 虛擬機器缺頁會觸發vmx.c中的ept_handle_violation。

² ept_handle_violation→hvm_hap_nested_page_fault

→p2m_mem_paging_populate

² 檢查ring是否滿了。如果滿了,則返回。

² 如果p2mt為p2m_ram_paged,將其置為p2m_ram_paging_in_start。

² 暫停vcpu。

² 向xenpaging傳送page in的request。

2) xenpaging收到中斷訊號sigterm或者sigint,會觸發xenpaging將所有頁page in,然後退出程序。

² 在中斷訊號初始化後,create_page_in_thread建立乙個page in執行緒。該執行緒函式主體為page_in,處於待觸發狀態。

² xenpaging在收到sigterm或者sigint後,迴圈呼叫page_in_trigger來觸發page_in執行xc_map_foreign_pages。

² xc_map_foreign_pages又會進一步觸發do_mmu_update。

² do_mmu_update中呼叫p2m_mem_paging_populate來完成page in動作。(同缺頁時pagein)

在xenpaging的main函式有個while大迴圈,當檢測到環中有未處理請求,則依次處理。

1) ring裡有未處理請求,get_request獲得請求。

2) 檢查該頁未page in,則找出該頁在交換檔案中位置。

3) 若該頁標誌位為drop,則policy_notify_paged_in策略通知pagein。

4) 否則,xenpaging_populate_page填充頁。

² xc_mem_paging_prep讓xen為domain分配一頁。

a. 獲取空閒頁。

b. 置p2mt為p2m_ram_paging_in。

² 對映頁。將虛擬機器中頁對映使用。

² 將交換檔案內容讀入頁。

² 解除對映。

5) 拯救頁。

² 將response放入環。

² 通知策略頁被pagein。

² 告訴xen頁已經準備好被換入。

a. 從環拿出響應。

b. 如果頁不為mem_event_flag_drop_page,則置p2mt為p2m_ram_rw。

c. unpause虛擬機器的vcpu。

2023年5月21日上傳

msgSend 流程詳解

1.編譯階段 使用者呼叫乙個普通函式 anobject dotings things 編譯器會把其編譯為 objc msgsend anobject,selector dothings things 注意 根據函式返回值的不同,編譯器還會將其編譯為objc msgsend stret objc ms...

測試流程詳解

首先回顧一下,軟體測試的生命週期 需求分析 測試計畫 測試設計 測試開發 測試執行 測試評估 然後開始今天的講解,測試流程 需求分析 測試計畫 編寫測試用例 測試執行 測試報告編寫 準備工作 確定測試範圍 一般情況,50 的錯誤都來自於需求。分析方法 確定整個專案測試的把控 測試計畫包括 根據測試計...

Spring Security流程詳解

授權 authorization 由spring 根據spring security.xml 建立spring security的物件,並把它們交給spring容器管理 當乙個請求過來,首先經過 delegatingfilterproxy 過濾器 由它將請求交給spring security 內部的...