文章目录
- 1.Makefile文件
- 2.解析Makefile
-
- 2.1 Makefile 条件判断
- 2.2 obj-m obj-y
- 2.3 Linux uname 命令
- 2.4 make -C ( K D I R ) M = (KDIR) M= (KDIR)M=(PWD)
- 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= (KDIR)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