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

这篇具有很好参考价值的文章主要介绍了linux内核开发第5讲:字符设备驱动的Makefile和驱动的插入和卸载。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

到了这里,关于linux内核开发第5讲:字符设备驱动的Makefile和驱动的插入和卸载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 字符设备驱动(内核态用户态内存交互)

    内核驱动:运行在内核态的动态模块,遵循内核模块框架接口,更倾向于插件。 应用程序:运行在用户态的进程。 应用程序与内核驱动交互通过既定接口,内核态和用户态访问依然遵循内核既定接口。 系统:openEuler-20.03-LTS-SP3 char_module.c Makefile 驱动构建 驱动信息确认 应用程

    2024年02月11日
    浏览(44)
  • Linux设备驱动开发学习笔记(等待队列,锁,字符驱动程序,设备树,i2C...)

    container_of函数可以通过结构体的成员变量检索出整个结构体 函数原型: 内核开发者只实现了循环双链表,因为这个结构能够实现FIFO和LIFO,并且内核开发者要保持最少代码。 为了支持链表,代码中要添加的头文件是linux/list.h。内核中链表实现核心部分的数据结构 是struct li

    2024年01月22日
    浏览(55)
  • 【嵌入式Linux内核驱动】04_Jetson nano GPIO应用 | 驱动开发 | 官方gpiolib、设备树与chip_driver

    0.暴露给应用层 应用 解决调试目录为空的问题 调试信息 1.最简读写文件(在/SYS下) 设备树 验证测试 编译文件 驱动 of_get_named_gpio_flags //获取设备树节点的属性 gpio_is_valid //判断是否合法 devm_gpio_request //申请使用gpio,并调用设置pinctrl device_create_file //根据设备树节点属性,创建

    2024年02月07日
    浏览(61)
  • 驱动开发--字符驱动设备2

    字符设备驱动 1.定义 以字节流的形式进行访问,且只能顺序访问的设备,针对字符设备编写的驱动叫做字符设备驱动 2.字符设备框架 用户空间通过IO函数如open、read、write、close等函数接口,调用内核空间中的字符设备驱动函数中的用户自定义的open、read、write、close等函数,通

    2024年02月15日
    浏览(43)
  • 字符设备驱动开发

    1、字符设备驱动简介 字符设备是 Linux 驱动中最基本的一类设备驱动, 字符设备就是一个一个字节,按照字节 流进行读写操作的设备,读写数据是分先后顺序的。 比如我们最常见的点灯、按键、IIC、SPI, LCD 等等都是字符设备,这些设备的驱动就叫做字符设备驱动。 先来简

    2024年02月10日
    浏览(37)
  • 嵌入式Linux(8):字符设备驱动--注册字符类设备

    杂项设备 注册杂项设备: 注销杂项设备: 字符类设备 文件:include/linux/cdev.h 步骤流程: 定义一个cdev结构体。 使用cdev_init函数初始化cdev结构体成员变量。 参数: 第一个:要初始化的cdev结构体 第二个:文件操作集: cdev-ops = fops;//实际就是把文件操作集写ops 使用cdev_add函数

    2023年04月22日
    浏览(51)
  • Linux 驱动学习笔记 ——(1)字符设备驱动

    《【正点原子】I.MX6U嵌入式Linux驱动开发指南》学习笔记 字符设备是 Linux 驱动中最基本的一类设备驱动,字节设备就是按照字节流来读写的设备,常见的字符设备包括:LED、蜂鸣器、按键、I2C 以及 SPI 等。 Linux 中一切皆文件,字符设备驱动加载成功后会在 /dev 目录下生成相

    2024年02月08日
    浏览(55)
  • Linux设备驱动——第三章字符驱动

    当对幸福的憧憬过于急切,那痛苦就在人的心灵深处升起。——加缪 本章的目的是编写一个完整的字符设备驱动。我们开发一个字符驱动是因为这一类适合大部分简单的硬件设备。字符驱动也比块驱动易于理解。本章的最终目的是编写一个模块化的字符驱动,但是我们不会在

    2024年02月08日
    浏览(83)
  • 字符设备驱动开发(最初方式)

    字符设备是Linux中最基本的一类设备驱动,我们常见的点灯、按键、IIC、SPI、LCD等等都是通过字符设备驱动框架来进行开发的。字符设备驱动是通过一个一个字节流的方式来进行读写操作设备,读写数据是分先后顺序的。 通过空间划分的方式来说,Linux系统中分为用户空间和

    2024年02月17日
    浏览(42)
  • Linux 驱动之字符设备

    什么是设备号 Linux 规定每一个字符设备或者块设备都必须有一个专属的设备号。一个设备号由主设备号和次设备号组成。主设备号用来表示某一类驱动,如鼠标,键盘都可以归类到 USB 驱动中。而次设备号是用来表示这个驱动下的各个设备。比如第几个鼠标,第几个键盘等。

    2024年02月16日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包