[转载]模块的编写、加载和卸载

简介:

来源:http://hi.baidu.com/niuniu_2006923/blog/item/8cd001dda717103d5882dd34.html

O'REILLY 写的《LINUX 设备驱动程序》中作者一再强调在编写驱动程序时必须 建立内核树。所谓内核树,我的理解和网上资料说的一致就是内核源码的一种逻辑形式。

先查看自己OS使用的内核版本 

shana@shana: uname -r </span><br> <span>2.6.22-14-generic /* 这是我显示的结果 */ </span><br> <br> <span>如果安装系统时,自动安装了源码。在 /usr/src 目录下有对应的使用的版本目录。例如下(我是自己下的) </span><br> <br> <span>shana@shana:/usr/src ls 
linux-headers-2.6.22-14 
linux-headers-2.6.22-14-generic 
linux-source-2.6.22 /*这个就是解压后的源码目录 */ 
linux-source-2.6.22.tar.bz2 /* 这是我下的源码 包 */ 
shana@shana:/usr/sr  </span><br> <br> <span>如果没有源码。(一般ubuntu 都没有吧) </span><br> <span>查看一下可一下载的源码包(切记不要使用超级用户使用此命令否则&&会提示没有此命令) </span><br> <br> <span>shana@shana:/usr/src apt-cache search linux-source 
linux-source - Linux kernel source with Ubuntu patches 
xen-source-2.6.16 - Linux kernel source for version 2.6.17 with Ubuntu patches 
linux-source-2.6.22 - Linux kernel source for version 2.6.22 with Ubuntu patches 
shana@shana:/usr/sr  </span><br> <br> <span>我选择了 linux-source-2.6.22 - Linux kernel source for version 2.6.22 with Ubuntu patches 这个~ </span><br> <span>然后 install 之 </span><br> <br> <span>shana@shana:/usr/src sudo apt-get install linux-source-2.6.22 

下载完成后,在/usr/src下,文件名为:linux-source-2.6.22.tar.bz2,是一个压缩包,解压缩既可以得到整个内核的源代码: 

注意 已经切换到超级用户模式 

root@shana:/usr/src#tar jxvf linux-source-2.6.20.tar.bz2 

解压后生成一个新的目录/usr/src/linux-source-2.6.22,所有的源代码都在该目录下。 

进入该目录 

开始配置内核 选择最快的原版的配置(默认)方式 (我是如此) 

root@shana:/usr/src/linux-source-2.6.22# make oldconfig 

当然你也可以使用 自己喜欢的配置方式 如 menuconfig , xconfig(必须有GTK环境吧)。反正不用剪裁什么,所以不管那种方式能配置它就行了。 

完成后,开始make 吧 这儿比较久 一般有1一个小时吧。(保证空间足够 我编译完成后 使用了1.8G) 我分区时分给/目录30G的空间,我没遇到这问题。倒是我朋友遇到了。 

shana@shana:/usr/src/linux-source-2.6.2 make </span><br> <br> <span>shana@shana:/usr/src/linux-source-2.6.22 make bzImage 

当然,第一个make也可以不执行,直接make bzImage。执行结束后,可以看到在当前目录下生成了一个新的文件: vmlinux, 其属性为-rwxr-xr-x。 

然后 : 

root@shana:/usr/src/linux-source-2.6.22#make modules /* 编译 模块 */ 

root@shana:/usr/src/linux-source-2.6.22#make modules_install /* 安装 模块 */ 

执行结束之后,会在/lib/modules下生成新的目录/lib/modules/2.6.22-14-generic/ 
。 在随后的编译模块文件时,要用到这个路径下的build目录。至此,内核编译完成。可以重启一下系统。 

至此 内核树就建立啦 原来不是很难..... 

写一个 最简单 最没用的驱动吧 
我在 /home/shana/linux_q/ 目录下创建2个文本文件 hello.c Makefile 

//hello.c 
#include <linux/init.h> 
#include <linux/module.h> 
MODULE_LICENSE("Dual BSD/GPL"); 

static int hello_init(void) 

printk(KERN_ALERT "Hello, world\n"); 
return 0; 


static void hello_exit(void) 

printk(KERN_ALERT"Goodbye, cruel world\n"); 


module_init(hello_init); 
module_exit(hello_exit); 

程序我就不解释了…… 

Makefile 文件 

obj-m := hello.o 
KERNELDIR := /lib/modules/2.6.20/build 
PWD := (shell pwd) </span><br> <br> <span>modules: </span><br> <span> (MAKE) -C (KERNELDIR) M= (PWD) modules 

