我的问题是:
感谢所有帮助......
答案 0 :(得分:3)
在已经陈述的阶段之后还有很多事情要做(加载PE,枚举它依赖的dll,调用它们的入口点并调用exe入口点)。
可能最早的行动是操作系统和处理器合作创建一个新的地址空间基础设施(我认为本质上是一个专用的TLB)。 OS使用进程范围的数据(例如,进程ID和环境变量)初始化Process Environment Block。它使用特定于线程的数据(线程ID,SEH根处理程序等)初始化Thread Environment Block。一旦为每个dll选择了适当的地址并将其加载到那里,就会通过Windows加载器重新寻址导出的函数。 (非常简要 - 在编译时,dll无法知道每个消费者exe将加载它的地址。因此,仅在加载时确定其函数的实际调用地址)。在进程之间共享内存页面的初始化 - 例如,对于Windows消息 - 我认为是磁盘分页结构的一些初始化。还有 PLENTY 更多。涉及的主要Windows组件确实是Windows加载器,但涉及内核和执行程序。 最后,调用exe入口点 - 它默认为BaseProcessStart。
通常,在操作系统级别之后仍会进行大量准备工作,具体取决于使用的框架(规范的是本机代码的CRT和托管的CLR):框架必须初始化自己的内部结构才能提供应用程序的服务 - 内存管理,异常处理,I / O,你的名字。
进行深入讨论的好地方是Windows Internals。您也可以在SO等论坛中深入挖掘,但是 能够将其分解为更集中的位。如上所述,对于SO帖子来说,这实在太多了。
答案 1 :(得分:0)
这是高级别的,错过了很多细节:
DllMain
消息DLL_PROCESS_ATTACH
函数
除了内核本身之外,没有“执行目录”或其他中央控制。但是,有些API允许您枚举和查询当前正在运行的进程,例如EnumProcesses
。
答案 2 :(得分:0)
你的问题不是很清楚,但我会试着解释一下。
打开应用程序时,它会从磁盘加载到RAM中。 操作系统跳转到应用程序的入口点。
操作系统提供显示窗口,连接东西和接收用户输入所需的所有调用。它还管理处理时间,在应用程序之间平均分配。