文章目录 1.Makefile文件 2.解析Makefile 3.操作实践 3.1 make参数 3.2 执行make 3.3 清理内核日志 3.4 加载驱动 3.5 查看驱动 3.6 卸载驱动
1.Makefile文件
ifneq ( $( KERNELRELEASE) ,)
obj-m := helloDev.o
else
PWD := $( shell pwd )
$( info "$( PWD ) " )
KDIR := /lib/modules/$( shell uname -r) /build
$( info "$( KDIR) " )
all:make -C $( KDIR) M = $( PWD )
clean:rm -rf *.o *.ko *.mod.c *.symvers
endif
执行结果:
zhaoxr@zhaoxr- ThinkPad- E450: ~ / xiangrui. zhao/ linux_kernel$ make
"/home/zhaoxr/xiangrui.zhao/linux_kernel"
"/lib/modules/5.15.0-67-generic/build"
make - C / lib/ modules/ 5.15 .0 - 67 - generic/ build M= / home/ zhaoxr/ xiangrui. zhao/ linux_kernel
make[ 1 ] : 进入目录“/ usr/ src/ linux- headers- 5.15 .0 - 67 - generic”
make[ 1 ] : 离开目录“/ usr/ src/ linux- headers- 5.15 .0 - 67 - generic”
2.解析Makefile
2.1 Makefile 条件判断
ifeq 关键字
ifeq关键字用来判断两个参数是够相等,相等时条件成立为true,
不相等为false。ifeq一般和变量结合使用:
mode = debug
hello: hello.c
ifeq ( $( mode) ,debug) @echo "debug mode" gcc -g -o hello hello.c
else @echo "release mode" gcc -o hello hello.c
endif
ifneq 关键字
ifneq 关键字和ifeq关键字恰恰相反,用来判断参数是否不相等。
当比较的参数不相等时,条件语句才成立,值为true,否则为false。
mode = debug
hello: hello.c
ifneq ( $( mode) ,) @echo "debug mode" gcc -g -o hello hello.c
else @echo "release mode" gcc -o hello hello.c
endif
ifdef 关键字
ifdef 关键字用来判断一个变量是否已经定义。
如果变量的值非空(在Makefile中,没有定义的变量的值为空),表达式为真。
mode =
hello: hello.c
ifdef mode@echo "debug mode" gcc -g -o hello hello.c
else @echo "release mode" gcc -o hello hello.c
endif
2.2 obj-m obj-y
在进行模块编译时,主要有两个选项,obj-m和obj-y,
而与内核密切相关的是obj-y选项,下面对两者之间的区别简单总结一下。以test.c文件为例:obj-m += test.oobj-y += test.o其中:obj-m表示把文件test.o作为"模块"进行编译,不会编译到内核,但是会生成一个独立的 "test.ko" 文件;obj-y表示把test.o文件编译进内核;
2.3 Linux uname 命令
语法:
uname [ -amnrsv] [ --help] [ --version]
参数说明:
-a 或--all 显示全部的信息,包括内核名称、主机名、操作系统版本、处理器类型和硬件架构等。。
-m 或--machine 显示处理器类型。
-n 或--nodename 显示主机名。
-r 或--release 显示内核版本号。
-s 或--sysname 显示操作系统名称。
-v 显示操作系统的版本。
--help 显示帮助。
--version 显示版本信息。
-p 显示处理器类型(与 -m 选项相同)。
2.4 make -C ( K D I R ) M = (KDIR) M= ( KD I R ) M = (PWD)
make -C $(KDIR)
表示进入到$(KDIR)目录中,也就是内核目录中,
并执行这个目录下面的makefile,
内核makefile中定义了这个变量KERNELRELEASE,
执行完之后又回到当前目录执行再次执行,
就会进入obj-m := helloDev.o
这句话是给内核的编译系统识别的
内核的编译系统会收集obj-m所有的binary文件
将它们编译成驱动
3.操作实践
3.1 make参数
man make
查看make命令的官方手册
3.2 执行make
生成helloDev.ko
3.3 清理内核日志
dmesg -C
3.4 加载驱动
zhaoxr@zhaoxr-ThinkPad-E450:~/xiangrui.zhao/linux_kernel$
Message from syslogd@zhaoxr-ThinkPad-E450 at Apr 20 23 :41:21 .. .kernel:[ 1321187.809409 ] register_chrdev_region okMessage from syslogd@zhaoxr-ThinkPad-E450 at Apr 20 23 :41:21 .. .kernel:[ 1321187.809414 ] hello driver init
3.5 查看驱动
zhaoxr@zhaoxr-ThinkPad-E450:~/xiangrui.zhao/linux_kernel$ lsmod
Module Size Used by
helloDev 16384 0
btrfs 1536000 0
blake2b_generic 20480 0
3.6 卸载驱动
zhaoxr@zhaoxr-ThinkPad-E450:~/xiangrui.zhao/linux_kernel$ sudo rmmod helloDev