Kernel Mode 简介
为了使用实时机制,需要使用内核模式。
我们开发 Kithara RealTime Suite 的第一个重要尝试就是内核编程。这需要在应用程序内定义所需的代码。因此,一般的开发环境即可开发内核层代码,并且不需要创建内核驱动程序。
通常,应用程序的响应时间是对抗性的,因为即使在非常高的确定优先级下,它也不能保证的响应时间(典型的变化在几十微秒,但在某些情况下可能是几毫秒)。唯一的解决方案是在内核级别上执行代码序列,以通过高优先级获得更短的延迟。
在应用程序级别进行开发工作量较小,但在内核级别执行而导致适当的实时性并不容易实现。这个问题源于应用程序代码和系统代码(操作系统和内核驱动程序)之间的区别,即所谓的“内存区域”:为了为每个(32位)应用程序提供4 GB的线性地址空间和2 GB的连续逻辑空间,使用了i386处理器及其后续处理器的分页机制,该机制将逻辑地址转换为物理地址。这个机制被称为分页。
进程切换后不同的地址是有效的
如果操作系统根据其多任务特性激活另一个进程,则应用程序特定的地址空间也将发生切换。到目前为止活动进程的代码地址将无效,直到其自己的地址切换将被使用。
以下表格显示了内存区域:
32-bit-Windows系统变量
区域 | 含义 |
---|---|
00000000h … 7FFFFFFFh | 在进程变换时,“进程地址空间”(应用程序)会发生变化 |
80000000h … FFFFFFFFh | 在内核中,静态的地址不会改变 |
64-bit-Windows系统变量
区域 | 含义 |
---|---|
00000000 00000000h … 00007FFF FFFFFFFFh | 在进程变换时,应用程序的地址空间会发生变化 |
FFFF8000 00000000h … FFFFFFFF FFFFFFFFh | 内核中的地址是静态的,不会在进程切换时改变 |
可能的解决方案
开发环境的编译器以这种方式创建代码,使其加载到为应用程序程序提供的较低的2-GByte区域中。为了在内核级别上执行代码,必须将代码重新定位到系统地址范围内。因此,存在不同的解决方案:
- 将 DLL(动态链接库)一次性加载到系统地址空间中(DLL 的重定位)。
- 对回调函数进行完整的“command-for-command”分析,并在地址空间中生成具有相同语义的副本(函数的重定位,仅适用于 32 位 Windows 操作系统)。
注意:“DLL 的重定位”是推荐的解决方案!
这两种可能性都提供在内核模式中,但函数的重定位仅适用于 32 位 Windows 操作系统,并且不会进一步开发!
我们建议对于所有新的开发项目,以及对于更复杂的开发项目,使用DLL 的重定位机制。