modules_install: 
(KERNELDIR) M (PWD) modules_install </span><br> <br> <span>如果以上你都完成了在 make 时出现这样的错误 </span><br> <br> <span>shana@shana:~/linux_驱动开发 make 
make: 没有什么可以做的为 `modules'。 

原因很简单 你肯定是从我这直接复制的吧~~~呵呵,Makefile格式错误啦~ 
解决办法就是 你把如 (MAKE) -C (KERNELDIR) M (PWD) modules_install 移动到行首 然后按Tab 键自动对齐 </span><br> <span>这时里边的变量都变成绿色了~然后在 make 吧 </span><br> <br> <span>shana@shana:~/linux_驱动开发 make 
make -C /lib/modules/2.6.22-14-generic/build M=/home/shana/linux_驱动开发 modules 
make[1]: Entering directory `/usr/src/linux-headers-2.6.22-14-generic' 
CC [M] /home/shana/linux_驱动开发/hello.o 
Building modules, stage 2. 
MODPOST 1 modules 
CC /home/shana/linux_驱动开发/hello.mod.o 
LD [M] /home/shana/linux_驱动开发/hello.ko 
make[1]: Leaving directory `/usr/src/linux-headers-2.6.22-14-generic' 
shana@shana:~/linux_驱动开  </span><br> <br> <br> <span>shana@shana:~/linux_驱动开发 ls -l 
总用量 124 
-rw-r--r-- 1 shana shana 303 2008-03-16 10:43 hello.c 
-rw-r--r-- 1 shana shana 49039 2008-03-16 12:11 hello.ko 
-rw-r--r-- 1 shana shana 687 2008-03-16 12:11 hello.mod.c 
-rw-r--r-- 1 shana shana 25840 2008-03-16 12:11 hello.mod.o 
-rw-r--r-- 1 shana shana 24360 2008-03-16 12:11 hello.o 
-rw-r--r-- 1 shana shana 8344 2008-03-16 09:17 linux_qudong_qu.txt 
-rw-r--r-- 1 shana shana 266 2008-03-16 12:09 Makefile 
-rw-r--r-- 1 shana shana 0 2008-03-16 12:11 Module.symvers 
shana@shana:~/linux_驱动开  </span><br> <br> <br> <span>然后加载模块 (超级用户) </span><br> <br> <span>root@shana:/home/shana/linux_驱动开发# insmod ./hello.ko </span><br> <br> <span>按照书上的例子 会在终端显示 hello , world 但是运行后什么都没有出现 (原因不解) </span><br> <br> <span>root@shana:/home/shana/linux_驱动开发# insmod ./hello.ko </span><br> <span>root@shana:/home/shana/linux_驱动开发# </span><br> <br> <span>查看加载模块 </span><br> <br> <span>root@shana:/home/shana/linux_驱动开发# lsmod </span><br> <span>Module Size Used by </span><br> <span>hello 2560 0 </span><br> <br> <span>已经加载上咯~~ </span><br> <br> <span>删除模块 </span><br> <br> <span>root@shana:/home/shana/linux_驱动开发# rmmod hello </span><br> <span>root@shana:/home/shana/linux_驱动开发# </span><br> <br> <span>那程序的输出在那呢?书中说明 如果不出现在终端 则会写进 syslog 文件中 </span><br> <br> <span>shana@shana:~/linux_驱动开发 cat /var/log/syslog |grep world 
Mar 16 12:14:53 shana kernel: [ 5937.529297] Hello, world 
Mar 16 12:16:05 shana kernel: [ 6009.439036] Goodbye, cruel world 
shana@shana:~/linux_驱动开发" alt="">shana@shana:~/linux_驱动开发" title="">shana@shana:~/linux_驱动开发" border="0" class="latex" />  

 

补充:printk输出可以在dmesg里看到。






本文转自五岳博客园博客,原文链接:www.cnblogs.com/wuyuegb2312/articles/2507355.html,如需转载请自行联系原作者

目录
相关文章
|
8月前
|
Windows
安装依赖出现: 无法加载文件,因为在此系统上禁止运行脚本
安装依赖出现: 无法加载文件,因为在此系统上禁止运行脚本
|
9月前
|
编译器
模块的加载过程三(下)
模块的加载过程三(下)
95 0
|
9月前
|
存储 Linux C语言
模块的加载过程一
模块的加载过程一
99 0
|
9月前
|
Linux
模块的加载过程二(上)
模块的加载过程二
65 0
|
9月前
|
程序员 Linux
模块的加载过程二(下)
模块的加载过程二(下)
91 0
|
9月前
|
Linux
模块的加载过程四
模块的加载过程四
82 0
|
9月前
|
Linux 索引
模块的加载过程三
模块的加载过程三
54 0
|
11月前
|
算法
【Magisk模块】自动内存优化模块v1.2
【Magisk模块】自动内存优化模块v1.2
593 0
|
11月前
|
Ubuntu 编译器 Linux
Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试
前面学习了驱动的基础框架,上一篇编译了gcc7.3.0,那么为了方便很好的熟悉流程,本篇,将使用ubuntu18.04,直接编译ubuntu18.04的驱动,然后做好本篇文章的相关实战测试。
驱动开发:实现驱动加载卸载工具
驱动程序加载工具有许多,最常用的当属`KmdManager`工具,如果驱动程序需要对外发布那我们必须自己编写实现一个驱动加载工具,当需要使用驱动时可以拉起自己的驱动,如下将实现一个简单的驱动加载工具,该工具可以实现基本的,安装,加载,关闭,卸载等操作日常使用完全没问题。
383 0