当编译为目标代码然后将目标文件链接在一起时,静态或其他方式,它们被放置在[VAD][1]
中,至少我知道这可以追溯到21世纪后期的现代Windows操作系统。我的猜测是,这是我的头脑,但我假设一个动态链接的内核库放在一个带有主可执行文件的TBL分页虚拟地址空间中,如果存在动态链接库,如C&#39 ; s标准,它们与主可执行文件链接在一起,但静态,如[SDL][2]
,则不是。那么可执行文件如何通过链接内核库访问受保护的内存,如驱动程序等?
希望我的问题不会太混乱。
基本上,在最短的问题中,我想问的是:
编译/链接的可执行文件和附带的库/ API如何实际访问OS API,内核API或运行时硬件操作所需的系统软件或与之交互?
答案 0 :(得分:0)
我只会说windows =) 首先,线程有上下文,其中包括两个堆栈 - 内核模式堆栈和用户模式堆栈。 CPU有命令 - SYSENTER。这些指令使用描述内核模式入口点的MSR寄存器IA32_SYSENTER_ *。调用时,它们将当前级别切换为ring 0,将堆栈切换到内核模式堆栈并调用km入口点。在Windows上,此入口点称为KiFastCallEntry。基本上这些函数调用KiSystemService(),它将UM上下文保存到堆栈(KTRAP),复制参数并调用适当的系统服务(usermode将索引提供到系统服务描述符表中)。之后,KiSystemService从KTRAP设置usermode上下文并调用sysexit,将当前权限级别切换为3,将堆栈切换到usermode并将控制权转移给调用者(基本上这是ntdll存根)。与旧的xp和2000(它们使用来自IDT的int 2e陷阱)和AMD在x64上存在一些差异。
这不是非常珍贵的描述(例如,有几个服务描述符表等)。您可以阅读“Windows Inside”或类似http://shift32.wordpress.com/2011/10/14/inside-kisystemservice/和http://wiki.osdev.org/SYSENTER#Compatability_across_Intel_and_AMD
的内容