linux可执行文件后缀定位某个函数是哪个模块提供的

一、模块机制产生的原因 

ModuleLKM),简称模块Linux内核之所以提供模块机制,是因为它本身是一个单内核(monolithic kernel)。单内核的最大优点是效率高,因为所有的内容都集成在一起,但其缺点是可扩展性和可维护性相对较差,模块机制就是为了弥补这一缺陷。

  • 模块实际上是一种目标对象文件(.ko)
  • 没有链接,不能独立运行,但是其代码可以在运行时链接到系统中作为内核的一部分运行或从内核中取下,从而可以动态扩充内核的功能
  • 这种目标代码通常由一组函数和数据结构组成

三、Linux内核模块的特点

  1. 使得内核更加紧凑和灵活
  2. 修改内核时,不必全部重新编译整个内核。系统如果需要使用新模块,只要编译相应的模块,然后使用insmod将模块装载即可;
  3. 模块的目标代码一旦被链接到内核,它的作用域和静态连接的内核目标代码完全等价;
  1. 由于内核所占用的内存是不会被换出的,所以链接进入内核的模块会给整个系统带来一定的性能和内存利用方面的损失;
  2. 装入内核的模块就成为内核的一部分,可以修改内核中的其他部分,因此,模块的使用不当会导致系统崩溃;
  3. 为了让内核模块能访问所有内核资源,内核必须维护符号表,并在装如何卸载模块式修改符号表;
  4. 模块会要求利用其它模块的功能,所以,内核要维护模块之间的依赖性

四、Linux内核模块与应用程序的区别

   一个模块A引用另一个模块B所导出的符号,我们说模块B被A引用

   如果要装载模块A,必须先要装在模块B。否则模块B所导出的那些符号的引用就不可能被链接到模块A中。这种模块之间的相互关系就叫做模块依赖

很自然的,下一个疑问接踵而至,--模块里的其他函数如何被调用?比如我写的模块中除了 init_module() 和cleanup_module() 函数外,还写了一个 hello_world() 函数,简单的输出hello world到控制台,好,接下来就是这次分析的关键,前面我们强调了模块中的函数是由内核来调用的,除此之外没有别的机会使它被执行到。那如果我们的 hello_world() 函数不能被内核调用,这不就意味着它永远也不可能被执行到吗?确实是这样,换句话说,在这种情况下它就是一段垃圾代码,永无见天日之时。怎么样才能使我们的 hello_world() 函数被执行?显然,关键在于让内核认识它,即内核能找到它。那么,怎样才能使内核找到这个函数?再进一步的问题是,内核为什么要去找这个函数?第一问的答案是,内核通过系统中特定的数据结构来找到函数的,当然,这意味着在你的模块程序中,仅仅写上 hello_world() 函数的代码是不够的,还应该再做几步工作:a,首先,系统中的各类数据结构那么多,要使用哪个呢?这由你这个模块的注册性质决定,譬如你的模块是一个USB设备驱动模块,那么你就需要填写usb设备驱动程序的数据结构(通常数据结构都是结构体(struct)的形式)

这里的各项有些是字符串,有些是函数指针,具体请查资料。

b,把 hello_world() 的函数指针放进一个数据结构中。我们还是接着举usb设备驱动程序模块的例子吧,在它的数据结构usb_driver{}中,选一个恰好是函数指针的项,把 hello_world() 函数的指针放进去(通过函数名),再填满这个数据结构的其他部分(不想填的话就空着吧:P,用分号分隔即可)。

c,填完之后,回到第一问中,怎样使内核能够找到这个 hello_world() 函数?回头想想,当我们填完了数据结构,也就决定了我们所编的模块的性质,在此例中它是作为一个usb设备驱动模块,但是要让内核知道它的性质,还得通过执行usb设备驱动程序的系统注册函数 usb_register(struct usb_struct *drv),向内核注册这个模块以及这个填好的数据结构。注意到了吧,注册函数的参数就是我们前面所填写的usb设备驱动模块的数据结构,也就是说,执行了这个注册函数之后,内核里就认识了这个模块,并且得到了 hello_world() 函数的指针!哈哈,这就为我们的 hello_world() 函数找到了生存的意义--它有可能被执行了!(偶觉得,程序生存的意义就在于被执行,就跟偶们生存的意义在于编程序一样:P)

d,还得补充一下,usb_register(struct usb_struct *drv) 函数必须被放在 init_module() 中,因为在注册这个决定模块性质的数据结构之前(短语太长,可约为这个数据结构),模块中可以被直接执行到的函数只有 init_module() 和 cleanup_module() 两个,如果不把握这个机会赶紧注册数据结构的话,那我们的

我要回帖

更多关于 linux可执行文件 的文章

 

随机推荐