回答
伙计,这是一个非常广泛的问题。
如果你确实想要承受这一点,我推荐书Windows Internals By Mark Russinovich et ag。另一本好书是经典的Operating Systems by Deitel et al。
开始然而,随着Inside Windows NT by Helen Custer(版1) - 这是一个非常基本的书(注意,最后一个环节有coverof版2的PIC - 这是方式方法更为详细的)。
好吧,简而言之。
Windows组件之间有多种通信协议。他们中的大多数会在一天结束时通过一些共享内存(如缓冲区,堆栈等)使用传递数据。但协议可能会涉及很多,并且对于不同的通信而言是不同的。
我给你的建议是在上面的书中找到一些东西,并确定Windows操作系统的体系结构是如何挂在一起的。从这里你将看到各种组件如何通信。
(应用书呆子的脸) - 相信我这些都是学习Windows和操作系统的绝佳书籍,如果这是浮在你的船上。
试试看:Chapter 5 - Windows NT 4.0 Workstation Architecture。它应该足以开始。
最后一些API直接建立在一些用户级的DLL中。这些都是直接执行的。其他需要内核模式帮助/服务。
对于这些(一个我从上面的链接引用)
该应用程序使用的API,使图形调用用户模式 动态链接库。实现该调用的组件对执行程序调用 内核模式陷阱调用来切换其线程,并将 其调用参数从其用户模式堆栈复制到其内核模式堆栈。 然后,处理器的堆栈寄存器被切换为指向内核 模式。现在线程可以在Executive中运行。
应用程序通过使用本地 过程调用(LPC)与受保护的子系统进行通信,该过程调用是同一台计算机上组件之间的应用程序无关方法 。在 线程切换到内核模式后,微内核安排LPC 进行传送。
使用Fast LPC(一种优化的通信方法),Microkernel 认识到来自应用程序的调用涉及 环境子系统中的线程。它认为调用应用程序线程和 接收子系统线程要配对。接收线程 现在可以使用发送线程的未过期时间。
图形调用参数被传递给接收子系统 线程。接收线程切换回用户模式,以完成图形请求 。
该子系统完成其任务,然后通过相同的方法将控制返回到应用程序中的等待调用线程的 。
将控制返回给应用程序之前,调用线程(从DLL)切换回用户模式。
微软操作系统工程师也使用共享内存窗口的概念来加速通信。数据放置在 执行程序中由进程管理器管理的临时 共享内存窗口中。这让应用程序可以看到子系统的内存 并共享数据而不使用LPC。但是,因为应用程序 线程仍然必须在执行体中运行,所以内核/用户模式转换为 ,并且仍然需要线程切换。
在这里有上exactly
是如何完成的调用(是做什么用的ASM命令)的一些注意事项:The system call dispatcher on x86如果你需要它。
为了回答这个问题,理解用户模式和内核模式之间的区别很重要。内核模式是最有特权的CPU模式,执行代码可以完全访问硬件。它用于最底层的操作系统功能。用户模式是一个更受限制的CPU模式。它防止代码直接访问硬件。应用程序以用户模式运行。当然,他们仍然需要以某种方式访问硬件,因此他们需要调用内核。
这就是你的问题导致的地方。为了允许用户模式代码调用内核,Windows内核设置了一个入口点。在基于x86的系统上,此入口点是软件中断(int 2e)或sysenter/syscall指令。执行这些指令会导致CPU模式切换,将CPU从用户模式切换到内核模式。一旦CPU切换模式,它就会调用内核指定的函数。在Windows中,此功能是系统服务调度程序。
系统服务调度程序负责调用用户模式代码需要的内核服务。它采用由用户模式代码指定的函数编号,并在系统服务描述符表(SSDT)中查找它。 SSDT基本上是每个内核服务的函数指针列表。一旦识别出正确的内核服务,它就会用用户模式应用程序也指定的参数来调用它。内核服务完成后,CPU通过iret指令(如果来自软件中断)或sysexit/sysret(如果来自sysenter/syscall)返回到应用程序。
所有这些听起来都很复杂,而且这就是为什么Windows从程序员那里隐藏这些细节的原因。内核不需要直接与内核进行通信,Windows为程序员提供了几个DLL,这些DLL可以为他们做到这一点。
现在,它再次变得稍微复杂一些。从用户模式调用内核服务的过程在ntdll.dll中实现,但大多数程序员不直接使用ntdll.dll。相反,它会导出一组通用的内核服务,称为Native API。在此之上,Win32 API在kernel32.dll中实现。 kernel32.dll中的大部分函数只是ntdll.dll中函数的包装器。
你可能会问为什么这样做。为什么不直接让kernel32.dll直接调用内核函数呢?原因是为了允许不同的多用户模式API。 Windows NT旨在支持多种API,不仅包括Win32,还包括POSIX和OS/2。每个用户模式API调用ntdll.dll来实现它们自己的API,从而防止它们自己直接调用内核服务。
- 1. 如何使用python与命令行程序进行通信?
- 2. 强制保存和使用命令行(Windows操作系统)
- 3. Python操作系统命令
- 4. 通过操作系统执行程序
- 5. 运行操作系统命令的JSP
- 6. 在Windows操作系统中使用命令行查找与文件(.pdf)相关的默认程序的命令
- 7. Windows操作系统环境下C++应用程序与Java应用程序之间的进程间通信
- 8. 如何与操作系统Windows
- 9. 跨Windows操作系统命令行提示的路径
- 10. 进程和线程在操作系统
- 11. 通过Windows命令行操作GUI
- 12. 用于与Windows命名管道进行通信的程序
- 13. 进程间通信,操作系统,管道
- 14. 语言/操作系统之间的进程间通信
- 15. 操作系统注入和操作系统命令注入的区别
- 16. 如何从操作系统的命令行获取MATLAB的prefdir?
- 17. 如何使用Java运行操作系统命令
- 18. 如何使用命令行找到操作系统标签
- 19. Java线程和操作系统线程之间的通信
- 20. 使用Java与Windows操作系统进行交互
- 21. Android:如何与Windows桌面应用程序进行通信?
- 22. 如何从Asp.net应用程序与Windows服务进行通信
- 23. 运行命令依赖于操作系统和IF服务
- 24. 用于与iOS和Android设备进行通信的服务器的Mac或Windows操作系统
- 25. 操作系统路径插入命令
- 26. 可信1.5小程序是否可以执行系统命令?
- 27. 如何通过命令行查找设备的Android操作系统版本?
- 28. Windows和系统进程
- 29. 如何在python程序中处理操作系统信号?
- 30. Chrome扩展如何与系统进程通信?