Linux内核编程(八) 添加自定义目录驱动菜单 (Kconfig文件使用)

本文目录

  • 一、Linux 内核驱动目录
  • 二、自定义驱动的Kconfig编写
    • ●示例:在 drivers 菜单添加一个自己驱动的子菜单。
  • 三、自写驱动的Makefile编写
  • 四、总结

  

   一个Linux内核源码,其中包含了很多驱动程序,对应不同的功能。我们在编译内核时。如果将所有的驱动程序都编译进镜像文件中时,该镜像文件会占的内存很大。然而在公司企业中通常会使内核镜像占用内存空间尽可能的小,如裁剪掉不常用的功能,保留使用的功能即可。这时就需要菜单文件来进行选择裁剪。在linux中我们常用make menuconfig来进行图形化的方式来选择功能裁剪。完成裁剪后会生成.config文件来保存选择的配置信息。对于64位的arm架构,可以使用make menuconfig ARCH=arm64,32位的arm使用make menuconfig ARCH=arm
   源码树目录下一般都会有两个文件:Kconfig 和 Makefile。分布在各目录下的 Kconfig 构成了一个分布式的内核配置数据库,每个 Kconfig 分别描述了所属目录源文件相关的内核配置菜单。在内核配置 make menuconfig(或 xconfig 等)时,从 Kconfig 中读出配置菜单,用户配置完后保存到 .config (在顶层目录下生成) 中。 在内核编译时,主 Makefile 调用这个 .config ,就知道了用户对内核的配置情况。

在这里插入图片描述

一、Linux 内核驱动目录

   对于一个内核驱动程序,通常我们使用文件目录的形式在区分各个驱动程序。即不同的驱动程序对应不同的文件目录。定义目录位置:在内核源码的dirvers目录下。
  在dirvers目录下,包含Kconfig、Makefile、各类驱动程序目录。Kconfig 分别描述了所属目录源文件相关的内核配置菜单。 Makefile 为管理工程代码文件,决定哪些文件被编译,如何被编译,如何链接。每个驱动程序目录又包含其c文件、Kconfig、以及Makefile文件。
在这里插入图片描述
在这里插入图片描述

drivers目录下的Kconfig内容如下,这里包含了其目录下的各个驱动程序目录里的Kconfig文件。用于配置菜单。

在这里插入图片描述

二、自定义驱动的Kconfig编写

   Kconfig 就是对应着内核的配置菜单。假如要想添加新的驱动到内核的源码中,可以通过修改 Kconfig 来增加对我们驱动的配置菜单,这样就有途径选择我们的驱动,假如想使这个驱动被编译,还要修改该驱动所在目录下的 Makefile。因此,一般添加新的驱动时需要修改的文件有两种(注意不只是两个):Kconfig、Makefile。要想知道怎么修改这两种文件,就要知道两种文档的语法结构。

   一般一个 Kconfig 文件表示的就是一个菜单,一个菜单由多个菜单项组成,其格式如下:

menu "Device Drivers"//具体的子项菜单
config 自定义宏名1类型 "选项描述(菜单里显示的内容,提示字符串,用给人看的)"default n  //默认状态help帮助信息..........config 自定义宏名2类型 "选项描述(菜单里显示的内容,提示字符串,用给人看的)"default y  //默认状态help帮助信息..........endmenu

在这里插入图片描述

●示例:在 drivers 菜单添加一个自己驱动的子菜单。

(1)在drivers目录下新建自己驱动的文件夹:mkdir qjl

(2)进入自己驱动的文件夹,创建Kconfig文件。
在这里插入图片描述

(3)编写Kconfig文件。

menu "QJL_dirver"config QJL_KEYbool "qjl_key_driver"default y    //默认值helpthis is a key_dirver, user is qjl.config QJL_LEDbool "qjl_led_dirver"default n   //默认值helpthis is a led_dirver, user is qjl.config QJL_LED1tristate "led1_driver"  //添加了编译为模块的形式。depends on QJL_LED   //如果QJL_LED被选上,该选项才会出现。(依赖于QJL_LED )helpthis is a led1_dirver, user is qjl.endmenu

(4)在dirver目录下的Kconfig添加自定义子菜单的Kconfig路径。
在这里插入图片描述

(5)在源码主Makefile下配置菜单。使用:make meunconfig配置,配置完成后保存退出,生成.config配置文件。
在这里插入图片描述

