内核编程的主要调用源

来源:互联网 发布:软件行业例会 编辑:程序博客网 时间:2024/06/05 17:19

内核编程的主要调用源


    调用源并不是一个常用的概念,而是笔者为了读者理解的方便而自己设定的一个概念。首先我们假定函数B调用了函数A,则称函数B为A的调用者。
    那么任意指定一段代码,假设这段代码在函数A中。现在我们寻找A的调用者。假设找到一个调用者B,我们再继续寻找B的调用者。如此递归地寻找下去,直到在代码可见的范围内,最后一个调用者函数M。函数M无法在可见范围内的代码内找到调用者,那么就称函数M为函数A的调用源。换句话说,一段代码的调用源是指,调用的这段代码,编程者所能见到的最初始的源头的那个函数。
    同时,从调用源出发,嵌套地调用一系列函数,最后到调用函数B,函数B调用函数A这是一条“路径”,我们称之为函数A的调用路径。一个函数的调用路径显然可能不止一条。同时,一个函数的调用源也可能不止一个。
    举个例子,用C语言写一个普通的控制台程序,读者肯定知道,这个程序一般都是从主函数main()开始执行的。如果不是有特殊的处理,这种应用程序所有的代码的调用源都是main()函数。也就是说,任意找一段代码,假设这段代码在函数A中。我们从函数A出发,不断递归地寻找调用者(caller)函数,最终找到的根都是main()函数。当然,main()函数也是有调用者的,但是被编译器隐藏,并非编程者可见。
    大部分情况下,单线程的用户态应用程序只有一个调用源,那就是主函数。内核编程的一个显著特点是,任意一个函数往往可能有多个调用源。主要可以追溯到的调用源如下:
    (1)入口函数DriverEntry和卸载函数DriverUnload。
    (2)各种分发函数(包括普通分发函数和快速IO分发函数)。
    (3)处理请求时设置的完成函数。也就是说,该请求完成后会被系统调用的回调函数。
    (4)其他回调函数(如各类NDIS驱动程序的特征函数,NDIS驱动程序见本书的的第11~13章)。
    还可能包括其他的调用源。读者在写任何代码时,都应该了解这段代码可能的调用源应该在哪里。这对下面的两个问题:处理函数可重入性和考虑运行中断级有很大的好处。请读者在这里回忆一下调用源和调用路径的概念,在下面的小节中将会使用。

 

 

 

更多精彩:

      web开发专栏:http://blog.csdn.net/broadviewwebdev
      数据库开发专栏:http://blog.csdn.net/broadviewdatabase
      程序设计专栏:http://blog.csdn.net/broadviewprograming
      嵌入式专栏:http://blog.mcuol.com/Broadview/index.htm