我想弄清楚系统调用是如何在内核上执行的,是否有很好的解释当遇到“系统调用”指令时内核究竟发生了什么。有哪些查看方式那些内核模式回调和可能记录一些未记录的函数。
基本上我在问什么
mov eax, 23h ; NtQueryVirtualMemory
syscall ; Any way to view what OS does, how it fills registers, sets return value etc. after executing this instruction
谢谢。
答案 0 :(得分:2)
查看操作系统如何处理 Windows 系统调用
了解 Windows 如何处理系统调用(以及它们应该如何由几乎所有现代操作系统处理)的最重要的事情是它们是抽象的(例如通过库 - DLL 或共享库);这样:
a) 机制是否改变并不重要 - 例如如果内核和库在内部使用 syscall
指令或 sysenter
指令,或者调用门或软件中断或其他东西;或者在不同的计算机上使用不同的机制(由于不同的 CPU 支持不同的功能)。请注意,目前 Intel 和 AMD 都对未来的“Supervisor Entry”扩展提出了建议,因此可以合理地预期(在未来的某个时候)syscall
指令将过时且不再使用。
b) 内核是否更改无关紧要。例如。如果较旧的内核具有特定功能,但内核设计者想用具有不同参数的更新/更好的功能替换它,那么他们可以这样做,并且新库(用于新内核)可以模拟旧功能,以便所有更新内核(和库)时,旧软件不会损坏。
c) 某些东西是否是内核系统调用变得无关紧要。一个很好的例子是在 80x86 上获取当前时间的函数 - 如果硬件/CPU 很旧并且不支持“单调时间戳计数器”功能,那么像 QueryPerformanceCounter()
这样的东西涉及系统调用,但在较新的硬件它可以完全由库在用户空间中完成(完全避免系统调用的开销),而是依靠 rdtsc
指令。
出于这些原因; Microsoft 考虑不记录内核的 API/系统调用(针对其内核的任何特定版本),以试图防止人们创建可能/将会破坏的狡猾软件。
对于汇编语言程序员(尤其是那些来自 MS-DOS 的程序员)这很烦人(因为在 DLL 中调用函数更复杂);但是这个问题没有很好的解决方案。
<块引用>有什么方法可以查看操作系统在执行此指令后做了什么,如何填充寄存器,设置返回值等?
您可以在支持调试的虚拟机中运行操作系统,并检查它一次执行一条指令的内容。但这不会有太大帮助(这会造成混乱,不同版本的内核可能会有所不同)。