应用层(R3)和内核层(R0)是如何通讯的;
R3在调用一个函数的时候究竟发生了那些事情?
比如说在R3调用一个creatFile()函数时,发生了那些事情.
下(qing)回(kan)分(xia)解(tu)
CreateFile()这个函数是R3的API,API通过系统中的kernel.dll或者user32.dll导出,然后进一步向下调用ntdll.dll中的native函数,就是NativeAPI,ntdll.dll文件中封装了大量的NativeAPI,简而言之就是R3API调用CreateFile()这个API时,就会在ntdll.dll中进一步调用zwCreateFile()或者ntCreatFile().然后开始进入内核层.
R3通过sysenter、syscall、INTRE的方式就冲应用层进入了R0.在Win Xp以前版本用的是INTRE这种软中断,在Xp以后用过SysEnter、SysCall进入R3.SysCall是在x64上使用.
进入R0之后就会调用ntoskrnl.exe中SSDT表(System Services Descriptor Table)中的ssdt函数,然后IoManage会将每一次的Io请求封装成一个IRP包.IRP包中封装了R3传下来的命令和数据,封装完成后,会以IRP的形式继续向下传递,到达NTFS.sys(文件系统驱动)和disk.sys(磁盘驱动).然后到达传给硬件抽象层,由硬件抽象层负责调用硬件驱动完成相关的IO操作.
图中蓝色部分就是系统的内核.ntoskrnl.exe文件的形式可能有多种 :
同一套源代码根据编译选项的不同而编译出4个可执行文件
ntoskml - 单处理器, 不支持PAE(物理地址扩展)
ntkrnlpa - 单处理器 支持PAE
ntkrnlmp - 多处理器,不支持PAE
ntkrnpamp - 多处理器,支持PAE