`
v5qqbrowser
  • 浏览: 356688 次
文章分类
社区版块
存档分类
最新评论

关于内核符号表

 
阅读更多

在编写驱动的过程中,常会使用到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://blog.csdn.net/cywosp/article/details/6833631

分享到:
评论

相关推荐

    内核符号的导出实验(附源代码)

    详细讲述了内核符号的导出实验,如果你看了肯定觉得好,3个资源分绝对超值,不信你可以看我前面写的2篇文章。多谢大家!

    vmlinux-to-elf:通过提取内核符号表(kallsyms)从原始内核中恢复可完全分析的.ELF的工具

    为此,它将在内核中扫描内核符号表( ),这是几乎每个内核中都存在的压缩符号表,大多数情况下未。 因为相关的符号表最初是压缩的,所以它应该恢复原始二进制文件中不可见的字符串。 它会生成一个.ELF文件,您可以...

    win7 32位 7601版本调试符号表离线安装包

    win7 32位 7601版本调试符号表离线安装包,内包含2个文件,安装FRE版即可,亲测有效,找了很久才找到,欢迎各位内核调试的大佬们下载

    zh-hans_windows_xp_professional_with_service_pack_3_x86(包含符号表).zip

    zh-hans_windows_xp_professional_with_service_pack_3_x86(包含符号表 内核调试学习用

    linux内核链接脚本

    内容提要 本文简单的介绍了理解内核链接...这里或许有一些你经常看到但不了解原理的东西,例如“内核导出符号表是如何创建的?”、“__initcall修饰的函数在什么时候被内核调用?”、“__initdata是否会被释放?”等。

    Window xp sp3 symbols调试符号表超级完整包

    Windows xp sp3调试符号包,微软官方已经下架。wingdb调试专用包.

    Windows 内核 导出的函数 或者 符号

    Windows Kernel Export Function or Sign

    VMware-Fusion-12.2.1-18811640_x86.dmg

    VMware mac版本 虚拟机

    SymEngine:OpenCL 内核的符号执行

    SymEngine:OpenCL 内核的符号执行 SymEngine 以符号方式执行 OpenCL 内核,以便提取内核内存访问的符号表示。 SymEngine 依赖 Scalar Evolution 来计算地址。 SymEngine 使用 3 个配置文件。 hw_config.yaml 包含...

    天书夜读:从汇编语言到Windows内核编程(完整版一)

     8.2.5 设置Windows内核符号表 106  8.2.6 调试例子diskperf 106  8.3 认识内核代码函数调用方式 107  8.4 尝试反写C内核代码 111  8.5 如何在代码中寻找需要的信息 113  第9章 用C++编写的内核程序 117  9.1...

    天书夜读:从汇编语言到Windows内核编程(完整版 二)

     8.2.5 设置Windows内核符号表 106  8.2.6 调试例子diskperf 106  8.3 认识内核代码函数调用方式 107  8.4 尝试反写C内核代码 111  8.5 如何在代码中寻找需要的信息 113  第9章 用C++编写的内核程序 117  9.1...

    获取Linux内核未导出符号的几种方式

    从Linux内核的2.6某个版本开始,内核引入了导出符号的机制。只有在内核中使用EXPORT_SYMBOL或EXPORT_SYMBOL_GPL导出的符号才能在内核模块中直接使用。然而,内核并没有导出所有的符号。例如,在3.8.0的内核中,do_...

    5.1.2600_WindowsXP内核结构_vim_

    VIM配置文件 区分大小写

    Windows Vista 内核结构大典

    从Windows Vista 内核符号表导出的内核数据结构;在国外网站上找到的,觉得很好,做成了pdf;有引用链接,词典式的组织结构,比较适合windows内核编程的对有关数据结构的参考。

    linux 内核模块

    linux内核模块编写 例子程序 导出符号的使用

    linux内核调试分析指南

    载入模块符号 ***第三部分:其他工具*** kexec strace ltrace SystemTap MEMWATCH YAMD Magic SysRq 附录:社区交流相关 补丁提交相关文档 补丁制作与提交示范 多补丁发送工具 git使用 Git公共库创建及使用 附录:...

    易语言驱动内核命令

    易语言驱动内核命令源码,驱动内核命令,内存保护_关闭,内存保护_打开,关闭对象,文件_关闭,文件_打开,文件_写入数据,文件_读取数据,文件_取信息,驱动_注册处理过程,驱动_注册符号链接,驱动_卸载符号链接,驱动_获取驱动...

    从汇编语言到Windows内核编程

    这一部分包括指令分析、硬件基础知识、内核Hook的实际开发练习,以及将完成一个用到内核Hook的有趣的实例,这个实例有助于计算机阻挡各种病毒和木马的侵袭。 此外,本部分遂包括特殊的一章,涉及如何巧妙地编写代码...

    MSP430ZHILING.rar_msp430 内核_内核指令结构

    MSP430 的内核CPU 结构是按照精简指令集和高透明指令的宗旨来设计的使用的指令有硬件执行的 内核指令和基于现有硬件结构的高效率的仿真指令仿真指令使用内核指令及芯片额外配置的常数发生器 CG1 CG2 MSP430 指令的...

    《深入Linux设备驱动程序内核机制》.pdf

    通过“符号表”的形式向外界导出符号信息。 由EXPORT_SYMBOL等宏导出的符号,与一般的变量定义并没有实质性的差异,唯一的不同点在于它们被放在了特定的section中。 对这些section的使用需要经过一个中间环节,即...

Global site tag (gtag.js) - Google Analytics