linux驱动程序的编译方法有两种,Linux驱动程序编写演示----编译驱动程序

Linux驱动程序编写演示----编译驱动程序

1驱动编写:

#include #include static int __init test_driver_init(void)

{

/* register this driver */

printk("Hello test_driver , init this driver");

return 0;

}

static void __exit test_driver_exit(void)

{

/* deregister this driver*/

printk("Good bye test_driver, exit this driver");

}

module_init(test_driver_init);

module_exit(test_driver_exit);

MODULE_LICENSE("GPL");

编译驱动程序

编译驱动程序,有两种方法,一是在代码目录下,进行单独编译;二是加入内核编译的菜单里。针对我们所写的驱动程序test_driver,分别来使用两种方法进行编译。

2、单独编译驱动文件

当内核已经稳定的运行后,以模块的方式运行驱动时,可以采用单独编译驱动的方式。

需要自己动手写Makefile文件,内容如下:

obj-m := test_driver.o    #告诉make在编译的时候,编译成模块,得到test_driver.ko

KERNELDIR := /usr/local/arm/kernel/linux-2.6.30    #把源码的路径设置好

defualt:

$(MAKE) -C $(KERNELDIR) M=$(shell pwd) modules #make不带参数时,运行这里

install:

insmod test_driver.ko

uninstall:

rmmod test_driver.ko

clean:

$(MAKE) -C $(KERNELDIR) M=$(shell pwd) clean

这个Makefile文件很简单,保存后,回到命令行,直接键入make回车,就可以编译了。编译完成,得到test_driver.ko文件,和源码是一个路径(这是用M=$(shell pwd)指定的。

错误:

make -C /usr/local/arm/kernel/linux-2.6.30  M=/home/driver_test modules

make[1]: Entering directory `/usr/local/arm/kernel/linux-2.6.30'

CC [M]  /home/driver_test/test_driver.o

In file included from include/linux/gfp.h:4,

from include/linux/kmod.h:22,

from include/linux/module.h:13,

from /home/driver_test/test_driver.c:2:

include/linux/mmzone.h:18:26: error: linux/bounds.h: No such file or directory

include/linux/mmzone.h:256:5: warning: "MAX_NR_ZONES" is not defined

In file included from include/linux/gfp.h:4,

from include/linux/kmod.h:22,

from include/linux/module.h:13,

from /home/driver_test/test_driver.c:2:

include/linux/mmzone.h:290: error: 'MAX_NR_ZONES' undeclared here (not in a function)

make[2]: *** [/home/driver_test/test_driver.o] 错误 1

make[1]: *** [_module_/home/driver_test] 错误 2

make[1]: Leaving directory `/usr/local/arm/kernel/linux-2.6.30'

make: *** [defualt] 错误 2

解决方法:

在/usr/local/arm/kernel/linux-2.6.30目录下执行

# make prepare

驱动文件与内核一起编译

1、加入到menuconfig中编译

这个方式,是编译内核时,在源码顶层目录下运行make menuconfig命令时,在菜单中可以看到我们自己的驱动程序,

这样可以采取与内核及其他驱动程序统一进行编译。采用以下几个步骤来完成:

(1)修改我们自己的Makefile文件

obj-m := test_driver.o

obj-$(CONFIG_TEST_DRIVER) +=test_driver.o

在原来的基础上,只保留上面两行内容。

(2)增加一个Kconfig文件

这个文件在我们自己的源码路径下创建,内容如下:

config TEST_DRIVER

tristate " Test Driver for Linux"

default n

help

This item is just for linux driver demo and

test linux menuconfig, do nothing

简单说明:

config是Kconfig文件语言的关键字,TEST_DRIVER是我们自己定义的变量,它的值是y,n,M三个值中的一个。我们上面缺省的语句,default n,就是默认情况下,CONFIG_TEST_DRIVER=n,前缀CONFIG_,这是系统自己加上的。

tristate是关键字,其后面是我们自己写的菜单上出现的提示。整句的含义是," Test Driver for Linux "这个选择项,是3态的,即:y,n,M。

(3)修改arch/arm下的Kconfig文件

经过前面2个步骤的修改,内核配置菜单,还是找不到我们的代码路径,还需要在架构路径下进行添加,方法是在endmenu之前,加入:source "/home/driver_test/kconfig",这样做之后,架构下arm的Kconfig就可以找到我们自己的Kconfig了。类似这样:

#this is test_driver

source "/home/driver_test/Kconfig"

(4)修改drivers/Makefile文件

Kconfig文件相当于给Makefile文件提供一个目录上路由功能,具体的编译工作,还是必须由Makefile来指定规则的。该Makefile文件上添加一句:

#this is driver_test

obj-$(CONFIG_TEST_DRIVER) +=/home/driver_test

经过上面四个步骤的修改,我们的驱动程序代码就加入了内核统一编译的菜单中去了。如图:

配置完成后,命令行运行make开始编译,之后可以在我们的源码路径下找到编译成功的test_driver.ko文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值