文章目錄
2. xenstore結構和通訊資料流程
XenStore結構
XenStore包含兩個模組:Dom0使用者空間的xenstored服務主模組,和Dom*裡的XenBus核心模組;此外,還有各種通訊介面。各個部分的功能如下:
Xenstored:Dom0使用者空間的一個服務,負責管理xenstore的資料(tdb),並且處理所有的請求。
XenBus:核心模組,提供Dom*核心訪問xenstore的API,提供使用者空間的xenfs介面(/proc/xen/xenbus)。Dom0的Xenbus還要初始化xenstored的運行環境。
共用頁面:每一個Domain(包括Dom0自身)都有一個與Dom0通訊的共用頁面(共用環),這個頁面同時被映射到了xenstored的記憶體空間。也就是說這個頁面可以同時被xenstored、dom0核心、和對應的DomU核心讀寫。Xenstored會隨時監控頁面,只要環被任意一方更新,xenstored就會直接處理訊息,不需要核心模組幹預。
Xenstore特殊檔案:
檔案 |
路徑 |
功能 |
xenbus |
/proc/xen |
XenBus使用者介面。使用者把請求寫入該檔案,經由核心發送到共用環 |
以下只在dom0中 |
|
|
tdb |
/var/lib/xenstored |
xenstore的資料庫,存放在dom0的/var/lib/xenstored/tdb,可以用tdbtool開啟 |
socket, socket_ro |
/var/run/xenstored |
Dom0直接操縱xenstored的介面 |
xsd_port, xsd_kva |
/proc/xen |
用於Dom0初始化 |
XenStore的通訊協定:
Xenstore各個模組間的通訊內容——請求和回複——都封裝成為一種資料包,格式定義在檔案xs_wire.h中。
[cpp]
view plaincopyprint?
- struct xsd_sockmsg
- {
- uint32_t type; /* XS_??? */
- uint32_treq_id;/* Request identifier, echoed in daemon's response. */
- uint32_ttx_id; /* Transaction id (0 if not related to a transaction). */
- uint32_t len; /* Length of data following this. */
-
- /* Generally followed bynul-terminated string(s). */
- };
而共用頁面上定義了一個環結構xenstore_domain_interface:
[cpp] view plaincopyprint?
- #define XENSTORE_RING_SIZE 1024
- typedef uint32_t XENSTORE_RING_IDX;
- #define MASK_XENSTORE_IDX(idx) ((idx) & (XENSTORE_RING_SIZE-1))
- struct xenstore_domain_interface {
- char req[XENSTORE_RING_SIZE]; /* Requests to xenstore daemon. */
- char rsp[XENSTORE_RING_SIZE]; /* Replies and async watch events. */
- XENSTORE_RING_IDX req_cons, req_prod;
- XENSTORE_RING_IDX rsp_cons, rsp_prod;
- };
DomU通訊流程
DomU的核心將請求放入共用環,這時Dom0的xenstored會直接檢測到這個改變並執行操作,最後把結果返回共用頁面。DomU的使用者空間需要通過/proc/xen/xenbus來操作xenstore。
DomU向XenStore寫入資料的xs_write函數調用流程:
DomU的核心調用流程:
Dom0 User、Kernel 通訊流程
Dom0的流程和DomU類似。但是在客戶空間,可以通過socket方式直接連接xenstored進行操作,不需要通過xenbus繞圈子。這也就是老版本Xen裡面,xs_domain_open和xs_daemon_open的區別。