浅析module-init-tools-3.2下insmod()和rmmod()两个函数--之1--编译篇
文章来源:http://gliethttp.cublog.cn
insmod和rmmod()函数两个对应的源程序在module-init-tools-3.2.tar.bz2中,下载地址如下:
在redhat 9.0系统中, //[root@localhost gliethttp]# ll /sbin/insmod /sbin/rmmod -rwxr-xr-x 1 root root 146112 2003-02-12 /sbin/insmod lrwxrwxrwx 1 root root 6 2007-04-09 /sbin/rmmod -> insmod 从上面的输出我们可以看到,rmmod是insmod的一个连接,那是硬连接还是符号连接呢,使用下面语句可以查看, //[root@localhost gliethttp]# file /sbin/rmmod /sbin/rmmod: symbolic link to insmod 所以我们就知道了,rmmod是insmod的一个符号连接, 来看一个例子: 比如我要安装编译好的led.o驱动文件 //[root@localhost gliethttp]# insmod led.o 那么module-init-tools-3.2对应的 int main(int argc, char *argv[])入口函数将会接收到2个参数, argc=2,表示传进来了2个参数 argv[0]="insmod" 字符串 argv[1]="led.o" 字符串 同样 //[root@localhost gliethttp]# rmmod led.o 那么module-init-tools-3.2对应的 int main(int argc, char *argv[])入口函数也将会接收到2个参数, argc=2,表示传进来了2个参数 argv[0]="rmmod" 字符串 argv[1]="led.o" 字符串 当然,如果这样来执行的话 //[root@localhost gliethttp]# /sbin/insmod led.o 那么module-init-tools-3.2对应的 int main(int argc, char *argv[])入口函数同样会接收到2个参数, argc=2,表示传进来了2个参数 argv[0]="/sbin/insmod" 字符串 argv[1]="led.o" 字符串 所以我们的理解是:int main(int argc, char *argv[])函数实现部分 通过检查argv[0]的函数名来识别insmod和rmmod,不过来看看module-init-tools-3.2/insmod.c 具体语句为: int main(int argc, char *argv[]) { ... if (strstr(argv[0], "insmod.static"))//检查程序名中是否有该字符串子串 try_old_version("insmod.static", argv); else try_old_version("insmod", argv);//没有,那么执行这里的函数 ... } 没有这个辨别argv[0]中"rmomod"或者"insmod"的咚咚,好像就是把insmod和rmmod分别当成一个单独的可执行文件来看待(这是对的,因为module-init-tools-3.2也确实是生成了两个独立的rmmod和insmod可执行文件) 要想找到问题的答案,接下来我们先编译下载的module-init-tools-3.2.tar.bz2文件,看看编译结果是什么, //[root@localhost gliethttp]# tar jxvf module-init-tools-3.2.tar.bz2 //[root@localhost gliethttp]# cd module-init-tools-3.2 //[root@localhost module-init-tools-3.2]# ./configure 在安装在winxp,vmware5.5虚拟机中的redhat9.0操作系统会提示如下内容: checking build system type... i686-pc-linux-gnu checking host system type... i686-pc-linux-gnu checking target system type... i686-pc-linux-gnu checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking for gawk... gawk checking whether make sets $(MAKE)... yes checking for gcc... gcc checking for C compiler default output file name... a.out checking whether the C compiler works... yes checking whether we are cross compiling... no checking for suffix of executables... checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether gcc accepts -g... yes checking for gcc option to accept ANSI C... none needed checking for style of include used by make... GNU checking dependency style of gcc... gcc3 configure: Adding gcc options: -g -O2 -Wunused -Wall configure: creating ./config.status config.status: creating Makefile config.status: executing depfiles commands //[root@localhost module-init-tools-3.2]#make 开始编译 成功之后会生成4个独立的文件 insmod、lsmod、rmmod和modprobe 这样来看,redhat9.0中使用的rmmod和module-init-tools-3.2中的rmmod性质不一样, module-init-tools-3.2中的rmmod是一个独立的可执行文件,而redhat9.0中使用的rmmod 是insmod的一个符号链接, 接下来使用gdb来看看代码的执行情况,不过在执行之前,还需要生成一个驱动程序, 可以参考《linux最简单的驱动模型:hello world!》-- http://blog.chinaunix.net/u1/38994/showart_340148.html //[root@localhost module-init-tools-3.2]# gdb ./insmod hello.o 或者 //[root@localhost module-init-tools-3.2]# strace ./insmod hello.o 这两种方式都可以跟踪调用情况,具体细节,也没什么好说的,慢慢磕就行了:)
|