Linux设备驱动开发3-Kconfig构建系统

简介: Linux设备驱动开发3-Kconfig构建系统

内核配置脚本文件的语法也比较简单,主要包括如下几个方面。

1 配置选项

大多数内核配置选项都对应Kconfig中的一个配置选项(config),比如说下面的代码:

config MODVERSIONS
        bool "Module versioning support"
        help
            Usually, you have to use modules compiled with your kernel.
            Saying Y here makes it ...

config 关键字定义新的配置选项,之后的几行代码定义了该配置选项的属性。配置选项的属性包括类型、数据范围、输入提示、依赖关系、选择关系及帮助信息、默认值等。

  1. 类型
    配置选项都必须指定类型,类型包括bool、tristate、string、hex 和 int。其中常用的是tristate 和string是2种基本类型,其余都是基于这2种基本类型。类型定义后可以紧跟输入提示,下面两段脚本是等价的:
bool "Networking support"
bool
prompt "Networking support"
  1. 是等价的。
  2. 提示信息
prompt <prompt> [if <expr>]
  1. 其中,可选的if用来表示该提示的依赖关系。
  2. default值
default <expr> [if <expr>]
  1. 如果用户不设置对应的选项,配置选项的值就是默认值。
  2. 依赖关系
depends on(或者requires) <expr>
  1. 如果定义了多重依赖关系,它们之间用“ &&”间隔。依赖关系也可以应用到该菜单中所有的其他选项(同样接受if 表达式)内,下面两段脚本是等价的:
bool "foo" if BAR
default y if BAR
depends on BAR
bool "foo"
default y
  1. 选择关系(也称为反向依赖关系)的格式为:
select <symbol> [if <expr>]
  1. A 如果选择了B,则在A 被选中的情况下,B 自动被选中。
  2. 数据范围的格式为:
range <symbol> <symbol> [if <expr>]
  1. Kconfig 中的 expr(表达式)定义为:
<expr> ::= <symbol>
        <symbol> '=' <symbol>
        <symbol> '!=' <symbol>
        '(' <expr> ')'
        '!' <expr>
        <expr> '&&' <expr>
        <expr> '||' <expr>
  1. 看下面的示例代码:
config SHDMA_R8A73A4
depends on ARCH_R8A73A4 && SH_DMAE != n
  1. ARCH_R8A73A4 && SH_DMAE != n说明只有当ARCH_R8A73A4被选中,且SH_DMAE没有被选中的时候,才可能出现这个SHDMA_R8A73A4。
  2. 为 int 和 hex 类型的选项设置可以接受的输入值范围,用户只能输入大于等于第一个symbol,且小于等于第二个symbol 的值。
  3. help信息
help(或---help---)
    start
    ...
    end

2 菜单结构

配置选项在菜单树结构中的位置可由两种方法决定。第一种方式为:

menu "Network device support"
depends on NET
conf ig NETDEVICES
endmenu

所有处于"menu"和"endmenu"之间的配置选项都会成为"Network device support"的子菜单,而且,所有子菜单(config)选项都会继承父菜单(menu)的依赖关系,比如,Network device support对NET的依赖会被加到配置选项NETDEVICES的依赖列表中。

menu 后面跟的“ Network device support”项仅仅是1个菜单,没有对应真实的配置选项,也不具备3 种不同的状态。这是它和config 的区别。

3 Makefile

这里主要对内核源代码各级子目录中的kbuild(内核的编译系统)Makefile 进行简单介绍,这部分是内核模块或设备驱动开发者最常接触到的。

Makefile 的语法包括如下几个方面。

  1. 目标定义
    目标定义就是用来定义哪些内容要作为模块编译,哪些要编译并链接进内核。
    例如:
obj-y += foo.o
  1. 表示要由foo.c 或者foo.s 文件编译得到foo.o 并链接进内核(y表示无条件编译,所以不需要Kconfig 配置选项),而obj-m 则表示该文件要作为模块编译。obj-n 形式的目标不会被编译。
    更常见的做法是根据make menuconfig 后生成的config文件的CONFIG_前缀变量来决定文件的编译方式,如:
