應(yīng)用層(R3)和內(nèi)核層(R0)是如何通訊的;
R3在調(diào)用一個函數(shù)的時候究竟發(fā)生了那些事情?
比如說在R3調(diào)用一個creatFile()函數(shù)時,發(fā)生了那些事情.
下(qing)回(kan)分(xia)解(tu)
CreateFile()這個函數(shù)是R3的API,API通過系統(tǒng)中的kernel.dll或者user32.dll導(dǎo)出,然后進一步向下調(diào)用ntdll.dll中的native函數(shù),就是NativeAPI,ntdll.dll文件中封裝了大量的NativeAPI,簡而言之就是R3API調(diào)用CreateFile()這個API時,就會在ntdll.dll中進一步調(diào)用zwCreateFile()或者ntCreatFile().然后開始進入內(nèi)核層.
R3通過sysenter似芝、syscall酪耳、INTRE的方式就沖應(yīng)用層進入了R0.在Win Xp以前版本用的是INTRE這種軟中斷,在Xp以后用過SysEnter、SysCall進入R3.SysCall是在x64上使用.
進入R0之后就會調(diào)用ntoskrnl.exe中SSDT表(System Services Descriptor Table)中的ssdt函數(shù),然后IoManage會將每一次的Io請求封裝成一個IRP包.IRP包中封裝了R3傳下來的命令和數(shù)據(jù),封裝完成后,會以IRP的形式繼續(xù)向下傳遞,到達NTFS.sys(文件系統(tǒng)驅(qū)動)和disk.sys(磁盤驅(qū)動).然后到達傳給硬件抽象層,由硬件抽象層負責調(diào)用硬件驅(qū)動完成相關(guān)的IO操作.
圖中藍色部分就是系統(tǒng)的內(nèi)核.ntoskrnl.exe文件的形式可能有多種 :
同一套源代碼根據(jù)編譯選項的不同而編譯出4個可執(zhí)行文件
ntoskml - 單處理器, 不支持PAE(物理地址擴展)
ntkrnlpa - 單處理器 支持PAE
ntkrnlmp - 多處理器,不支持PAE
ntkrnpamp - 多處理器,支持PAE