> 文章列表 > linux内核开发第5讲:字符设备驱动的Makefile和驱动的插入和卸载

linux内核开发第5讲:字符设备驱动的Makefile和驱动的插入和卸载

linux内核开发第5讲:字符设备驱动的Makefile和驱动的插入和卸载

文章目录

  • 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