Linux内核Module..docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux内核Module.

Linux – Module Module 可以允许我们动态的改变 kernel,加载 device driver,而且它也能缩短我们 driver development 的时间。在 RedHat 里,我们可以执行sndconfig,它可以帮我们config 声卡。config 完之后如果捉得到你的声卡,那你的声卡马上就可以动了,而且还不用重新激活计算机。这是怎么做到的呢 ? 就是靠module。 module 其实是一般的程序,但是它可以被动态载到kernel 里成为 kernel的一部分。载到 kernel 里的 module 它具有跟 kernel 一样的权力,可以 access 任何 kernel 的 data structure。你听过 kdebug 吗 ? 它是用来 debug kernel 的。它就是先将它本身的一个 module 载到 kernel 里,而在 user space 的 gdb 就可以经由跟这个 module 沟通,得知 kernel 里的 data structure 的值,除此之外,还可以经由载到 kernel 的 module 去更改 kernel 里 data structure。 我们知道,在写C程序的时候,一个程序只能有一个main。Kernel 本身其实也是一个程序,它本身也有个 main,叫 start_kernel()。当我们把一个module 载到 kernel 里的时候,它会跟 kernel 整合在一起,成为 kernel 的一部分。请各位想想,那module 可以有main 吗 ? 答案很明显的,是No。理由很简单。一个程序只能有一个main。在使用module时,有一点要记住的是module是处于被动的角色它是提供某些功能让别人去使用的。 Kernel里有一个变量叫module_list,每当user将一个module载到kernel里的时候,这个module就会被记录在module_list里面。当kernel 要使用到这个module 提供的function时,它就会去search 这个list,找到module,然后再使用其提供的function或variable。每一个module 都可以export 一些function或变量来让别人使用。除此之外module也可以使用已经载到kernel里的module提供的function。这种情形叫做module stack。比方说,module A用到module B的东西,那在加载module A之前必须要先加载module B。否则module A会无法加载。除了module 会export东西之外,kernel 本身也会export一些function或variable。同样的,module 也可以使用kernel所export出来的东西。由于大家平时都是撰写user space的程序,所以,当突然去写module的时候,会把平时写程序用的function拿到module里使用。像是printf之类的东西。我要告诉各位的是,module所使用的function或variable,要嘛就是自己写在module里,要嘛就是别的 module 提供的,再不就是kernel所提供的。你不能使用一般libc或glibc所提供的 function。像printf之类的东西。这一点可能是各位要多小心的地方。kernel本身会 export 出一些 function 或 variable 来让module使用,但是,我们不是万能的,我们知道kernel开放东西让我们使用呢 ? Linux提供一个command,叫ksyms,你只要执行ksyms -a就可以知道kernel或目前载到kernel里的 module提供了那些function或variable。底下是我的系统的情形:c0216ba0 drive_info_R744aa133 c01e4a44 boot_cpu_data_R660bd466 c01e4ac0 EISA_bus_R7413793a c01e4ac4 MCA_bus_Rf48a2c4c c010cc34 __verify_write_R203afbeb . . . . . 在kernel里,有一个symbol table是用来记录export出去的function或variable。除此之外,也会记录着module export有哪些function。上面几行中,表示kernel提供了drive_info 这个function/variable。所以,我们可以在kernel里直接使用它,等载到kernel里时,会自动做好link的动作。由此,我们可以知道,module本身其实是还没做link的一些ob

文档评论(0)

dashewan + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档