【问题标题】:How can user-level executables interact with "protected memory" devices in Kernel?用户级可执行文件如何与内核中的“受保护内存”设备交互?
【发布时间】:2013-06-26 17:03:43
【问题描述】:

当编译为目标代码,然后目标文件以静态或其他方式链接在一起时,它们被放置在[VAD][1] 中,至少我在可追溯到 2000 年代后期的现代 Windows 操作系统上肯定知道这一点。我的猜测是,这是我的想法,但我假设动态链接的内核库与主可执行文件一起放置在 TBL 分页虚拟地址空间中,如果存在动态链接库,如 C 的标准,它们与主可执行文件链接在一起,但不是静态的,如[SDL][2]。那么可执行文件如何通过链接的内核库访问受保护的内存,如驱动程序等?

希望我的问题不会太混乱。

基本上,我想问的最简短的问题是:

编译/链接的可执行文件和随附的库/API 如何实际到达操作系统 API、内核 API 或运行时硬件操作所需的其他系统软件或与之交互?

【问题讨论】:

  • 参见例如stackoverflow.com/questions/499188/… ,大多数传统操作系统和 CPU 以类似的方式工作。
  • 这并没有解释超出它的过程,例如设备驱动程序和调用之间完成的调度。总而言之,它没有给我想要的答案。
  • 那么您可能正在寻找这样一个事实,即 CPU 具有多种操作模式,一种是特权模式(操作系统在其中运行),它可以访问 CPU 和硬件的所有功能一个是非特权的(用户进程在其中运行),并且用户进程有一种简单的方法可以调用在特权模式下运行的代码并在它们之间来回复制数据。或者您在询问现代内核和 CPU 的基本构造以及可能复杂的细节,这是一个非常大的话题。

标签: operating-system kernel


【解决方案1】:

我只能为 windows 说话 =) 首先,线程有上下文,它包括两个堆栈——内核模式堆栈和用户模式堆栈。 CPU 有命令 - SYSENTER。这些指令使用描述内核模式入口点的 MSR 寄存器 IA32_SYSENTER_*。当被调用时,它们将当前级别切换到环 0,将堆栈切换到内核模式堆栈并调用 km 入口点。在 Windows 上,此入口点称为 KiFastCallEntry。基本上这些函数调用 KiSystemService(),它将 UM 上下文保存到堆栈 (KTRAP),复制参数并调用适当的系统服务(用户模式提供系统服务描述符表的索引)。之后 KiSystemService 从 KTRAP 设置用户模式上下文并调用 sysexit,它将当前权限级别切换为 3,将堆栈切换到用户模式并将控制权转移给调用者(基本上这是 ntdll 存根)。旧 xp 和 2000(它们使用 IDT 的 int 2e 陷阱)和 x64 上的 AMD 存在一些差异。

这不是很珍贵的描述(例如,有几个服务描述符表等)。您可以阅读“Windows Inside”或http://shift32.wordpress.com/2011/10/14/inside-kisystemservice/http://wiki.osdev.org/SYSENTER#Compatability_across_Intel_and_AMD 之类的内容

【讨论】:

  • 好的,但是所有这些中的设备驱动程序在哪里?
猜你喜欢
  • 1970-01-01
  • 2013-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-02
  • 2017-02-21
  • 2011-05-02
相关资源
最近更新 更多