obj-$(CONFIG_ISDN) += isdn.o
  1. 多文件模块
    最简单的Makefile 仅需一行代码就够了。如果一个模块由多个文件组成,会稍微复杂一些,这时候应采用模块名加-y 或-objs 后缀的形式来定义模块的组成文件,如下:
#
# Makef ile for the linux ext2-f ilesystem routines.
#
obj-$(CONF iG_EXT2_FS) += ext2.o
ext2-y := balloc.o dir.o f ile.o fsync.o ialloc.o inode.o \
        ioctl.o namei.o super.o symlink.o
ext2-$(CONF iG_EXT2_FS_XATTR) += xattr.o xattr_user.o xattr_trusted.o
ext2-$(CONF iG_EXT2_FS_POSIX_ACL) += acl.o
ext2-$(CONF iG_EXT2_FS_SECURITY) += xattr_security.o
ext2-$(CONF iG_EXT2_FS_XIP) += xip.o
  1. 模块的名字为ext2,由balloc.o、dir.o、file.o 等多个目标文件最终链接生成ext2.o 直至ext2.ko 文件,并且是否包括xattr.o、acl.o 等则取决于内核配置文件的配置情况,例如,如果CONFIG_ EXT2_FS_POSIX_ACL 被选择,则编译acl.c 得到acl.o 并最终链接进ext2。
  2. 目录层次的迭代
    如下例:
obj-$(CONF iG_EXT2_FS) += ext2/
  1. 当CONFIG_EXT2_FS 的值为y 或m 时,kbuild 将会把ext2 目录列入向下迭代的目标中。
相关文章
|
24天前
|
存储 缓存 监控
Linux缓存管理:如何安全地清理系统缓存
在Linux系统中,内存管理至关重要。本文详细介绍了如何安全地清理系统缓存,特别是通过使用`/proc/sys/vm/drop_caches`接口。内容包括清理缓存的原因、步骤、注意事项和最佳实践,帮助你在必要时优化系统性能。
168 78
|
28天前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
61 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
24天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
94 13
|
24天前
|
Ubuntu Linux C++
Win10系统上直接使用linux子系统教程(仅需五步!超简单,快速上手)
本文介绍了如何在Windows 10上安装并使用Linux子系统。首先,通过应用商店安装Windows Terminal和Linux系统(如Ubuntu)。接着,在控制面板中启用“适用于Linux的Windows子系统”并重启电脑。最后,在Windows Terminal中选择安装的Linux系统即可开始使用。文中还提供了注意事项和进一步配置的链接。
40 0
|
2月前
|
Linux 网络安全 数据安全/隐私保护
Linux 超级强大的十六进制 dump 工具:XXD 命令,我教你应该如何使用!
在 Linux 系统中,xxd 命令是一个强大的十六进制 dump 工具,可以将文件或数据以十六进制和 ASCII 字符形式显示,帮助用户深入了解和分析数据。本文详细介绍了 xxd 命令的基本用法、高级功能及实际应用案例,包括查看文件内容、指定输出格式、写入文件、数据比较、数据提取、数据转换和数据加密解密等。通过掌握这些技巧,用户可以更高效地处理各种数据问题。
169 8
|
2月前
|
监控 Linux
如何检查 Linux 内存使用量是否耗尽?这 5 个命令堪称绝了!
本文介绍了在Linux系统中检查内存使用情况的5个常用命令:`free`、`top`、`vmstat`、`pidstat` 和 `/proc/meminfo` 文件,帮助用户准确监控内存状态,确保系统稳定运行。
695 6
|
2月前
|
Linux
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
119 3
|
2月前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
96 2
|
1月前
|
Linux Shell
Linux 10 个“who”命令示例
Linux 10 个“who”命令示例
62 14
Linux 10 个“who”命令示例
|
15天前
|
Linux
linux查看目录下的文件夹命令,find查找某个目录,但是不包括这个目录本身?
通过本文的介绍,您应该对如何在 Linux 系统中查看目录下的文件夹以及使用 `find` 命令查找特定目录内容并排除该目录本身有了清晰的理解。掌握这些命令和技巧,可以大大提高日常文件管理和查找操作的效率。 在实际应用中,灵活使用这些命令和参数,可以帮助您快速定位和管理文件和目录,满足各种复杂的文件系统操作需求。
42 8