linux内核 和nt内核,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)

{

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值