回答
夥計,這是一個非常廣泛的問題。
如果你確實想要承受這一點,我推薦書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和操作系統的絕佳書籍,如果這是浮在你的船上。
試試看: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如果你需要它。
爲了回答這個問題,理解用戶模式和內核模式之間的區別很重要。內核模式是最有特權的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,從而防止它們自己直接調用內核服務。
- 1. 如何使用python與命令行程序進行通信?
- 2. 強制保存和使用命令行(Windows操作系統)
- 3. Python操作系統命令
- 4. 通過操作系統執行程序
- 5. 運行操作系統命令的JSP
- 6. 在Windows操作系統中使用命令行查找與文件(.pdf)相關的默認程序的命令
- 7. Windows操作系統環境下C++應用程序與Java應用程序之間的進程間通信
- 8. 如何與操作系統Windows
- 9. 跨Windows操作系統命令行提示的路徑
- 10. 進程和線程在操作系統
- 11. 通過Windows命令行操作GUI
- 12. 用於與Windows命名管道進行通信的程序
- 13. 進程間通信,操作系統,管道
- 14. 語言/操作系統之間的進程間通信
- 15. 操作系統注入和操作系統命令注入的區別
- 16. 如何從操作系統的命令行獲取MATLAB的prefdir?
- 17. 如何使用Java運行操作系統命令
- 18. 如何使用命令行找到操作系統標籤
- 19. Java線程和操作系統線程之間的通信
- 20. 使用Java與Windows操作系統進行交互
- 21. Android:如何與Windows桌面應用程序進行通信?
- 22. 如何從Asp.net應用程序與Windows服務進行通信
- 23. 運行命令依賴於操作系統和IF服務
- 24. 用於與iOS和Android設備進行通信的服務器的Mac或Windows操作系統
- 25. 操作系統路徑插入命令
- 26. 可信1.5小程序是否可以執行系統命令?
- 27. 如何通過命令行查找設備的Android操作系統版本?
- 28. Windows和系統進程
- 29. 如何在python程序中處理操作系統信號?
- 30. Chrome擴展如何與系統進程通信?