2011-09-06 35 views

回答

0

夥計,這是一個非常廣泛的問題。

如果你確實想要承受這一點,我推薦書Windows Internals By Mark Russinovich et ag。另一本好書是經典的Operating Systems by Deitel et al

開始然而,隨着Inside Windows NT by Helen Custer版1) - 這是一個非常基本的書(注意,最後一個環節有coverof版2的PIC - 這是方式方法更爲詳細的)。

好吧,簡而言之。

Windows組件之間有多種通信協議。他們中的大多數會在一天結束時通過一些共享內存(如緩衝區,堆棧等)使用傳遞數據。但協議可能會涉及很多,並且對於不同的通信而言是不同的。

我給你的建議是在上面的書中找到一些東西,並確定Windows操作系統的體系結構是如何掛在一起的。從這裏你將看到各種組件如何通信。

(應用書呆子的臉) - 相信我這些都是學習Windows和操作系統的絕佳書籍,如果這是浮在你的船上。

0

試試看:Chapter 5 - Windows NT 4.0 Workstation Architecture。它應該足以開始。

最後一些API直接建立在一些用戶級的DLL中。這些都是直接執行的。其他需要內核模式幫助/服務。

對於這些(一個我從上面的鏈接引用)

該應用程序使用的API,使圖形調用用戶模式 動態鏈接庫。實現該調用的組件對執行程序調用 內核模式陷阱調用來切換其線程,並將 其調用參數從其用戶模式堆棧複製到其內核模式堆棧。 然後,處理器的堆棧寄存器被切換爲指向內核 模式。現在線程可以在Executive中運行。

應用程序通過使用本地 過程調用(LPC)與受保護的子系統進行通信,該過程調用是同一臺計算機上組件之間的應用程序無關方法 。在 線程切換到內核模式後,微內核安排LPC 進行傳送。

使用Fast LPC(一種優化的通信方法),Microkernel 認識到來自應用程序的調用涉及 環境子系統中的線程。它認爲調用應用程序線程和 接收子系統線程要配對。接收線程 現在可以使用發送線程的未過期時間。

圖形調用參數被傳遞給接收子系統 線程。接收線程切換回用戶模式,以完成圖形請求 。

該子系統完成其任務,然後通過相同的方法將控制返回到應用程序中的等待調用線程的 。

將控制返回給應用程序之前,調用線程(從DLL)切換回用戶模式。

微軟操作系統工程師也使用共享內存窗口的概念來加速通信。數據放置在 執行程序中由進程管理器管理的臨時 共享內存窗口中。這讓應用程序可以看到子系統的內存 並共享數據而不使用LPC。但是,因爲應用程序 線程仍然必須在執行體中運行,所以內核/用戶模式轉換爲 ,並且仍然需要線程切換。

在這裏有上exactly是如何完成的調用(是做什麼用的ASM命令)的一些注意事項:The system call dispatcher on x86如果你需要它。

0

爲了回答這個問題,理解用戶模式和內核模式之間的區別很重要。內核模式是最有特權的CPU模式,執行代碼可以完全訪問硬件。它用於最底層的操作系統功能。用戶模式是一個更受限制的CPU模式。它防止代碼直接訪問硬件。應用程序以用戶模式運行。當然,他們仍然需要以某種方式訪問​​硬件,因此他們需要調用內核。

這就是你的問題導致的地方。爲了允許用戶模式代碼調用內核,Windows內核設置了一個入口點。在基於x86的系統上,此入口點是軟件中斷(int 2e)或sysenter/syscall指令。執行這些指令會導致CPU模式切換,將CPU從用戶模式切換到內核模式。一旦CPU切換模式,它就會調用內核指定的函數。在Windows中,此功能是系統服務調度程序。

系統服務調度程序負責調用用戶模式代碼需要的內核服務。它採用由用戶模式代碼指定的函數編號,並在系統服務描述符表(SSDT)中查找它。 SSDT基本上是每個內核服務的函數指針列表。一旦識別出正確的內核服務,它就會用用戶模式應用程序也指定的參數來調用它。內核服務完成後,CPU通過iret指令(如果來自軟件中斷)或sysexit/sysret(如果來自sysenter/syscall)返回到應用程序。

所有這些聽起來都很複雜,而且這就是爲什麼Windows從程序員那裏隱藏這些細節的原因。內核不需要直接與內核進行通信,Windows爲程序員提供了幾個DLL,這些DLL可以爲他們做到這一點。

現在,它再次變得稍微複雜一些。從用戶模式調用內核服務的過程在ntdll.dll中實現,但大多數程序員不直接使用ntdll.dll。相反,它會導出一組通用的內核服務,稱爲Native API。在此之上,Win32 API在kernel32.dll中實現。 kernel32.dll中的大部分函數只是ntdll.dll中函數的包裝器。

你可能會問爲什麼這樣做。爲什麼不直接讓kernel32.dll直接調用內核函數呢?原因是爲了允許不同的多用戶模式API。 Windows NT旨在支持多種API,不僅包括Win32,還包括POSIX和OS/2。每個用戶模式API調用ntdll.dll來實現它們自己的API,從而防止它們自己直接調用內核服務。

相關問題