• 沒有找到結果。

第五章 WinME在Linux作業系統下的實作

5.2 查詢和控制命令的實作

命令的實作部份是比較簡單的,原則上來講就是應用程式透過 WinME 去跟 系統底層下達命令。而處理系統底層的程式碼是由 WinME 作掉,應用程式只需 查看 WinME 放出來的命令來使用即可。

當應用程式填好 win_cmd 資料結構後呼叫 win_do_cmd 函式時,win_do_cmd 的動作只有把該資料結構的命令和參數欄位包裝成一個訊息封包後傳送給 WinME,然後 win_do_cmd 函式就會等待 WinME 的回傳資訊,等到 WinME 把 資訊回傳之後,再將該訊息的資料取出,填入 win_cmd 資料結構的 value 欄位,

然後再返回呼叫。

因為可能同時會有多個應用程式呼叫 win_do_cmd 函式,所以 WinME 並不是 馬上處理應用程式們所有要求的命令,而是把一些來不及處理的命令訊息先放到 命令佇列中,等到前一個命令處理完後再處理下一個。這邊要再強調一下,當應 用程式呼叫 win_do_cmd 時並不是直接去執行系統底層的程式碼,而是把要執行 系統相關動作的要求傳送給 WinME,請 WinME 幫忙執行。舉個例來說,當行 動管理員程式使用 win_do_cmd 來更改 IP 位址時,更改 IP 位址的動作並不是在 行動管理員的程序下執行的,而是在 WinME 的程序下執行的。

我們不使用類似函式庫的作法,也就是將底層的程式碼實作在 win_do_cmd 中,而是將所要執行的命令以訊息的方式傳送給 WinME 中央控管的好處有:

z WinME 可以控制資源的使用 z WinME 可以幫命令排優先權

z 只有 WinME 處理系統相關動作,win_do_cmd 的移殖可變的容易

缺點為就是當有很多命令在佇列中等待時,應用程式就需要等較長的時間。

Table 5-1 顯示了 win_do_cmd 的虛擬碼,我們可以發現在win_do_cmd中沒有任 何關於系統底層的動作。

Table 5-1 win_do_cmd 的虛擬碼

INT32 win_do_cmd (struct win_cmd* cmd) { pack cmd;

send to WinME;

wiat for WinME’s response;

fill info into cmd.value field;

return;

}

Figure 5-1 win_do_cmd 和中介軟體等序列圖

Figure 5-1 顯示了應用程式呼叫 win_do_cmd和中介軟體等序列圖。Table 5 2 則 顯示了各步驟的說明。

Table 5-2 Figure 5-1 的各步驟說明

步驟 描述

call win_do_cmd 應用程式包裝好 win_cmd 資料結構後,呼叫 win_do_cmd,並且將 win_cmd 當作參數傳入。

pack cmd win_do_cmd 先將 win_cmd 資料結構中關於命令和參數的 欄位封裝成一個命令訊息封包。

send cmd packet 將前一個步驟所產生的命令訊息封包傳送給中介軟體。

queue command 中介軟體將訊息封包放入命令佇列中。

do system code 執行命令佇列裡的應用程式所請求的命令訊息,這時會呼 到到系統函式。

system call return 系統函式執行成功後回傳。

send response packet 中介軟體將執行結果包成封包後傳回給 win_do_cmd fill result into

cmd.value

win_do_cmd 函式將執行結果放入 win_cmd 資料結構的 value 欄位。

return 返回呼叫。