精华推荐内核模块编程的详细介绍3
加入这三行的原因是,避免这个 module 在没有设定 kernel version 的系统上,将 modversions.h 这个档案 include 进来。各位可以去试试看,当你把 set version 的选项关掉时,modversions.h 和 modules 这个目录都会不见。如果没有上面三行,那 compile 就不会过关。所以一般来讲,modversions.h 我们会选择在 compile 时传给 gcc 使用。就像下面这个样子。 gcc -c -D__KERNEL__ -DMODULE -DMODVERSIONS main.c -include usr/src/linux/include/linux/modversions.h 在这个 command line 里,我们看到了 -D__KERNEL__,这是说要定义 __KERNEL__ 这个 constant。很多跟 kernel 有关的 header file,都必须要定义这个 constant 才能 include 的。所以建议你最好将它定义起来。另外还有一个 -DMODVERSIONS。这个 constant 我刚才忘了讲。刚才我们说要解决 fucntion 或 variable 名字 encode 的方式就是要 include modversions.h,其实除此之外,你还必须定义 MODVERSIONS 这个 constant。再来就是 MODULE 这个 constant。其实,只要是你要写 module 就一定要定义这个变量。而且你还要 include module.h 这个档案,因为 _set_ver 就是定义在这里的。 讲到这里,相信各位应该对 module 有一些认识了,以后遇到 module unresolved 应该不会感到困惑了,应该也有办法解决了。 刚才讲的都是使用别人的 function 上遇到的名字 encode 问题。但是,如果我们自己的 module 想要 export 一些东西让别的 module 使用呢。很简单。在 default 上,在你的 module 里所有的 global variable 和 function 都会被认定为你要 export 出去的。所以,如果你的 module 里有 10 个 global variable,经由 ksyms,你可以发现这十个 variable 都会被 export 出去。这当然是个很方便的事啦,但是,你知道,有时候我们根本不想把所有的 variable 都 export 出去,万一有个 module 没事乱改我们的 variable 怎幺办呢 ? 所以,在很多时候,我们都只会限定几个必要的东西 export 出去。在 2.2.1 之前的 kernel (不是很确定) 可以利用 register_symtab 来帮我们。但是,现在更新的版本早就出来了。所以,在此,我会介绍 kernel 2.2.1 里所提供的。kernel 2.2.1 里提供了一个 macro,叫做 EXPORT_SYMBOL,这是用来帮我们选择要 export 的 variable 或 function。比方说,我要 export 一个叫 full 的 variable,那我只要在 module 里写: EXPORT_SYMBOL(full); 就会自动将 full export 出去,你马上就可以从 ksyms 里发现有 full 这个变量被 export 出去。在使用 EXPORT_SYMBOL 之前,要小心一件事,就是必须在 gcc 里定义 EXPORT_SYMTAB 这个 constant,否则在 compile 时会发生 parser error。所以,要使用 EXPORT_SYMBOL 的话,那 gcc 应该要下: gcc -c -D__KERNEL__ -DMODULE -DMODVERSIONS -DEXPORT_SYMTAB main.c -include /usr/src/linux/include/linux/modversions.h 如果我们不想 export 任何的东西,那我们只要在 module 里下 EXPORT_NO_SYMBOLS; 就可以了。使用 EXPORT_NO_SYMBOLS 用不着定义任何的 constant。其实,如果各位使用过旧版的 register_symbol 的话,一定会觉得新版的方式比较好用。至少我是这样觉得啦。因为使用 register_symbol 还要先定义出自己的 symbol_table让群众担纲主角,感觉有点麻烦。 当我们使用 EXPORT_SYMBOL 把一些 function 或 variable export 出来之后,我们使用 ksyma -a 去看一些结果。我们发现 EXPORT_SYMBOL(full) 的确是把 full export出来了 : c full [my_module]c01b8e08 pci_find_slot_R454463b5. . .
但是,结果怎幺跟我们想象中的不太一样,照理说,应该是 full_Rxxxxxx 之类的东西才对啊,怎幺才出现 full 而已呢 ? 奇怪,问题在那里呢 ? 其实,问题就在于我们没有对本身的 module 所 export 出来的 function 或 variable 的名字做 encode。想想,如果在 module 的开头。我们加入一行: #define full full_Rxxxxxx
之后,我们再重新 compile module 一次,载到 kernel 之后,就可以发现 ksyms -a 显示的是 c full_Rxxxxxx [my_module]c01b8e08 pci_find_slot_R454463b5. . . . .
了。那是不是说,我们要去对每一个 export 出来的 variable 和 function 做 define 的动作呢 ? 当然不是啰。记得吗,前头我们讲去使用 kernel export 的 function 时,由于 include 了一些 .ver 的档案,以致于我们不用再做 define 的动作。现在,我们也要利用 .ver 的档案来帮我们,使我们 module export 出来的 function 也可以自动加入 kernel version 的 information公共WiFi的运营模式同样需要改革。”刘培植认为。也就是变成 full_Rxxxxxx 之类的东西。
娄底治疗白癜风医院石家庄白癜病医院广西白癜风医院有哪些-
江苏发布关键性提醒!
浙江热尔省成人教育监察院发布新闻了 浙江热尔省2022年普通高考考后警告 一...
2023-11-17
-
微软大受欢迎《壮志凌云 2:独行侠》联名款 Xbox Series S 主机
IT之家 5 月底 22 日传言,Google公司 Xbox 官推近日公布了一款《一部 2:麦奎尔...
2023-11-02
-
富国基金股权转让新进展:山东金融资产豪掷50.39亿元收购富国16.675%股权,回报率高达352.
安邦基金会16.675%持股受让方终于出炉! 之前青岛市国际性信托股份控股(简...
2023-10-30
-
李时珍的化铁丸,上调颈椎、中调腰椎、持续上升膝盖与脚后跟
今天这篇文章给大家聊聊西医是如何冷内藏;也水泡的?有这样一个方子,都...
2023-10-27
-
2022二级建造师《建设工程法律法规及相关知识》真题答案及解析
2022二级建造师《工程工程项目法规及之外经验》真题诗究竟及解 一、每项选...
2023-10-26
-
你养出的孩子是否甜蜜你,取决于你对这4件事的态度
铭 | 芒来佳丽 碰到一则让人啼笑皆非的取而代之闻网: 家住鄱阳的13岁陌生...
2023-10-23