0

当编译为目标代码,然后目标文件以静态或其他方式链接在一起时,它们被放置在一个[VAD][1]. 我的猜测是,这是我的想法,但我假设动态链接的内核库与主可执行文件一起放置在 TBL 分页虚拟地址空间中,如果存在动态链接库,如 C 的标准,它们与主要可执行文件链接在一起,但静态的,如[SDL][2],不是。那么可执行文件如何通过链接的内核库访问受保护的内存,如驱动程序等?

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

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

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

4

1 回答 1

0

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

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

于 2013-07-01T06:14:34.277 回答