NT内核代码分析

简介:

某种意义上nt内核用irql解决了一切,这正是由于它有一个基本的,核心的支撑。这就是它的抽象中断框架---IRQL。在linux中,我们知道,如 果我要知道能否调用schedule进行调度,那么我必须知道还有什么数据结构处在临界区,这个时候是否适合抢占,等等,当然内核的数据结构已经做得很好,我们做开发的不用考虑那么多,比如用spin_lock啦,用preempt_disable啦,但是当你读到这些横七竖八的加锁,禁中断,一会又开锁,一会又锁页面...我估计有几种人会疯狂的:1.c语言基础不好的人;2.没有耐心的人;3.在读源码方面没有激情的人;.....剩下的就是 linux内核社区的人了,呵呵

再看看windows的代码,虽然都是反汇编得到的,但是就是不看c代码,直接看汇编吗,也是很容易的。

nt系统的总体框架做得异常威猛,它能不与硬件交互就尽量不与硬件交互,把整个系统抽象到了一个很高的级别,比如,它为每一个cpu都抽象出一个结构体, 记录此cpu的一些信息,比如当前线程,当前进程,切换次数...,这个数据结构连接到此cpu上的所有进程控制块。相比之下,linux就简陋多了,只 是每个cpu一个current宏,还有一系列以cpu为索引的每cpu变量,这些结构没有像nt内核里做得那样:高内聚。

nt内核引入irql完全是为了异步性操作,这就是为什么nt一开始就是为异步而存在,在这点上,异步性是设计理念,而irql是实现方案。中断是一个百 分之百的异步性操作,你预测不到它下一次何时到来(时钟中断除外),所以nt内核将所有的操作都像中断的概念抽象,因为中断的不确定---异步性,那么线程上下文就是个问题了,于是ddk文档中屡次提到“任意上下文”。这就是说,只要你把操作(执行绪)抽象成了中断---拥有了passtive以上的中断 优先级,那么你就不要指望会在特定的上下文里面执行你的操作,这就是完全异步的概念。实际上,nt内核可能受到了unix进程的影响,所以线程上下文大多 数情况在被动中断请求级别运行,它们拥有上下文,而且叫做“进程”,“线程”,系统里面的执行绪,它们比较特殊,而且不那么异步,可以说,一切都为线程服 务,这可能是唯一那么一点不对称的地方吧

nt内核的另一大特性就是对象化,几乎所有的模块都纳入对象化管理范畴,比如io管理器,进程管理器之类的,实际上,irql和对象化是有联系的,前者着重于执行,后者着重于管理,中断本身就是一种对象,我们看看一个dpc对象如何触发一个dpc中断:

代码及注释为引用:

BOOLEAN KeInsertQueueDpc (IN PRKDPC Dpc, IN PVOID SystemArgument1,IN PVOID SystemArgument2)

{


 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1273470


相关文章
|
3月前
|
存储 前端开发 rax
windows逆向 -- 寄存器
windows逆向 -- 寄存器
40 0
|
10月前
|
Linux API 开发工具
Windows NT 驱动程序的编译、安装、调试
Windows 驱动分为两类,一类是从 Windows NT 遗留下来的驱动模型称为传统的 Windows NT 驱动程序模型,另一类是 Windows 添加了电源管理后的 KMDF (WDM)驱动程序。本文这里首先以最简单的 Windows NT 驱动模型为例介绍 Windows 驱动的简单编写、编译、安装及调试。
176 0
|
编译器 Linux 开发工具
调试记录 | Linux 内核静态库封装问题
调试记录 | Linux 内核静态库封装问题
261 0
|
测试技术 开发者 Windows
|
编解码 Linux Go
Linux内核的framebuffer相关的内核代码注释
版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/49259589 由于现在正...
1219 0