`
totoxian
  • 浏览: 1062861 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

ReactOS实现的兼容NT内核分析--KfLowerIrql函数

 
阅读更多

本文代码来自ReactOS-0.3.6。

当硬件中断完成后将要返回的时候,将要调用KfLowerIrql来使当前cpu的irql降低到中断发生前的irql,但是真的就是直接降低到原来优先级就完事了吗?我们看看代码(桩代码,待会分析真正的):

VOID HalpLowerIrql(KIRQL NewIrql)

{

if (NewIrql >= PROFILE_LEVEL)//如果原来的优先级过高,啥也不说,直接恢复irql,然后返回

{

KeGetPcr()->Irql = NewIrql;

return;

}

HalpExecuteIrqs(NewIrql);//这个函数没什么用,可能是原来的实现吧,这个函数处理未决挂起的硬件中断

if (NewIrql >= DISPATCH_LEVEL)//如果原来irql在dispatch之上,那么返回,由此可知上面函数仅仅是个桩

{

KeGetPcr()->Irql = NewIrql;

return;

}

KeGetPcr()->Irql = DISPATCH_LEVEL;//从dispatch开始,因为到此处,原来irql肯定小于dispatch

if (((PKIPCR)KeGetPcr())->HalReserved[HAL_DPC_REQUEST])

{

((PKIPCR)KeGetPcr())->HalReserved[HAL_DPC_REQUEST] = FALSE;

KiDispatchInterrupt();

}

KeGetPcr()->Irql = APC_LEVEL;//往下依次处理irql递减的回调

if (NewIrql == APC_LEVEL)

{

return;

}

if (KeGetCurrentThread() != NULL &&

KeGetCurrentThread()->ApcState.KernelApcPending)

{

KiDeliverApc(KernelMode, NULL, NULL);

}

KeGetPcr()->Irql = PASSIVE_LEVEL;

}

从上面函数可知,并不是直接恢复原来的irql,而是依次按照优先级处理未决的虚拟中断。一不做二不休,姑且看一看那个没有什么用的函数:

VOID HalpExecuteIrqs(KIRQL NewIrql)

{

ULONG IrqLimit, i;

IrqLimit = min(PROFILE_LEVEL - NewIrql, NR_IRQS);

/*

* For each irq if there have been any deferred interrupts then now

* dispatch them.

*/

for (i = 0; i

{

if (HalpPendingInterruptCount[i] > 0)

{

KeGetPcr()->Irql = (KIRQL)IRQ_TO_DIRQL(i);

while (HalpPendingInterruptCount[i] > 0)

{

/*

* For each deferred interrupt execute all the handlers at DIRQL.

*/

HalpPendingInterruptCount[i]--;

//HalpHardwareInt[i]();//不知为什么被注释了,这样不挺好吗?

}

//KeGetPcr()->Irql--;

//HalpEndSystemInterrupt(KeGetPcr()->Irql);

}

}

}

HalpLowerIrql 很重要,整个系统的每个部分都有它的身影,实际上,就是它实现了虚拟中断控制器的重要部分,可畏的是,nt内核竟然实现的如此巧妙,以至于程序员不需要面 对真正的硬件处理而只需要面对irql就可以了,下面我们看看ms在x86下的kflowerirql源代码:

VOID FASTCALL KfLowerIrql (KIRQL NewIrql)

{

KIRQL oldIrql = KeGetCurrentIrql();

if (NewIrql > oldIrql)

{

DPRINT1 ("NewIrql %x CurrentIrql %x/n", NewIrql, oldIrql);

KEBUGCHECK (0);

}

HalpLowerIrql (NewIrql, FALSE);//Kf函数仅仅是Hal的包装函数,实现一些检查,不通过就蓝!

}

VOID HalpLowerIrql(KIRQL NewIrql, BOOLEAN FromHalEndSystemInterrupt)

{

ULONG Flags;

UCHAR DpcRequested;

if (NewIrql >= DISPATCH_LEVEL)

{

KeSetCurrentIrql (NewIrql);

APICWrite(APIC_TPR, IRQL2TPR (NewIrql) & APIC_TPR_PRI);

return;

}

Ke386SaveFlags(Flags);

if (KeGetCurrentIrql() > APC_LEVEL)

{

KeSetCurrentIrql (DISPATCH_LEVEL);

APICWrite(APIC_TPR, IRQL2TPR (DISPATCH_LEVEL) & APIC_TPR_PRI);//虚拟与真实的通信

DpcRequested = __readfsbyte(FIELD_OFFSET(KIPCR, HalReserved[HAL_DPC_REQUEST])); //读取一个位,以检测是否有软件中断发生,这个位是在Request软件中断的函数里面设置的。

if (FromHalEndSystemInterrupt || DpcRequested)

{

__writefsbyte(FIELD_OFFSET(KIPCR, HalReserved[HAL_DPC_REQUEST]), 0);

_enable();

KiDispatchInterrupt();//分发dpc过程,实际上就是一个一个执行。最后再看看有没有需要切换的线程

if (!(Flags & EFLAGS_INTERRUPT_MASK))

{

_disable();

}

}

KeSetCurrentIrql (APC_LEVEL);

}

if (NewIrql == APC_LEVEL)

{

return;

}

if (KeGetCurrentThread () != NULL &&

KeGetCurrentThread ()->ApcState.KernelApcPending)//注意,apc在费任意线程上下文进行,所以apc级别往下就不能什么都揉在一起了,就要按照进程分别对待了。

{

_enable();

KiDeliverApc(KernelMode, NULL, NULL);

if (!(Flags & EFLAGS_INTERRUPT_MASK))

{

_disable();

}

}

KeSetCurrentIrql (PASSIVE_LEVEL);

}

对 比一下两个kflowerirql,都是一级一级 往下跳变,根本不是直接就降到原来的优先级的。软件毕竟不是硬件,可以真正神不知鬼不觉地实现抢占,它只是在用户的角度,在passtive级别的角度来 说是异步抢占的,在高级别他必须显式地执行代码来实现异步抢占,细粒度观察其实还是同步执行的。

分享到:
评论

相关推荐

    Windows内核情景分析-采用开源代码ReactOS(上册(4-4)

    Windows内核情景分析-采用开源代码ReactOS(上册(4-4)(4-4)

    ReactOS-0317-CLT2015-Source

    ReactOS是一个开源操作系统项目,旨在实现与微软Windows操作系统兼容的免费和开放源代码替代品。ReactOS-0317-CLT2015-Source这个压缩包包含了ReactOS在2015年3月17日版本的源代码。这个版本的源代码对于开发者和...

    ReactOS-0.3.3源码

    ReactOS的核心目标是实现与Windows NT家族系统的二进制兼容,这意味着它不仅在用户界面层面上模仿Windows,而且在系统底层也尽量遵循相同的设计原则和实现。通过这种方式,ReactOS能够运行大量为Windows设计的应用...

    ( ReactOS-0.3.13-REL-src(1).zip )

    ReactOS 是一个开源的、免费的操作系统项目,旨在实现与微软Windows NT内核系列操作系统(如Windows 2000, XP, Vista, 7等)的高度兼容。ReactOS-0.3.13-REL-src(1).zip 文件是一个包含ReactOS 0.3.13版本源代码的...

    react-native-nested-scroll-view,Android NestedScrollView的React本机包装.zip

    在React Native开发中,我们经常会遇到需要在一个组件中嵌套多个可滚动视图的情况,这时`react-native-nested-scroll-view`就派上用场了。它是一个针对Android平台的NestedScrollView的React Native封装,旨在解决...

    Windows 内核情景分析--采用开源代码ReactOS (下册) part8

    本书通过分析ReactOS的源代码介绍了Windows内核各个方面的结构、功能、算法与具体实现。全书从“内存管 理”、“进程”、“进程间通信”、“设备驱动”等多个方面进行分析介绍,所有的分析都有ReactOS的源代码 ...

    ReactOS-0.4.13-release-14-g2494cfc-iso.zip

    ReactOS项目致力于为大家开发一个免费而且完全兼容 Microsoft Windows XP 的操作系统。ReactOS 旨在通过使用类似构架和提供完整公共接口实现与 NT 以及 XP 操作系统二进制下的应用程序和驱动设备的完全兼容。 ...

    Windows 内核情景分析--采用开源代码ReactOS (下册) part2

    本书通过分析ReactOS的源代码介绍了Windows内核各个方面的结构、功能、算法与具体实现。全书从“内存管 理”、“进程”、“进程间通信”、“设备驱动”等多个方面进行分析介绍,所有的分析都有ReactOS的源代码 ...

    Windows内核情景分析-采用开源代码ReactOS(上册).part1.rar(4-1)

    Windows内核情景分析-采用开源代码ReactOS(上册).part1.rar(4-1)(4-1)

    Windows 内核情景分析--采用开源代码ReactOS

    ReactOS是一个旨在实现与Microsoft Windows API兼容的操作系统,通过研究其源代码,我们可以更深入地理解Windows内核的工作原理。 一、Windows内核基础 Windows内核是操作系统的核心部分,负责管理系统资源、调度...

    Windows内核情景分析-采用开源代码ReactOS(下册)高清pdf版

    本书《Windows内核情景分析-采用开源代码ReactOS(下册)》是一本深入探讨Windows操作系统内核的专著,作者采用了开源操作系统ReactOS的源代码作为分析材料,对Windows内核的结构、功能、算法和实现进行了详细的解剖...

    Windows 内核情景分析--采用开源代码ReactOS (下册) part10

    本书通过分析ReactOS的源代码介绍了Windows内核各个方面的结构、功能、算法与具体实现。全书从“内存管 理”、“进程”、“进程间通信”、“设备驱动”等多个方面进行分析介绍,所有的分析都有ReactOS的源代码 ...

    Windows 内核情景分析--采用开源代码ReactOS (下册) part3

    本书通过分析ReactOS的源代码介绍了Windows内核各个方面的结构、功能、算法与具体实现。全书从“内存管 理”、“进程”、“进程间通信”、“设备驱动”等多个方面进行分析介绍,所有的分析都有ReactOS的源代码 ...

    Android-react-native-image-crop-picker.zip

    Android-react-native-image-crop-picker.zip,iOS/Android图像选择器,支持相机、视频、可配置压缩、多个图像和裁剪,安卓系统是谷歌在2008年设计和制造的。操作系统主要写在爪哇,C和C 的核心组件。它是在linux内核...

    Windows 内核情景分析--采用开源代码ReactOS (上册) part01

    本书通过分析ReactOS的源代码介绍了Windows内核各个方面的结构、功能、算法与具体实现。全书从“内存管理”、“进程”、“进程间通信”、“设备驱动”等多个方面进行分析介绍,所有的分析都有ReactOS的源代码(以及...

    Windows 内核情景分析--采用开源代码ReactOS (下册) part5

    本书通过分析ReactOS的源代码介绍了Windows内核各个方面的结构、功能、算法与具体实现。全书从“内存管 理”、“进程”、“进程间通信”、“设备驱动”等多个方面进行分析介绍,所有的分析都有ReactOS的源代码 ...

    Android-react-native-swipe-list-view.zip

    Android-react-native-swipe-list-view.zip,一个react本地listview组件,其中的行可以打开和关闭,安卓系统是谷歌在2008年设计和制造的。操作系统主要写在爪哇,C和C 的核心组件。它是在linux内核之上构建的,具有...

    Windows内核情景分析-采用开源代码ReactOS(上册)高清pdf版

    它以ReactOS这个开源的、与Windows API兼容的自由操作系统项目为基础,通过对源代码的分析来阐述Windows内核的结构、功能、算法以及具体的实现方法。ReactOS模仿了Windows操作系统的架构,使得开发者可以通过研究其...

    Windows 内核情景分析--采用开源代码ReactOS (下册) part4

    本书通过分析ReactOS的源代码介绍了Windows内核各个方面的结构、功能、算法与具体实现。全书从“内存管 理”、“进程”、“进程间通信”、“设备驱动”等多个方面进行分析介绍,所有的分析都有ReactOS的源代码 ...

    Windows 内核情景分析--采用开源代码ReactOS (上册) part02

    本书通过分析ReactOS的源代码介绍了Windows内核各个方面的结构、功能、算法与具体实现。全书从“内存管理”、“进程”、“进程间通信”、“设备驱动”等多个方面进行分析介绍,所有的分析都有ReactOS的源代码(以及...

Global site tag (gtag.js) - Google Analytics