我正在学习如何编写内核模式代码。我一直认为,在这种运作模式下,系统稳定性是脆弱的。我在寻找一个低层次的解释为什么会这样。
我知道在内核模式下运行的代码肯定会导致一些问题:
- 内核模式代码可以写入任何内存地址,这可能包括损坏用户模式进程使用的内存
- 甚至修改内核执行关键任务所依赖的内存。
- 可以直接与硬件通信(这只是内存访问的另一个特性)
但是这些事情似乎可以通过简单地分配一个安全的内存空间来避免,并且通常不写任何分配给另一个进程的内存,除非该进程专门设计为共享该内存。
我将引用我刚刚在Windows文档中读到的内容:
重要的驱动程序不应该"在旁边"分配内存。并将其用作内核模式堆栈。这从来没有被推荐过练习任何平台,因为它影响稳定性和操作系统的可靠性。在基于x64的系统上,如果操作系统检测到未经授权的内核模式堆栈,它将生成错误检查并关闭系统。-使用内核模式堆栈的指南
为什么会这样?
驱动程序不能简单地分配一些未使用的内存,系统的其余部分将知道不使用?
在内核(堆上)分配内存是常见的做法,有很多函数可以做到这一点。
如果需要使用大容量的数据,建议在正确的池中分配内存,而不是在堆栈上使用变量。