(6)查看.config配置文件内容。

注意:y为编译进内核、n为不编译进内核、m为编译为模块。
在这里插入图片描述

三、自写驱动的Makefile编写

   章节二中我们已经配置好哪些驱动编译进内核,哪些驱动编译为模块。本章的Makefile 使用 .config 文件的宏来裁剪 C 代码,决定哪些 C 代码被编译。我们使用.config文件中的宏定义来编写Makefile文件,这里obj-y表示编译进内核,obj-m表示编译为模块。

目录如下:
在这里插入图片描述

该目录的Makefile内容如下:

obj-$(CONFIG_QJL_KEY)     +=key_dirver.o
obj-$(CONFIG_QJL_LED1)    +=led1_dirver.o

●重要:编写完成子目录下的Makefile后,需要在dirver目录下的Makefile中添加子目录路径。这样做的目的是为了在编译时会找到子目录中的Makefile文件,从而使用顶层Makefile进行编译。
在这里插入图片描述

四、总结

本文学习了如何添加自定义驱动菜单,步骤如下:

  1. 在dirver目录下新建自己的驱动文件夹,该文件夹包含Kconfig、Makefile以及自己的驱动程序文件。
  2. 编写Kconfig和Makefile文件。按如上内容编写。
  3. 将自己目录下的Kconfig文件路径添加至上层目录的Kconfig下。
  4. 将自己目录路径添加至上层目录的Makefile下。
  5. 在源码顶层Makefile目录下,使用make menuconfig ARCH=arm64进行配置的选择,最后保存并生成.config文件。
  6. 使用make进行源码编译。如果编译64位的arm芯片,则使用make ARCH=arm64,32位使用make ARCH=arm

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/872788.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式:真正的建造者模式

