查看操作系统如何处理 Windows 系统调用

时间:2021-07-13 16:14:57

标签: windows operating-system kernel system-calls low-level

我想弄清楚系统调用是如何在内核上执行的,是否有很好的解释当遇到“系统调用”指令时内核究竟发生了什么。有哪些查看方式那些内核模式回调和可能记录一些未记录的函数。

基本上我在问什么

mov eax, 23h ; NtQueryVirtualMemory
syscall      ; Any way to view what OS does, how it fills registers, sets return value etc. after executing this instruction

谢谢。

1 个答案:

答案 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 中调用函数更复杂);但是这个问题没有很好的解决方案。

<块引用>

有什么方法可以查看操作系统在执行此指令后做了什么,如何填充寄存器,设置返回值等?

您可以在支持调试的虚拟机中运行操作系统,并检查它一次执行一条指令的内容。但这不会有太大帮助(这会造成混乱,不同版本的内核可能会有所不同)。

相关问题