内核编程的主要调用源
来源:互联网 发布:软件行业例会 编辑:程序博客网 时间: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
- 内核编程的主要调用源
- Linux 内核的主要工作
- AIO 的主要内核参数
- linux内核的主要模块
- Linux网络编程--主要系统调用函数
- linux网络编程(1)——linux_IP命令和内核的主要模块
- Linux内核-协议栈-主要函数调用栈
- swift 与 C 语言混合编程,主要关于指针变量的调用问题
- 内核的主要配置文件的详细说明
- 内核的主要配置文件的详细说明
- 内核的主要配置文件的详细说明
- 全面解析Linux内核的主要配置
- 详解内核的主要配置选项
- Linux内核的主要配置选项
- 删除某一内核版本的主要操作
- make ***config 编译内核的主要区别
- 主要几个浏览器的内核是什么
- 几种主要的浏览器内核
- Web设计师必须知道的11个SEO技巧
- net framework 2.0,3.0与3.5三个版本之间关系如下
- 监视,测试站点的工具
- B/S打印条码(TDP643测试通过)
- Head First C# 中文版 第10章 异常处理 page478
- 内核编程的主要调用源
- SQL研究 - Pivot
- 放松全身,安静,安静~
- 几个免费下载原版图书的网站收藏
- oracle 在windows上的启动
- SQL 研究 - Cube 和 RollUp
- 从AFX_MANAGE_STATE(AfxGetStaticModuleState())说起
- 在DLL中产生对话框的方法一(Win32 DLL)(转)
- vs2005快捷键大全