关于内核符号表

news/2024/7/3 11:47:29

关于内核符号表

http://soft-app.iteye.com/blog/920312


在编写驱动的过程中,常会使用到EXPORT_SYMBOL宏来将定义的函数名导出到内核符号表。以前只是简单的知道如果一个模块中定义的函数要提供给其他模块调用,就必须进行导出。这段时间在编译单个模块的时候,因为没编译成功造成了函数没定义而报警的情况,因此让我有一个机会对内核符号表的问题进行了一个深入的学习和认识。我们知道,如果一个模块中使用到了另一个模块中定义的函数,那么在编译该模块的时候,必然会打印出警告信息,提示该函数没有定义,当然这不会影响驱动的工作,可以忽略掉,只要在加载该驱动前,将使用到的函数的驱动提前加载就可以了。以前我编译的都是单个源文件构成的驱动模块,也曾出现过这种警告,不过我没理会他,因为我明知道在其他模块里定义了的。但是我现在编译由多个源文件构成的模块,居然也出现这个问题,所有函数都是在这个模块里定义的,没有用到任何其他模块的函数,起初,我很想不通,后来找到一个理由可以说服自己,我以为凡是调用的函数都得到内核符号表里去寻找对应的函数符号,找不到就会报警,而我正好没导出,报警也就正常了。当我把这些导出语句加进去后,果然警告消失了,也让我隐约觉得就是这个原因,但是很遗憾,我找不到任何可用的其他信息来支持我的这种想法,后来发现确实是我的问题,猜测根本不成立,至于我为何报警,这个现象很奇怪,是我的问题,不具有普遍意义,就不列出了,只提醒一下,注意多源文件与单文件驱动编译时Makefile的变化就好了。下面就回归正题,来阐述一下内核符号表这个东东,然后就可以知道我的猜测问题出在哪了。我们通常所说的内核符号表其实是一个狭义的概念,它仅仅指能为所有驱动模块公用的那部分内核符号表,我们知道,驱动也是存在于内核空间的,它的每一个函数每一个变量都会有对应的符号,这部分符号也可以称作内核符号,它们不导到就只能为自身所用,导出后就可以成为公用,对于导出的那部分的内核符号就是我们常说的内核符号表。insmod的时候并不是所有的函数都得到内核符号表去寻找对应的符号,如前面所说,每一个驱动在自己分配的空间里也会存在一份符号表,里面有关于这个驱动里使用到的变量以及函数的一些符号,首先驱动会在这里面找,如果发现某个符号是这里没有了,那么就会去公共内核符号表中搜索,搜素到了,则该模块加载成功,搜索不到则该模块加载失败。这里还补充一点,对于2.4内核和2.6内核的内核符号表是有区别的,2.4内核默认情况下模块中的非静态全局变量以及非静态函数在模块加载后会自动导出到内核符号表中,而2.6内核默认情况下是不会自动导出的,需要显式调用宏EXPORT_SYMBOL才能导出。导出的符号前面一般标注有r标记。可以通过nm -l xx.ko来查看某一个模块里的符号情况。或者通过查看内核符号表文件也行。对于2.4是:cat /proc/ksyms,对于2.6是:cat /proc/kallsyms. 最后来点总结,对于一个模块来讲,如果仅依靠自身就可以实现自己的功能,那么可以不需要导出任何符号,只有其他模块中需要使用到该模块提供的函数时,就必须要进行导出操作。


http://www.niftyadmin.cn/n/4645237.html

相关文章

内核符号表详解

内核符号表详解 http://hi.baidu.com/apollon2010/blog/item/ecbe1d5a3bd2ec8a800a18dc.html 关键词: Kernel Symbol Table、/proc/ksyms、system.map、Oops、LKM 这应该是一个很基本的内核概念,和模块、系统调用等一样基础,但牵涉的东…

如何读取被禁用的网卡信息

http://topic.csdn.net/u/20080310/19/5fa9b49d-c7f5-42be-986f-4cb46fb4e0b0.html?2079547956 比如,有两张网卡,一张启用,一张禁用,如何获取被禁用的网卡的信息,如网卡MAC,网卡名称等。GetAdaptersInfo…

如何在IDA中找到MFC程序的消息处理函数

比起用Win32SDK写的程序,要分析MFC应用程序要麻烦不少。在前者,只要找到注册窗口类的地方就知道其WinProc的位置。那里是程序的控制中心,只要顺藤摸瓜就可以找到你感兴趣的地方。对于用MFC写的程序,这一切都变得复杂起来了。这时&…

距离矢量路由协议通用属性

一、路由分类大多的路由协议都属于两个类别1、距离矢量(Distance Ventor)、2、链路状态(Link State)二、距离矢量路由协议因为路由是以矢量(距离,方向)的方式被通告出去的,其中距离是…

JSR 299 建议草案第二版已提交

昨天 Gavin King 提交了 JSR 299 (Contexts and Dependency Injection for the Java EE platform)的第二个建议草案 给 JCP。相比上一个建议草案,主要有如下四个大的修订: 在依赖注射注解(annotation)上全面…

csdn博客集

逆向 http://blog.csdn.net/pll621/article/category/138401 http://blog.csdn.net/cattom/article/category/220275

锂电池知识

一.锂电池保护 一般用户接触到手机锂离子电池,在外面看到的除了电池外壳,还有就是几个五金触片了,如图中"电池正极,电池负极"就是的电池正负极输出. ┏━━Fuse━━━━━┳━━━━━━━━━┫电池正极 ┃ R1 ┃ ┃ ┇ ┏┻━━┓ ┏┻┓ ┃保护IC┃…

MoveFileEx 的特殊应用

了解MoveFileEx (2012-01-18 11:01:36) 转载▼标签: 杂谈 分类: 技术文章 当dwFlags被设为MOVEFILE_DELAY_UNTIL_REBOOT时,函数直到系统重启后才移动文件。注意文件的移动是发生在AUTOCHK执行之后,在页面文件创建之前。而此时…