倪勋的专栏

智慧和勇气,人生的两个财富

用户操作
[即时聊天] [发私信] [加为好友]
倪勋ID:nixun
17018次访问,排名7320(-1),好友0人,关注者0人。
nixun的文章
原创 13 篇
翻译 0 篇
转载 6 篇
评论 6 篇
nixun的公告
最近评论
crunch:Sorry, ExMinimumLookasideDepth 确实为4
crunch:但这个深度从不低于4,这也是新链表的初始深度。
这个说法在Win2003的源代码中看到的不一致.
Lookaside->L.Depth = ExMinimumLookasideDepth;
Lookaside->L.MaximumDepth = 256; //Depth;

DriverUnload只是在DriverEntry返回……
woaipinkfloyd:怎么没有提供答案
想学习学习
maleo:不错的说!!!!
最快的排序?
好像有o(n)的吧
radix sort
siso:请问目前哪种排序速度最快,是否快速排序?
文章分类
收藏
    相册
    个人blog链接
    Jerry
    johnny
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes
    2007年11月27日

    转载 管理PnP状态转换

    正如本章开头提到的,WDM需要跟踪设备的状态转换。状态跟踪还涉及到如何排队和取消IRP。而取消操作需要用到一个全局取消自旋锁,但该锁在多处理器机器上会造成性能瓶颈。IRP处理的标准模型不能解决所有这些问题。因此,在这一节中,我将介绍一种新的对象类型,DEVQUEUE,你可以在PnP请求处理中使用这种对象,它可以代替标准模型中的StartPacket和StartNextPacket例程。DEVQUEUE是我自己的创造,使用它的例子驱动程序有PNPPOWER和CANCEL。关于IRP取消的其它讨论见Ervin Peretz的文章“The Windows Driver Model Simplifies Management of Device Driver I/O Requests” (Microsoft Systems Journal, January 1999)。我描述的一部分IRP取消逻辑还来自Peretz和其它Microsoft雇员的工作。阅读全文>

    发表于 @ 2007年11月27日 21:38:00|评论(loading...)|编辑

    转载 IRP

    有两个数据结构对I/O请求的处理至关重要:I/O请求包(IRP)本身和IO_STACK_LOCATION结构。下面我将详细描述这两个结构。阅读全文>

    发表于 @ 2007年11月27日 21:37:00|评论(loading...)|编辑

    转载 自旋锁

    IRQL概念仅能解决单CPU上的同步问题,在多处理器平台上,它不能保证你的代码不被运行在其它处理器上的代码所干扰。一个称为自旋锁(spin lock)的原始对象可以解决这个问题。为了获得一个自旋锁,在某CPU上运行的代码需先执行一个原子操作,该操作测试并设置(test-and-set)某个内存变量,由于它是原子操作,所以在该操作完成之前其它CPU不可能访问这个内存变量。如果测试结果表明锁已经空闲,则程序获得这个自旋锁并继续执行。如果测试结果表明锁仍被占用,程序将在一个小的循环内重复这个“测试并设置(test-and-set)”操作,即开始“自旋”。最后,锁的所有者通过重置该变量释放这个自旋锁,于是,某个等待的test-and-set操作向其调用者报告锁已释放。 关于自旋锁有两个明显的事实。第一,如果一个已经拥有某个自旋锁的CPU想第二次获得这个自旋锁,则该CPU将死锁(deadlock)。自旋锁没有与其关联的“使用计数器”或“所有者标识”;锁或者被占用或者空闲。如果你在锁被占用时获取它,你将等待到该锁被释放。如果碰巧你的CPU已经拥有了该锁,那么用于释放锁的代码将得不到运行,因为阅读全文>

    发表于 @ 2007年11月27日 21:35:00|评论(loading...)|编辑

    转载 中断请求级

    Windows NT为每个硬件中断和少数软件事件赋予了一个优先级,即中断请求级(interrupt request level - IRQL)。IRQL为单CPU上的活动提供了同步方法,它基于下面规则: 一旦某CPU执行在高于PASSIVE_LEVEL的IRQL上时,该CPU上的活动仅能被拥有更高IRQL的活动抢先。 图4-1显示了x86平台上的IRQL值范围。(通常,这个IRQL数值要取决于你所面对的平台) 用户模式程序执行在PASSIVE_LEVEL上,可以被任何执行在高于该IRQL上的活动抢先。许多设备驱动程序例程也执行在PASSIVE_LEVEL上。第二章中讨论的DriverEntry和AddDevice例程就属于这类,大部分IRP派遣例程也属于这类。 某些公共驱动程序例程执行在DISPATCH_LEVEL上,而DISPATCH_LEVEL级要比PASSIVE_LEVEL级高。这些公共例程包括StartIo例程,DPC(推迟过程调用)例程,和其它一些例程。这些例程的共同特点是,它们都需要访问设备对象和设备扩展中的某些域,它们都不受派遣例程的干扰或互相干扰。当任阅读全文>

    发表于 @ 2007年11月27日 21:34:00|评论(loading...)|编辑

    转载 内存管理

    这一节我们讨论内存管理。Windows 2000采用多种方式分割虚拟地址空间。一种方式是基于安全性和完整性,有两种地址:用户模式地址和内核模式地址。另一种方式基于处理器的分页能力,有两种内存:分页内存和非分页内存。全部用户模式地址和某些内核模式地址使用分页内存,内存管理器可以在分页内存页帧和磁盘扇区间交换内容,而另一些内核模式地址总是引用物理内存中固定的页帧。由于Windows 2000允许驱动程序的某些部分存在于分页内存中,所以我将阐述如何在编译时和运行时控制驱动程序的分页属性。 Windows 2000提供了多种内存管理方法。我将描述其中的两个基本服务函数,ExAllocatePool和ExFreePool,你可以用它们从堆上分配和释放任意大小的内存块。我还将描述把内存块组织成结构链表的原语。最后,我将描述lookaside(后援式)链表的概念,它可以使你高效率地分配和释放相同大小的内存块。 阅读全文>

    发表于 @ 2007年11月27日 21:32:00|评论(loading...)|编辑

    转载 WDM 驱动错误处理

    人总会犯错误,错误恢复是软件工程的一部分。程序中总会发生异常情况,其中一些源自程序中的Bug,或者在我们的代码中或者在调用我们代码的用户模式应用程序中。另一些涉及到系统装载或硬件的瞬间状态。无论什么原因,代码必须能对不寻常的情况作出恰当的反应。在这一节中,我将描述三种错误处理形式:状态代码、结构化异常处理,和bug check。一般,内核模式支持例程通过返回状态代码来报告意外错误。对于正常情况,它们将返回布尔值或者数值而不是正式的状态代码。结构化异常处理为异常事件发生后的清除工作提供了一个标准化方法,它可以避免因为异常事件而导致系统崩溃,异常事件是指诸如被零除或参考无效指针等的意外错误。Bug check实际上就是致命错误的内部名称,对于这种错误,唯一的解决办法就是重启动系统。阅读全文>

    发表于 @ 2007年11月27日 21:27:00|评论(loading...)|编辑

    2006年01月11日

    原创 Google 面试题讨论

    Google面试题,本文展示了两种解法,同时附上代码阅读全文>

    发表于 @ 2006年01月11日 19:03:00|评论(loading...)|编辑

    Csdn Blog version 3.1a
    Copyright © nixun