Linux代码的重用与强行卸载Linux驱动

(一)Linux代码的重用

重用=静态重用(将要重用的代码放到其他的文件的头文件中声明)+动态重用(使用另外一个Linux驱动中的资源,例如函数、变量、宏等)

1、编译是由多个文件组成的Linux驱动(静态重用)

对于复杂的Linux驱动,需要使用多个源代码文件存放不同的功能代码,这样做有利于代码分类和管理,那么就不得不编译多个源代码文件,最终生成.ko文件或编译进Linux内核

下面,就介绍将3个.c文件分别编译为3个.o文件,并将这3个.o文件链接(link)成一个.ko文件——静态重用

假设C语言源代码文件有main.c、fun.c、product.c、product.h,其中main.c是Linux驱动的主程序,在fun.c和product.c、product.h中定义和实现了在main.c中使用的函数,在main.c中通过extern关键字使用fun.c中的函数,通过包含product.h文件使用product.c文件中的函数

最关键一步就是编写Makefile文件

#Makefile

obj-m := multi_file_driver(文件所在目录).o

multi_file_driver-y := main.o fun.o product.o

总之,c或c++ 语言中编译多个源代码文件时,如果a.c使用了b.c文件中的函数,需要在a.c文件中使用extern预先定义b.c中的函数,extern的作用是告诉编译器该函数的函数名、参数个数、参数类型、返回值类型,等到将a.o和b.o链接成可执行文件或程序库时,编译器再到b.o中寻找函数的具体实现。除此之外,还可以使用b.h文件定义b.c中的函数,然后在a.c中包含b.h文件。

2、Linux驱动模块的依赖(动态重用)

在一个驱动模块里使用另一个驱动模块里的被导出的符号(常量、变量、函数等)

下面,示例由两个Linux驱动组成(symbol_producer和symbol_consumer),其中symbol_producer(symbol_producer.c文件)驱动的两个函数(add和sub)和symbo_const常量以及result变量被导出,而在symbol_consumer(symbol_concumer.c文件)驱动中则使用了这4个被导出的符号。

symbol_producer.c 文件部分代码如下://导出add函数

                    EXPORT_SYMBOL(add);

                   //导出result变量

                    EXPRORT_SYMBOL(result);

                   //导出sub函数,使用EXPROT_SYMBOL_GPL导出的符号

                    EXPORT_SYMBOL_GPL(sub);

                   //导出symbol_const常量

                    EXPORT_SYMBOL_GPL(symbol_const);

symbol_consumer.c文件中部分代码如下:extern const char* symbol_const;//定义被导出的常量

                    extern int result;//定义被导出的变量

                    extern int add(int x1,int x2);//定义被导出的add函数

                    extern int sub(int x1,int x2);//定义被导出的sub函数

由于有两个Linux驱动,因此需要在Makefile文件中指定两个Linux模块,代码如下:

#Makefile

obj-m := symbol_consumer.o

obj-m +=symbol_producer.o

注意:在安装symbol_consumer之前,需要先安装symbol_producer;卸载时顺序正好相反。

(二)强行卸载Linux驱动

情况1:初始化函数崩溃

由于Linux驱动模块的初始化函数进行了某些操作而崩溃,从而导致初始化函数无法正常返回,这种情况变现是当前Linux驱动模块没用被任何其他的Linux驱动模块使用,但却显示已经被应用了一次

这种情况关键是引用计数器的值和引用者不一致。只需要将当前的Linux驱动模块的引用计数器清零即可,修改计数器可以使用下面两个函数

//是module指向的Linux驱动模块的引用计数器加1,成功返回1,失败返回0

static inline int try_module_get(struct module *module);

//是module指向的Linux驱动模块的引用计数器减1

extern void module_put(struct module *module);

情况2:卸载函数被阻塞

在使用rmmod命令卸载Linux驱动时,系统会调用卸载函数,只有卸载函数成功返回时,Linux驱动才会被卸载,如果卸载函数被阻塞,rmmod命令也会被阻塞,也就是说永远不会执行到卸载Linux驱动模块的代码,这种情况的表现是一执行rmmod命令就会停在那不动了,永远也不会返回到系统的操作提示符

这种情况的问题根源就是卸载函数,只要将原来的卸载函数替换成一个空的卸载函数即可

总之,两者情况都要解决一个不可回避的问题,就是要获取表示要卸载的Linux驱动模块的module结构体指针。

时间: 2024-10-14 09:39:32

Linux代码的重用与强行卸载Linux驱动的相关文章

第八章:Linux代码重用、Linux驱动强行卸载