又臭又长的set方法 经常进行Java项目开发使用各类starter的你一定见过这种代码: public class SwaggerConfig {Beanpublic Docket api() {return new Docket(DocumentationType.SWAGGER_2).select().apis(RequestHandlerSelectors.any()).paths(PathSelectors.any…

【BUG】已解决:ModuleNotFoundError: No module named ‘cv2’

已解决:ModuleNotFoundError: No module named ‘cv2’ 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身,就职于医疗科技公司,热衷分享知识,武汉城市开…

【Pyhton】Pip换源(Windows)

在Python中使用pip换源的方法可以通过修改pip配置文件来实现。具体步骤如下: 暂时修改(只应用于本次下载) pip install 库名 -i 国内源链接/simple --trusted-host 国内源链接 常见的国内源链接见下方永久修改中的内容。 示例&#xff1a…

【ffmpeg命令入门】ffmpeg转码过程

文章目录 前言转码图示过程含义总结 前言 在数字媒体处理领域,ffmpeg 是一款非常强大的工具,它支持多种音视频格式,可以进行转码、剪辑、滤镜等操作。ffmpeg 的强大功能和灵活性使其成为了音视频处理的首选工具。然而,由于其功能…

python-Web

FLASK整体框架: from flask import Flask,render_templateapp Flask(__name__)app.route("/show/info")#网址 def index():#网址对应的函数return render_template("index.html")#falsk 支持将字符串写入文件if __name____main__:app.run()#访问网站的时…

Java中的压缩与解压缩操作详解

Java中的压缩与解压缩操作详解 在Java编程中,处理压缩和解压缩文件是一个常见的需求。Java提供了多种方式来实现这些操作,包括使用标准的Java类库和第三方库。 本文将介绍如何使用Java进行压缩和解压缩操作,涵盖基本的压缩文件格式如ZIP以及…

获取JVM虚拟机的内存和CPU核心数

获取内存和核心数量 Runtime runtime Runtime.getRuntime();long freeMemory runtime.freeMemory();long maxMemory runtime.maxMemory();long totalMemory runtime.totalMemory();int availableProcessors runtime.availableProcessors();System.out.println("空闲内…

基于 Web 的家校联系系统的设计与实现

目录 基于 Web 的家校联系系统的设计与实现 一、绪论 (一)研究背景 (二) 研究目的 (三) 研究意义 二、需求分析 (一) 功能需求 (二) 性能需求 &#…

Android中Context概述

目录 一 概念二 使用三 注意事项 一 概念 Context,上下文,可以获取应用的资源和信息。Context在加载资源、启动Activity、获取系统服务、创建View等操作都要参与。它提供了关于应用环境全局信息的接口。它是一个抽象类,它的执行被Android系统…

WPF TreeView 全选/反选/子级选中父级也选中

// TreeView 全选/反选/子级选中父级也选中CSDN 下载链接 <TreeView Grid.Column"0" Grid.Row"1" Grid.ColumnSpan"2" Name"menuTree" Width"240" ItemsSource"{Binding MenuList}" BorderThickness"0&q…

开发一个自己的chrom插件

开发一个自己的chrom插件 一、创建一个文件夹 二、配置文件manifest.json 创建名字为&#xff1a;manifest.json的配置文件&#xff0c;模板如下&#xff1a; {"manifest_version": 3,"name": "Hello World Extension","version": …

AV1 编码标准屏幕内容编码技术概述

AV1 屏幕内容编码 为了提高屏幕捕获内容的压缩性能&#xff0c;AV1采用了几种编码工具&#xff0c;例如用于处理屏幕画面中重复模式的内帧内块复制&#xff08;IntraBC&#xff09;&#xff0c;以及用于处理颜色数量有限的屏幕块的调色板模式。 帧内块拷贝 AV1 编码中的 Intra …

【Elasticsearch7.11】reindex问题

参考博文链接 问题&#xff1a;reindex 时出现如下问题 原因&#xff1a;数据量大&#xff0c;kibana的问题 解决方法&#xff1a; 将DSL命令转化成CURL命令在服务上执行 CURL命令 自动转化 curl -XPOST "http://IP:PORT/_reindex" -H Content-Type: application…

Python: 一些python和Java不同的基础语法

文章目录 1. 数据类型2. 字符串的引用3. 字符串拼接4. Python中的报错5. Python中的输入语句(input)6. 运算符(**和//)7. 除法运算8. 注释方法: #或者三引号9. Python中的比较10. Java中用and, or, not代替逻辑运算符11. 多元赋值12. Python不支持自增自减操作13. 在Python中, …

zookeeper基础知识学习

官网&#xff1a;Apache ZooKeeper 下载地址&#xff1a;Index of /dist/zookeeper/zookeeper-3.5.7Index of /dist/zookeeperIndex of /dist/zookeeper/zookeeper-3.5.7 ZK配置参数说明&#xff1a; 1、tickTime2000&#xff1a;通讯心跳时间&#xff0c;zookeeper服务器与客…

笑中带泪《抓娃娃》

【标题】笑中带泪&#xff0c;《抓娃娃》&#xff1a;一场关于成长的中式惊悚喜剧盛宴在这个夏日炎炎的季节里&#xff0c;一部名为《抓娃娃》的电影悄然上映&#xff0c;以沈腾与马丽的黄金搭档再次点燃观众的热情。然而&#xff0c;当笑声在影院回荡时&#xff0c;一股不易察…

搭建图片缓存服务器,解决图片访问403 Forbidden问题

在现代Web开发中&#xff0c;图片是网站和应用的重要组成部分。然而&#xff0c;有时我们在访问某些图片时会遇到403 Forbidden错误&#xff0c;尤其是自己的应用访问互联网上的三方的图片时&#xff0c;这通常是由于别人的服务器设置了访问限制。本文将介绍如何通过搭建一个图…

7月15日学习打卡,二叉搜索树和字符串操作

hello大家好呀&#xff0c;本博客目的在于记录暑假学习打卡&#xff0c;后续会整理成一个专栏&#xff0c;主要打算在暑假学习完数据结构&#xff0c;因此会发一些相关的数据结构实现的博客和一些刷的题&#xff0c;个人学习使用&#xff0c;也希望大家多多支持&#xff0c;有不…

C#学习

C#学习 1.B站丑萌气质狗C#的循环-判断泛型错误处理面向对象static的使用定义showInfo类和Hero类 在这里插入图片描述 然后在该解决方案add新建一个类库&#xff0c;点击rebuild&#xff0c;会在bin文件夹下生成.dll文件 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direc…

数据类型与运算符

一、进制 1.1 进制的区分 1.2进制的换算 只要掌握计算器的方式即可。人工计算的方式了解一下就行了。 二、计算机数据的存储原理 2.1 存储单位 最小的单位&#xff1a;比特位 bit 1位比特要么为0&#xff0c;要么为1 最基本的单位&#xff1a;字节 …