WINCE6.0系统调用
********************************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內就可以直接轉換字符串的大小,然后返回并且結束此次系統調用。
總結
以上是生活随笔為你收集整理的WINCE6.0系统调用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Real6410的NBL1.LSB和NB
- 下一篇: VS2005新建应用工程出错解决方法