所有系统调用都需要Windows上的SSDT?

时间:2014-10-19 19:49:00

标签: c++ windows assembly operating-system

我尝试学习Windows操作系统的内部。 是SSDT定义为"所有系统调用地址列表" ? SSDT还有中断处理机制,可以捕获硬件事件吗? 谢谢你的回答。

1 个答案:

答案 0 :(得分:2)

不,SSDT不是操作系统捕获硬件事件的方式。如果我们从硬件开始,例如用于网络适配器的PCI卡,它将有一个类型中断的信号,通过PCI接口进入中断控制器。在PC中,这将是“APIC”(高级可编程中断控制器),其又连接到处理器核心本身。其他硬件以类似的方式工作,因此我将使用API​​C作为下面的示例。

当操作系统初始化APIC时,它会给每个硬件中断一个“向量”,进入中断向量表 - 每个中断向量条目将包含一个地址,当该中断激活时,处理器跳转到该地址。在x86中,中断向量表称为“中断描述符表”,因为向量不仅仅是一个跳转到的简单地址 - 它还包含一些关于如何处理中断的额外信息等等。

因此,当我们的网络适配器收到一个数据包时,它将“拉”中断信号激活。然后处理器将检测到中断,当它发生时,中断控制器将使用向量。处理器查找向量,保存当前状态,并跳转到向量中的地址。

在向量内部,操作系统将执行一些“管理”工作,然后查找哪个设备驱动程序要求通知此中断,因此操作系统找到我们的网络适配器驱动程序,并调用它的中断处理例程。中断处理代码检查网络适配器的状态,发现它是一个“新数据包到达”类型的中断,从缓冲区读出数据并可能更新一些信号量或类似信号,以便某些驱动程序函数可以开始执行“我们收到了一个新的数据包”代码。完成后,中断处理程序返回操作系统。

从中断处理代码返回时,操作系统将检查是否有“新进程被唤醒”,因此等待数据包的进程现在将“可运行”,并且此时可能会切换进程,或者只是标记它是“未来的运行”。

SSDT用于应用程序调用时,例如CreateFileReadFileWriteFileCloseHandle以及任何其他系统调用(非常多)他们)。基本上,SSDT中有NtCreateFile的条目,NtReadFile的另一个条目等等 - 请注意NtCreateFileCreateFile不完全相同 - 它是部分这发生在OS内核中。