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.o
obj-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 ok
Message 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
文章来源地址https://www.toymoban.com/news/detail-420371.html
文章来源:https://www.toymoban.com/news/detail-420371.html
到了这里,关于linux内核开发第5讲:字符设备驱动的Makefile和驱动的插入和卸载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!