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


  

   一个Linux内核源码,其中包含了很多驱动程序,对应不同的功能。我们在编译内核时。如果将所有的驱动程序都编译进镜像文件中时,该镜像文件会占的内存很大。然而在公司企业中通常会使内核镜像占用内存空间尽可能的小,如裁剪掉不常用的功能,保留使用的功能即可。这时就需要菜单文件来进行选择裁剪。在linux中我们常用make menuconfig来进行图形化的方式来选择功能裁剪。完成裁剪后会生成.config文件来保存选择的配置信息。
   源码树目录下一般都会有两个文件: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_KEY
	bool "qjl_key_driver"
	default y    //默认值
	help
		this is a key_dirver, user is qjl.

config QJL_LED
	bool "qjl_led_dirver"
	default n   //默认值
	help
		this is a led_dirver, user is qjl.

config QJL_LED1
	tristate "led1_driver"  //添加了编译为模块的形式。
	depends on QJL_LED   //如果QJL_LED被选上,该选项才会出现。(依赖于QJL_LED )
	help
		this 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下。

相关推荐

  1. 使用Python合并PDF文件添加定义目录及页脚

    2024-07-17 09:40:07       231 阅读
  2. Linux内核--设备驱动()网络整理

    2024-07-17 09:40:07       33 阅读
  3. 为wordpress特定分类目录下的内容添加定义字段

    2024-07-17 09:40:07       34 阅读
  4. Cesiumjs 添加定义文案

    2024-07-17 09:40:07       57 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-17 09:40:07       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-17 09:40:07       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-17 09:40:07       58 阅读
  4. Python语言-面向对象

    2024-07-17 09:40:07       69 阅读

热门阅读

  1. Linux查看进程打开文件数

    2024-07-17 09:40:07       23 阅读
  2. QThread和std::thread

    2024-07-17 09:40:07       23 阅读
  3. 什么是网络存储服务器

    2024-07-17 09:40:07       23 阅读
  4. 特殊类设计

    2024-07-17 09:40:07       26 阅读
  5. Spring MVC-11

    2024-07-17 09:40:07       23 阅读
  6. Linux 驱动开发 举例

    2024-07-17 09:40:07       17 阅读
  7. ES6及ESNext规范

    2024-07-17 09:40:07       25 阅读
  8. Mysql---基础篇

    2024-07-17 09:40:07       26 阅读
  9. 前端数据加密方式

    2024-07-17 09:40:07       24 阅读
  10. Oracle(2)Oracle数据库的主要组件有哪些?

    2024-07-17 09:40:07       22 阅读
  11. 大语言模型 API

    2024-07-17 09:40:07       23 阅读