********************************LoongEmbedded********************************
作者:LoongEmbedded(kandi)
時間:2012.04.12
類別:WINCE系統開發
********************************LoongEmbedded********************************
WINCE系統的調用處理流程如所示:
圖1
1.coredll.dll的功能
WINCE系統的應用程式不能直接與WINCE作業系統或硬體打交道,在應用程式訪問WINCE提供的服務的時候,就是先通過coredll.dll來進行的。
coredll的主要功能是負責應用程式與WINCE的通訊以及完成WINCE的系統調用,它同時出現在使用者模式和核心模式中(分別為coredll.dll和kcoredll.dll),coredll提供核心OS服務,使應用程式能訪問WINCE6.0之下的計算資源,如檔案系統、記憶體、裝置、進程和線程等。應用程式也通過這些服務管理和監視其所要完成任務所需要的資源,通過它,應用程式之間還可以共用程式碼和其他資料資訊。
2.kernel.dll
WINCE6.0作業系統內(kernel)在代碼中的表現形式是kernel.dll(也就是kern.dll), WINCE5.0中核心的表現形式為NK.exe,而WINCE6.0中的NK.exe中僅僅包含一些OAL代碼和保持相容性的程式了。
核心提供任何WINCE6.0裝置的基本OS功能,這些準系統包括進程、線程和記憶體管理,另外核心也提供一些檔案管理功能、線程調度、即時效能、裝載器(loader)、系統調用、電源管理和OS提供的多種多樣的服務。核心服務(service)使應用程式可以使用這些核心(core)功能。
3.nk.exe
NK.exe(就是oal.exe)是OAL層的進程,在OAL層啟動的過程中載入kernel.dll,OAL是一個位於WINCE核心(kernel.dll)和目標硬體平台之間的代碼層,它便於OS和目標裝置的通訊,而且包含了中斷、定時器和一般IO控制碼(IOCTLs)等的處理。
4.系統調用處理過程
系統調用是作業系統嚮應用程式提供的服務,一般以函數的形式提供(系統API函數),也就是說,當應用程式調用系統提供的API函數時,這就發生一次系統調用。
系統調用是一個屬於另一個進程的功能,當發生系統調用的時候,coredll會通知kernel,然後kernel調用恰當的服務進程來處理此系統調用。每次系統調用會產生一個能夠被kernel捕獲到的異常:
⑴當一個進程產生一個系統調用,它直接調用coredll.dll中的一個封裝(wrappper)函數(每次不同的系統調用對應調用不同的封裝函數),這個封裝函數為核心準備好函數的參數,接著產生一個軟體異常,此異常可以是一個未定義地址異常或是一個CPU trap,這時,核心捕獲到此軟體異常後,CPU的執行權由應用程式轉為kernel了。
⑵kernel接著處理此異常並且確定正確的目標進程來發送此函數調用請求給哪個exe檔案,或是kernel本身就能拿實現這個函數調用請求。實現此函數的目標進程使用與調用進程最初的線程中相同的進程堆和註冊表值來執行此函數。因為此函數調用存在於另一個進程,所以目標進程必須能夠被證實存在於系統中,這樣才能確保成功執行這次系統調用。
⑶在系統調用的時候,相同使用者模式的線程運行在各自的優先順序中,並且能夠從調用進程遷移到實現此系統調用的進程中和從中返回。當一個線程遷移到另一個進程,它的存取權限被改變來匹配當前在啟動並執行進程的存取權限。
4.1跨越kandi.exe、kernel.dll和gwes.dll的系統調用
圖2
比如應用程式kandi.exe調用CreateWindow()的來建立一個視窗,就轉化為調用coredll.dll中對應的封裝函數CreateWindowExW(),然後coredll.dll產生一個軟體異常,接著kernel.dll處理這個異常,並且kernel.dll會根據當前的函數調用請求來選擇合適的進程來處理,這裡CreateWindowExw()函數是在gwes.dll中實現的,所以kernel.dll就載入gwes.dll來執行此函數調用,這樣gwes.dll就開始建立視窗,當視窗建立結束後依次返回,這樣此次系統調用就結束了。
4.2跨越kandi.exe和coredll.dll的系統調用
圖3
應用程式kandi.exe調用CreateProcess()函數來建立一個進程,就轉化為調用coredll.dll中對應的封裝函數xxx_CreateProcessW(),然後coredll.dll產生一個軟體異常,接著kernel.dll處理這個異常,但因為xxx_CreateProcessW函數是在kernel.dll中實現,所以無須切換到其他服務進程中,只在kernel.dll中就可以完成進程的建立,然後返回並且結束此次系統調用。
4.3僅限kandi.exe中就可實現的系統調用
圖4
應用程式kandi.exe調用CharLowerBuff()函數來轉換字串的大小,就轉化為調用coredll.dll中對應的封裝函數xxx_CreateProcessW(),但因為CharLowerBuffW函數是在coredll.dll中實現的,所以coredll.dll就不會產生軟體異常,也無須進行服務進程的切換,而是在coredll.dll內就可以直接轉換字串的大小,然後返回並且結束此次系統調用。