linux驱动没活干_linux驱动 第一个驱动

首先引用一篇文章 http://blog.csdn.net/zqixiao_09/article/details/50838043

1.我先写好一个驱动hello.c

#include #includeMODULE_LICENSE("Dual BSD/GPL");/*加载模块时调用的函数*/

static int hello_init(void)

{

printk(KERN_ALERT"world\n");//KERN_ALERT 0 报告消息,表示必须立即采取措施

return 0;

}/*卸载模块时调用的函数*/

static void hello_exit(void)

{

printk(KERN_ALERT"goodbye\n");

}/*注册模块入口和出口*/module_init(hello_init);

module_exit(hello_exit);

MODULE_AUTHOR("ZQH");

MODULE_DESCRIPTION("a simple module");

MODULE_ALIAS("first module");

2.编写Makefile

ifneq ($(KERNELRELEASE),)

obj-m:=hello.oelseKDIR := /lib/modules/$(shell uname -r)/build

PWD:=$(shell pwd)

all:make -C $(KDIR) M=$(PWD) modules

clean:rm -f *.ko *.o *.symvers *.cmd *.cmd.o

endif

(1)KERNELRELEASE           在linux内核源代码中的顶层makefile中有定义

(2)shell pwd                             取得当前工作路径

(3)shell uname -r                    取得当前内核的版本号

(4)KDIR                                     当前内核的源代码目录。

make 的的执行步骤

a -- 第一次进来的时候,宏“KERNELRELEASE”未定义,因此进入 else;

b -- 记录内核路径,记录当前路径;

由于make 后面没有目标,所以make会在Makefile中的第一个不是以.开头的目标作为默认的目标执行。默认执行all这个规则

c -- make -C $(KDIR) M=$(PWD) modules

-C 进入到内核的目录执行Makefile ,在执行的时候KERNELRELEASE就会被赋值,M=$(PWD)表示返回当前目录,再次执行makefile,modules 编译成模块的意思

所以这里实际运行的是

make -C /lib/modules/2.6.13-study/build M=/home/fs/code/1/module/hello/ modules

d -- 再次执行该makefile,KERNELRELEASE就有值了,就会执行obj-m:=hello.o

obj-m:表示把hello.o 和其他的目标文件链接成hello.ko模块文件,编译的时候还要先把hello.c编译成hello.o文件

可以看出make在这里一共调用了3次

3.编译

zqh@linux:~/Desktop/hello$ make

make -C /lib/modules/4.13.0-36-generic/build M=/home/zqh/Desktop/hello modulesmake[1]: Entering directory '/usr/src/linux-headers-4.13.0-36-generic'CC [M]/home/zqh/Desktop/hello/hello.o/home/zqh/Desktop/hello/hello.c:4:12: warning: ‘hello_init’ defined but not used [-Wunused-function]

staticinthello_init(void)^

/home/zqh/Desktop/hello/hello.c:10:13: warning: ‘hello_exit’ defined but not used [-Wunused-function]

static void hello_exit(void)^Building modules, stage2.

MODPOST1modules

CC/home/zqh/Desktop/hello/hello.mod.o

LD [M]/home/zqh/Desktop/hello/hello.komake[1]: Leaving directory '/usr/src/linux-headers-4.13.0-36-generic'

4.加载模块 卸载模块

zqh@linux:~/Desktop/hello$ suroot@linux:/home/zqh/Desktop/hello# insmodhello.ko

root@linux:/home/zqh/Desktop/hello# rmmod hello

root@linux:/home/zqh/Desktop/hello# dmesg | tail[396.867685] pcieport 0000:00:1c.0: BAR 15: assigned [mem 0xf2400000-0xf25fffff64bit pref]

[396.867702] pcieport 0000:00:1c.1: BAR 15: assigned [mem 0xf2600000-0xf27fffff64bit pref]

[396.867708] pcieport 0000:00:1c.0: BAR 13: assigned [io 0x2000-0x2fff]

[396.867713] pcieport 0000:00:1c.1: BAR 13: assigned [io 0x3000-0x3fff]

[2964.543768] hello: loading out-of-tree module taints kernel.

[2964.543814] hello: module verification failed: signature and/or required key missing -tainting kernel

[3980.513820] world

[4000.782155] goodbye

5.交叉编译到嵌入式开发板

#General Purpose Makefile forcross compile Linux Kernel module

ifneq ($(KERNELRELEASE),)

obj-m := hello.o #+=是连接字符串elseARCH :=arm

CROSS_COMPILE := arm-linux-gnueabihf-KERN_DIR := /home/zqh/lichee/linux-zero-4.14.y #选择内核路径

PWD :=$(shell pwd) #当前路径

all:make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KERN_DIR) M=$(PWD) modules

clean:make -C $(KERN_DIR) M=$(shell pwd) modules cleanrm -rf modules.order

endif

类似这个makefile的配置即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值