linux下怎么编译安装驱动?

linux下怎么编译安装驱动?,第1张

linux

编译安装驱动有两种,动态加载与静态加载

动态加载

一,编译,在指点内核树下编译,生成.o文件或.ko文件

二,将生成的.o或.ko文件拷到相应目录,一般是/lib/module/kernel下面

三,用insmod命令加载,用rmmod命令卸载

静态加载

静态加载主要就是编译内核。就是将编写好的驱动放进内核相应的目录下面。然后编译内核。然后运行编译好的内核。

按照《linux设备驱动开发详解》一书中的步骤实现经典例子"hello,world!"的例子。

具体步骤如下:

=============================================

1.源码如下:

/*

* hello.c -- the example of printf "hello world!" in the screen of driver program

*/

#include <linux/init.h>

#include <linux/module.h>

MODULE_LICENSE("Dual BSD/GPL")/* declare the license of the module ,it is necessary */

static int hello_init(void)

{

printk(KERN_ALERT "Hello World enter!\n")

return 0

}

static int hello_exit(void)

{

printk(KERN_ALERT "Hello world exit!\n")

}

module_init(hello_init)/* load the module */

module_exit(hello_exit)/* unload the module */

进入目录:

[root@Alex_linux /]#cd /work/jiakun_test/moduletest

[root@Alex_linux moduletest]# vi hello.c

然后拷入上面书上的源码。

2.编译代码:

1>.首先我在2.4内核的虚拟机上进行编译,编译过程如下:

[root@Alex_linux moduletest]#gcc -D__KERNEL__ -I /usr/src/linux -DMODULE -Wall -O2 -c -o hello.o hello.c

其中-I选项指定内河源码,也就是内核源码树路径。编译结果:

hello.c:1:22: net/sock.h: No such file or directory

hello.c: In function `hello_init':

hello.c:6: warning: implicit declaration of function `printk'

hello.c:6: `KERN_ALERT' undeclared (first use in this function)

hello.c:6: (Each undeclared identifier is reported only once

hello.c:6: for each function it appears in.)

hello.c:6: parse error before string constant

hello.c: In function `hello_exit':

hello.c:11: `KERN_ALERT' undeclared (first use in this function)

hello.c:11: parse error before string constant

hello.c: At top level:

hello.c:13: warning: type defaults to `int' in declaration of `module_init'

hello.c:13: warning: parameter names (without types) in function declaration

hello.c:13: warning: data definition has no type or storage class

hello.c:14: warning: type defaults to `int' in declaration of `module_exit'

hello.c:14: warning: parameter names (without types) in function declaration

hello.c:14: warning: data definition has no type or storage class

在网上查询有网友提示没有引入kernel.h

解决:vi hello.c

在第一行加入:#include <linux/kernel.h>

再次编译仍然报KERN_ALERT没有声明

修改编译条件-I,再次编译:

[root@Alex_linux moduletest]#gcc -D__KERNEL__ -I /usr/src/linux -DMODULE -Wall -O2 -c -o hello.o hello.c

[root@Alex_linux moduletest]#ls

hello.c hello.o Makefile

[root@Alex_linux moduletest]#

2>.接着我尝试在2.6内核的虚拟机上进行编译

编译过程如下:

[root@JiaKun moduletest]# ls

hello.c makefile

[root@JiaKun moduletest]# vi hello.c

[root@JiaKun moduletest]# make

make -C /mylinux/kernel/2.4.18-rmk7 M=/home/alex/test/moduletest modules

make: *** /mylinux/kernel/2.4.18-rmk7: No such file or directory. Stop.

make: *** [modules] Error 2

[root@JiaKun moduletest]# vi makefile

[root@JiaKun moduletest]# make

make -C /usr/src/kernels/2.6.18-53.el5-i686 M=/home/alex/test/moduletest modules

make[1]: Entering directory `/usr/src/kernels/2.6.18-53.el5-i686'

scripts/Makefile.build:17: /home/alex/test/moduletest/Makefile: No such file or directory

make[2]: *** No rule to make target `/home/alex/test/moduletest/Makefile'. Stop.

make[1]: *** [_module_/home/alex/test/moduletest] Error 2

make[1]: Leaving directory `/usr/src/kernels/2.6.18-53.el5-i686'

make: *** [modules] Error 2

[root@JiaKun moduletest]# mv makefile Makefile

[root@JiaKun moduletest]# make

make -C /usr/src/kernels/2.6.18-53.el5-i686 M=/home/alex/test/moduletest modules

make[1]: Entering directory `/usr/src/kernels/2.6.18-53.el5-i686'

CC [M] /home/alex/test/moduletest/hello.o

Building modules, stage 2.

MODPOST

CC /home/alex/test/moduletest/hello.mod.o

LD [M] /home/alex/test/moduletest/hello.ko

make[1]: Leaving directory `/usr/src/kernels/2.6.18-53.el5-i686'

[root@JiaKun moduletest]# ls

hello.c hello.ko hello.mod.c hello.mod.o hello.o Makefile Module.symvers

一、手工加载测试

1、insmod

./key_test.ko

加载驱动模块到内核

2、cat

/proc/modules

|grep

key_test

查看key_test模块在内核中的地址,不加过滤器可以看到全部加载的模块。

3、lsmod

显示模块,这时可以看到所有的模块名字,后面跟的是主设备号和次设备号。

4、rmmod

key_test

把模块从内核里卸载。

二、动态加载

1、把key_test.c源代码放到内核源代码的/drives/char/下,因为这是属字符型驱动,放在这编译到zImage中。

2、这时我们make

menuconfig

编译内核是看不到key_test这个选项的。我们把这个选项写到菜单里面才行。在内核源代码的/drives/char/下有一个Kconfig文件,打开

(1)

vi

Kconfig

加几行到里面:

config

ConFig_key_test

bool

"key

test"

//前面那个bool换成tristate就是支持模块化编译

上面句是在make

menuconfig时会出现key

test这个选项在drive/char子菜单下,bool前面是TAB键

------help----------

这句是出现在菜单选项下面的

This

key

test

help.

这句是你的驱动的说明会出现在help里面

(2)在/drivers/char目录下的Makefile文件里加上一句:

obj-$(CONFIG_key_test)

+=

key_test.o

上面这句是让Make时把key_test编译到内核中.

(3)

make

menuconfig

把key_test选项选取上

(4)

make

zImage

生成zImage文件,重启动加载这个新编的内核。

3、lsmod就能看到key_test了,但是还不能用,没有接口,也就是/dev下面没有

4、mknod

/dev/key_test

c

121

0

这是创建设备到/dev下,使普通程序可以调用了,121是在源代码里定义的它的主设备号,0是次设备号。

5、cat

/dev/key_test

这是相当于open这个设备了,或者写一个程序直接调用open、write等函数。

fd=("/dev/key_test",ORW)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8359413.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-15
下一篇 2023-04-15

发表评论

登录后才能评论

评论列表(0条)

保存