理解windows核心模式與使用者模式
核心層次架構
windows程式執行分為核心模式和使用者模式,核心模式可以訪問所有的記憶體位址空間, 並且可以訪問所有的cpu指令。一般程式執行在使用者模式, 通過系統呼叫切換到核心模式執行系統功能,windows系統通過這種方式來確保系統的安全和穩定。
下面是核心的層次劃分:
硬體抽象層(hardware abstraction layer) (hal) (hal.dll)
最底層隔離硬體的, 底層的第三方驅動程式就執行在這層。
核心 (kernel)
實現作業系統的一些底層服務,比如執行緒排程, 多處理器的同步,中斷/異常處理等。
執行體 (executive)
實現基本的作業系統服務,比如基本的執行緒程序管理,記憶體管理, io及程序間通訊等。
視窗圖形子系統(windows graphics subsystem)
由win32k.sys在核心層實現, 使用者介面相關都依賴該層, user32.dll的大部分功能都由該層實現。
使用者層關鍵程序
windows系統在使用者層有幾個關鍵的系統程序:
smss.exe (session manager subsystem)
關於session的概念可以參考我的這篇
sessions, window stations and desktops
, 在作業系統啟動時會建立乙個不與任何session關聯的smss.exe管理者例項, 然後當有使用者登入時它會為每個sessin拷貝乙份與之關聯的smss.exe例項,然後由該關聯的smss.exe例項啟動winlogon.exe和csrss.exe.
winlogon.exe
該程序管理使用者的登入和登出, 我們按ctrl+alt+del出現的介面和登入後出現的桌面視窗都是由它啟動的。
csrss.exe ( client/server runtime subsystem)
我們可以看到我們的桌面視窗(getdesktopwindow)是由該程序建立的, 該程序主要負責win32子系統的使用者模式部分(核心模式部分由win32k.sys實現)。
lsass.exe (local security authority subsystem)
winlogon.exe通過該程序驗證使用者登入, 登入後產生安全訪問令牌物件, 通過該令牌建立explorer.exe, 我們其他使用者程序都由
explorer.exe啟動,並且繼承了該令牌許可權。
services.exe
該程序簡稱為scm (nt service control manager), 該程序負責啟動使用者態一些特殊程序, 也就是我們通常所說的服務程式。
使用者模式呼叫核心模式方式
由使用者模式呼叫核心模式一般有2種方式 系統呼叫(system call) 和 ioctl (io control commands)
核心模式呼叫使用者模式方式
可以通過ioctl的上下文傳遞, 也可以通過apc (asynchronous procedure call)直接呼叫。
程序間通訊方式
另外一種非常強大的使用者模式與核心模式通訊方式, 同時也支援程序間通訊, 該方式就是alpc (advanced local procedure call), 該方式被作業系統大量使用, winrt中的broker程序也用到了它 。
該方式實際上就4個核心函式:nt!ntalpcsendwaitreceiveport, nt!ntalpccreateport, nt!ntalpcconnectport, nt!aplcacceptconnectport, 大概原理如下:
總結一下 ,通過上面windows系統中一些關鍵概念的介紹, 加深我們對windows系統的理解, 讓我們對應用開發全域性性的把握。
理解Windows核心模式與使用者模式
核心層次架構 windows程式執行分為核心模式和使用者模式,核心模式可以訪問所有的記憶體位址空間,並且可以訪問所有的cpu指令。一般程式執行在使用者模式,通過系統呼叫切換到核心模式執行系統功能,windows系統通過這種方式來確保系統的安全和穩定。下面是核心的層次劃分 硬體抽象層 hardware...
理解Windows核心模式與使用者模式
核心層次架構 windows程式執行分為核心模式和使用者模式,核心模式可以訪問所有的記憶體位址空間,並且可以訪問所有的cpu指令。一般程式執行在使用者模式,通過系統呼叫切換到核心模式執行系統功能,windows系統通過這種方式來確保系統的安全和穩定。下面是核心的層次劃分 硬體抽象層 hardware...
Linux核心與Windows核心
windows 和 linux 可以說是我們比較常見的兩款作業系統。windows 基本占領了電腦時代的市場,商業上取得了很大成功,但是它並不開源,所以要想接觸原始碼得加入 windows 的開發團隊中。這兩個作業系統各有千秋,不分伯仲。作業系統核心的東西就是核心,這次我們就來看看,linux 核心...