(一)Linux代码的重用 重用=静态重用(将要重用的代码放到其他的文件的头文件中声明)+动态重用(使用另外一个Linux驱动中的资源,例如函数.变量.宏等) 1.编译是由多个文件组成的Linux驱动,即静态重用 对于复杂的Linux驱动,需要使用多个源代码文件存放不同的功能代码,这样做有利于代码分类和管理,那么就不得不编译多个源代码文件,最终生成.ko文件或编译进Linux内核 下面,就举例介绍将3个.c文件分别编译为3个.o文件,并将这3个.o文件链接(link)成一个.ko文件——静态重用

写代码怎能不会这些Linux命令?

转自:https://zhuanlan.zhihu.com/p/28674639?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io 写代码怎能不会这些Linux命令? 王爵nice 3 天前 这篇文章翻译自http://www.thegeekstuff.com/2010/11/50-linux-commands/这些都是一些很常用的命令,这篇文章中每个命令都有一些简单的示例说明它的用法,对于想学习Unix/Linux的人

linux下mono的安装与卸载

我很遗憾的告诉你,这里没有安装,为什么标题里加入安装俩字呢,因为如果不加的话你会搜到这篇文章吗?哈哈!别气馁,这里会给你些安装的tips! 源码安装,git安装:建议安装路径如下,至于为什么,我也讲不太清楚,宇内说很多时候系统启动的时候调用或者加载so文件的时候会找不到对应目录,因为安装路径不在PATH中. ./configure --prefix=/usr或者 .autogen.h --prefix=/usr //这个相当不太好用啊,慎重吧 如果碰巧你使用的是官方tar包,那么恭喜你,你mak

linux下软件的安装与卸载方法

 linux下安装软件,如何知道软件安装位置 注:一般的软件的默认安装目录在/usr/local或者/opt里,可以到那里去找找. 指令名称:whereis 功能介绍:在特定目录中查找符合条件的文件.这些文件的烈性应属于原始代码,二进制文件,或是帮助文件. 语法格式:whereis [-bfmsu][-B <目录>...][-M <目录>...][-S <目录>...][文件...] 常用参数说明: -b 只查找二进制文件. -B <目录> 只在设置的目

用Visual Studio编辑Linux代码

估计很多人都是用惯了Visual Studio的主,怎么也不适应Linux的一套编辑器,比如vim.source insight这些东西,可视化的eclipse效果还好点,但一般以远程共享一台Linux服务器为主,没那么好条件一人一个Linux机器. 我用了有几个月的insight,也就看看代码,反正个人感觉就是别扭,现在换成用VS编辑代码,感觉爽多了. 大致方法如下: (1)从svn下载Linux代码到本地目录. (2)打开Visual studio,选择“File” -> “New” ->

linux使用apt-get安装软件与卸载软件

1.安装软件: sudo apt-get install ABC 和 sudo aptitude install ABC 当然,上面的ABC只是虚构的软件.Sudo表示你授权管理员(超级用户)权限给下面的命令.这需要你输入管理员密码.这和你打开新立得的时候需要输入密码是一样的道理,只不过现在是在终端下而已.如果你直接输入sudo aptitude,你会看到一个类似于命令行版本的新立得软件包管理器. 你还可以像在新立得里面搜索软件一样使用命令行搜索.命令如下: apt-cache search A

卸载Linux内置的AMP软件

卸载Linux内置的AMP软件 在安装Linux软件的LAMP环境时,必须有一个前提:必须要完全卸载掉系统内置的AMP软件. 1.卸载httpd软件(Apache) 如果在卸载软件时出现依赖关系,我们可以在服务名称后面添加一个参数-nodeps来强制卸载该软件. 2.卸载mysql软件 3.卸载php软件

将Linux代码移植到Windows的简单方法

将Linux代码移植到Windows的简单方法 一.前言 Linux拥有丰富各种源代码资源,但是大部分代码在Windows平台情况是无法正常编译的.Windows平台根本无法直接利用这些源代码资源.如果想要使用完整的代码,就要做移植工作.因为C/C++ Library的不同和其他的一些原因,移植C/C++代码是一项困难的工作.本文将以一个实际的例子(Tar)来说明如何把Linux代码移植到Windows平台上.移植过程将尽量少修改代码,以便代码的运行逻辑不会发生任何变动.保留绝大部分软件主要功能

升级与卸载Linux内核

升级linux内核 当linux服务器的内核比较旧,就需要对内核进行升级了. [[email protected] ~]# uname -r     #查看当前Linux内核版本 2.6.32-573.el6.x86_64 [[email protected] ~]# ll /boot/vmlinuz-* -rwxr-xr-x. 1 root root 4220560 Jul 23  2015 /boot/vmlinuz-2.6.32-573.el6.x86_64 [[email protect