gpt4 book ai didi

c - Windows中的系统调用

转载 作者:行者123 更新时间:2023-11-30 19:50:30 24 4
gpt4 key购买 nike

我一直在阅读和学习有关编程语言如何执行其功能以及它们如何与OS交互等的知识。

我了解了系统调用,Linux中的C标准库以及实际上有多少种编程语言最终使用C与OS交互而不是自己进行交互。由此我得出结论,Linux程序中非常通用的事物工作流程如下:


使用编程语言功能打开文件
编程语言(很多)最终将调用C标准库的等效函数
C库只是系统调用的包装器。它设置了很多东西,然后执行系统调用
系统调用完成实际工作


我的问题与Windows中的流如何发生有关。从许多事情中,我已经看到Windows实际并未记录系统调用,因此,任何人都无法以与Linux相同的方式手动执行它们或编写C库来执行它们。我已经阅读了有关win32api和nativeapi的信息,看来实际上是这些API确实在进行系统调用。

那么用C#编写的程序的工作流程在Windows中将如何?系统调用.NET框架吗?还是在某个时候调用本机API?

最佳答案

Windows Internals本书中的以下内容可供您参考,以了解实际情况。

Microsoft .NET Framework由称为框架类的类库组成
库(FCL)和提供托管代码执行的公共语言运行时(CLR)
具有实时编译,类型验证,垃圾回收等功能的环境
收集和代码访问安全性。通过提供这些功能,CLR提供了一种开发环境,可提高程序员的生产率并减少常见的编程错误。

CLR被实现为经典COM服务器,其代码位于标准用户模式下
Windows DLL。实际上,.NET Framework的所有组件都是作为标准实现的
在非托管Windows API函数上分层的用户模式Windows DLL。 (没有任何一个
.NET Framework以内核模式运行。)

enter image description here

enter image description here

当应用程序调用子系统DLL中的函数时,可能会发生以下三种情况之一:


该功能完全在子系统DLL中的用户模式下实现。换句话说,没有消息发送到环境子系统进程,也没有调用Windows执行系统服务。该功能在用户模式下执行,结果返回给调用方。此类函数的示例包括GetCurrentProcess(始终返回–1,该值在所有与进程相关的函数中均被定义为引用当前进程)和GetCurrentProcessId。 (进程ID对于正在运行的进程不会更改,因此可以从缓存的位置检索该ID,从而避免了调用内核的麻烦。)
该功能需要一个或多个对Windows执行程序的调用。例如,Windows ReadFile和WriteFile函数分别涉及调用基础内部(和未记录)的Windows I / O系统服务NtReadFile和NtWriteFile。
该功能需要在环境子系统过程中完成一些工作。 (
在用户模式下运行的环境子系统进程负责维护
在这种情况下,将通过发送到子系统以执行某些操作的消息向环境子系统发出客户端/服务器请求。然后,子系统DLL等待答复,然后再返回到调用方。


通常,执行对象是由环境子系统代表用户应用程序创建的,或者由操作系统的各种组件创建的,作为其正常操作的一部分。例如,要创建文件,Windows应用程序将调用Windows CreateFileW函数,该函数在Windows子系统DLL Kernelbase.dll中实现。经过一些验证和初始化之后,CreateFileW依次调用本机Windows服务NtCreateFile创建执行文件对象。

关于c - Windows中的系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60220857/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com