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

news/2024/5/23 12:29:31/

文章目录

  • 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= (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

http://www.ppmy.cn/news/47675.html

相关文章

TensorFlow 卷积神经网络实用指南:1~5

原文:Hands-On Convolutional Neural Networks with TensorFlow 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 不要担心自己的形象&am…

迅为RK3588核心板平台新增工业级方案

迅为基于瑞芯微RK3588平台,提供商业级、工业级和国产化核心板,工业级板卡温度可达-40度到85度,国产化板卡从内存,存储等每一个元器件全部采用国产物料。不同板卡,满足各个行业需求。 iTOP-3588核心板参数 CPU &#x…

App 抓包提示网络异常怎么破?

背景 当你测试App的时候,想要通过Fiddler/Charles等工具抓包看下https请求的数据情况,发现大部分的App都提示网络异常/无数据等等信息。以“贝壳找房”为例: Fiddler中看到的请求是这样的: 你可能开始找证书的问题:是…

Python项目之中国数据可视化

文章目录 关键词一、做什么二、怎么做1、获取数据&&处理数据2、数据库设计&&存储数据3、开发后端接口4、前端页面编写 三、效果展示四、总结 关键词 PythonDjangoPython网络爬虫echarts可视化阅读者(Python基础、Django基础、H5基础) …

vue3插槽的使用

插槽就是子组件中的提供给父组件使用的一个占位符&#xff0c;用 表示&#xff0c;父组件可以在这个占位符中填充任何模板代码&#xff0c;如 HTML、组件等&#xff0c;填充的内容会替换子组件的标签。 1.插槽基本使用 子组件SlotComponent.vue <template><div cla…

【计算机专业应届生先找培训还是先找个工作过渡一下?】

计算机专业应届生先找培训还是先找个工作过渡一下&#xff1f; 计算机应届生是先培训还是先工作&#xff0c;这个问题应该困扰了很多专业技能一般的同学&#xff0c;尤其是学历方面还没有优势的普通本专科院校。都说技术与学历优秀的人进大厂&#xff0c;技术一般学历优秀的人能…

树莓派 QT项目开机自启动

我自己用qt设置了一个界面&#xff0c;如何让他开机自启动呢&#xff1f; 目录 1.生成qt项目的可执行文件 2. 编写一个自启动脚本 3.重启树莓派 1.生成qt项目的可执行文件 QT项目的可执行文件就是.exe文件。首先在qt中打开&#xff0c;点击红色方框图标&#xff0c;选择Re…

IO进程间的通信详解(嵌入式学习)

进程间通信 这次更新内容比较干巴&#xff0c;满满嚼&#xff0c;把例子敲一遍好好理解。如果您着急&#xff0c;请直接打开目录跳转到对您有价值的部分管道无名管道(PIPE)特点使用方法举个栗子 有名管道(FIFO)特点使用方法举个栗子 信号概念响应方式信号函数举个栗子&#xff…

冯诺依曼体系结构+操作系统

目录 冯诺依曼体系结构 基本概念 基本原理 操作系统 基本概念 设计OS的目的 管理的本质 管理的方法 系统调用和库函数 冯诺依曼体系结构 基本概念 冯诺依曼结构也称普林斯顿结构&#xff0c;是一种将程序指令存储器和数据存储器合并在一起的存储器结构。 ... 数学…

24个强大的HTML属性,建议每位前端工程师都应该掌握!

HTML属性非常多&#xff0c;除了一些基础属性外&#xff0c;还有许多有用的特别强大的属性 本文将介绍24个强大的HTML属性&#xff0c;可以使您的网站更具有动态性和交互性&#xff0c;让用户感到更加舒适和愉悦。 让我们一起来探索这24个强大的HTML属性吧&#xff01; 1、Acc…

js+css实现简单的弹框动画

效果图 只是一个简单的演示demo&#xff0c;但是可以后面可以优化样式啥的 刚开始元素的display为none&#xff0c;然后&#xff0c;为了给元素展示时添加一个动画&#xff0c;首先要添加样式类名show&#xff0c;让它覆盖display:none&#xff0c;变得可见。然后&#xff0c;添…

docker+jenkins+maven+git构建聚合项目,实现自动化部署,走了800个坑

流程 主要的逻辑就是Docker上安装jenkins&#xff0c;然后拉取git上的代码&#xff0c;把git上的代码用Maven打包成jar包&#xff0c;然后在docker运行 这个流程上的难点 一个是聚合项目有可能Maven install的时候失败。 解决办法&#xff1a;在基础模块的pom文件上添加 <…

【数据结构】堆的应用(堆排序的实现 + (向上/向下)建堆时间复杂度证明 + TopK问题(笔记总结))

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;数据结构 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&…

Flink Table API 和 Flink-SQL使用详解

Flink Table API 和 Flink-SQL使用详解 1.Table API & Flink SQL-核心概念 ​ Apache Flink 有两种关系型 API 来做流批统一处理&#xff1a; Table API Table API 是用于 Scala 和 Java 语言的查询API&#xff0c;它可以用一种非常直观的方式来组合使用选取、过滤、join…

RK3568平台开发系列讲解(调试篇)IS_ERR函数的使用

🚀返回专栏总目录 文章目录 一、IS_ERR函数用法二、IS_ERR函数三、内核错误码沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍 IS_ERR 函数的使用。 一、IS_ERR函数用法 先看下用法: 二、IS_ERR函数 对于任何一个指针来说,必然存在三种情况: 一种是合…

电源常识-PCB材质防火等级焊锡工艺

1、目前主流的PCB材质分类主要有以下几种,如图1&#xff0c;图2&#xff0c;图3。FR-4材质比CEM-1好&#xff0c;CEM-1比FR-1好。 按结构分为单面板&#xff0c;双面板&#xff0c;多层板。单面板就是单面铺铜走线&#xff0c;双面板就是上下两面都可以铺铜走线&#xff0c;多层…

Guns社区医疗项目

又是一年毕业季&#xff0c;计算机专业大四的同学们要接受毕业设计的考验啦。又有多少同学为了毕业设计而愁眉苦脸&#xff0c;心力憔悴。考虑到这些&#xff0c;这里为同学们分享一个适合你们毕业设计的作品以及详细介绍&#xff0c;让正在焦头烂额的同学们有所启发&#xff0…

asp.net+C#房地产销售系统文献综述和开题报告+Lw

本系统使用了B/S模式&#xff0c;使用ASP.NET语言和SQL Server来设计开发的。首先把所有人分为了用户和管理员2个部分&#xff0c;一般的用户可以对系统的前台进行访问&#xff0c;对一般的信息进行查看&#xff0c;而注册用户就可以通过登录来完成对房屋信息的查看和对房屋的…

开发插件JFormDesigner(可视化GUI编程)的使用与注册-简单几步即可完成

开发插件JFormDesigner&#xff08;可视化GUI编程&#xff09;的使用与注册 获取链接&#xff1a;1.JFormDesigner获取2.记录插件下载路径3.使用zcj注册4.生成license5.打开idea进行注册 获取链接&#xff1a; https://pan.baidu.com/s/1N9ua2p3BpiMIARCEewRxIw?pwd4e9a 提取…

浅说情绪控制被杏仁体劫持

2023年4月16号&#xff0c;没想到被杏仁体劫持那么严重&#xff0c;触发手抖和口干的症状&#xff0c;这个还真是自己完全没有意识到的【这就是焦虑固化的记忆会持续化】。 【修行】人生要修炼两条线&#xff1a;一条明线是做的事情&#xff0c;那是自己要做的具体事情。 一条…