首页 > 系统相关 >openwrt软件包 2: linux 内核软件包 in openwrt

openwrt软件包 2: linux 内核软件包 in openwrt

时间:2024-11-06 18:16:22浏览次数:3  
标签:Kconfig 软件包 Makefile 内核 linux hinic openwrt

上篇介绍了基础的Makefile使用和如何加载到镜像中, 此篇来介绍一下内核的软件包
openwrt软件包 1

内核软件包

首先第一个问题就是: 为什么区分了openwrt软件包和内核软件包?

其实这就是openwrt这个系统的一个问题, 它把整个系统分成了用户态和内核态, 内核态有更高的操作权限, 以及访问各种硬件设备等的权限, 而用户态则有所限制.

体现到代码中, 内核态和用户态也有完全不同的库函数, 这就导致了你运行在内核的软件包不是说改个makefile就可以放到用户态运行了, 最简单的例子, 打印函数在用户态和内核态就完全不同:

//用户态, openwrt软件包
printf("hello, world!\n");

//内核态, kernel软件包
printk("hello, world!\n");

所以这就区分了内核软件包和openwrt软件包了.

向内核加入软件包我把他分为两种方法, 一个是在openwrt的package下添加, 另一个则是直接向linux代码中加入. 二者的区分就是上层对于这个软件包的管理不相同, 具体后面会提到. 本篇先介绍在linux代码中加入内核软件包的方法

文件结构

内核软件包的结构和openwrt软件包的结构类似, 下面是我在linux和openwrt下面找到的一些软件包结构:

linux下内核软件包

linux-5.15.134/drivers/net/ethernet$ tree huawei/
huawei/
├── hinic
│   ├── hinic_common.c
│   ├── hinic_common.h
...
│   ├── Kconfig
│   └── Makefile
├── Kconfig
└── Makefile

linux-5.15.134/drivers/net/ethernet$ realtek/
realtek/
├── 8139cp.c
├── 8139too.c
├── atp.c
├── atp.h
├── Kconfig
├── Makefile
├── r8169_firmware.c
├── r8169_firmware.h
├── r8169.h
├── r8169_main.c
└── r8169_phy_config.c

openwrt下内核软件包

openwrt/package/kernel$ tree gpio-button-hotplug/
gpio-button-hotplug/
├── Makefile
└── src
    ├── gpio-button-hotplug.c
    └── Makefile

从前两个示例可以看出来, 其实放在linux目录的软件包就是比在openwrt下的软件包多了一个Kconfig的文件, 我们先从差异部分入手

Kconfig

我们展开一个Kconfig文件:

# SPDX-License-Identifier: GPL-2.0-only
#
# Huawei driver configuration
#

config NET_VENDOR_HUAWEI
	bool "Huawei devices"
	default y
	help
	  If you have a network (Ethernet) card belonging to this class, say Y.
	  Note that the answer to this question doesn't directly affect the
	  kernel: saying N will just cause the configurator to skip all
	  the questions about Huawei cards. If you say Y, you will be asked
	  for your specific card in the following questions.

if NET_VENDOR_HUAWEI

source "drivers/net/ethernet/huawei/hinic/Kconfig"

endif # NET_VENDOR_HUAWEI

我们去掉别的无关部分, 其实这个文件就是向kernel添加一个config, 添加的格式则和上面展示相同, 其中

  1. bool: 后面一般简要说明
  2. defult: 默认是否开启config
  3. help: 描述, 一般就是详细的使用说明了

后面的source "drivers/net/ethernet/huawei/hinic/Kconfig"其实是个控制选项, 这里是相对于linux目录的kconfig路径, 这样相当于需要加入这个路径下的kconfig文件.

openwrt路径下的软件包则不需要这个文件, 因为openwrt通过makefile编写config时, 已经将其自动加入了, 但kernel下的软件包如果没有添加这个kconfig文件并对软件包进行说明的话, 内核是不知道有这个软件包存在的, 这一点, 等后续进行两者的Makefile分析也可以体现出来它的必要性.

linux 内核软件包

就直接分析内核huawei这个吧, 文件结构如下所示, 省略了一些.c .h文件

linux-5.15.134/drivers/net/ethernet/huawei/
├── hinic
│   ├── hinic_common.c
│   ├── hinic_common.h
...
│   ├── Kconfig
│   └── Makefile
├── Kconfig
└── Makefile

关于Kconfig文件在上文已经提到了, 这里不再赘述, 接下来建议展开这个文件中的两个Makefile文件

首先这个是顶层的Makefile

# SPDX-License-Identifier: GPL-2.0-only
#
# Makefile for the Huawei device drivers.
#

obj-$(CONFIG_HINIC) += hinic/

这个是在hinic/目录下的Makefile

# SPDX-License-Identifier: GPL-2.0-only
obj-$(CONFIG_HINIC) += hinic.o

hinic-y := hinic_main.o hinic_tx.o hinic_rx.o hinic_port.o hinic_hw_dev.o \
	   hinic_hw_io.o hinic_hw_qp.o hinic_hw_cmdq.o hinic_hw_wq.o \
	   hinic_hw_mgmt.o hinic_hw_api_cmd.o hinic_hw_eqs.o hinic_hw_if.o \
	   hinic_common.o hinic_ethtool.o hinic_devlink.o hinic_hw_mbox.o \
	   hinic_sriov.o hinic_debugfs.o

其实这里就可以发现, linux内核的软件包, Makefile的写法和openwrt下的非常.

首先是顶层的Makefile, obj-$(CONFIG_HINIC) += hinic/, 这一行表示就是CONFIG_HINIC被选中编译, 即设置为CONFIG_HINIC=y时, 会编译 hinic/下的文件.

注意这里用的"+=", Makefile很多地方都推荐使用+=而非=, 因为+=是添加, 而=则可能导致你的改动覆盖了别人的改动, 可能会有意想不到的报错.

然后说底层的Makefile, 这里相当于是一个编译说明, 不过比起上次提到的openwrt下软件包的编译, 这里就显得简单很多, 首先obj-$(CONFIG_HINIC) += hinic.o, 这个和顶层Makefile的语法相同, 就是这个宏选中宏会编译一个hinic.o的文件.

注意, 当没有后面那些hinic-y := 的部分时, 这个生成的文件的名字一定要和你当前目录下.c文件的名字相同, 它会根据这个.c来生成.o文件

hinic-y := hinic_main.o ...这部分则是说明编译这个hinic.o的依赖文件, 编译逻辑其实和openwrt下软件包是一样的, 只是这里写得更简单罢了

BTW, 这里的-y也可以用宏控制, 写成上个命令 -$(CONFIG_XXX) 的形式, 相当于再增加宏控制来决定最终生成文件到底依赖哪些文件, 在Debug或者功能较复杂的软件包中可以看到这种使用. 这个就自己去探索吧

当然, 这里还需要说明的是, 你要加任意的控制宏, 都是需要在Kconfig文件对这个宏进行说明的.

此外, 其实从这里顶层Makefile也可以猜到, 内核对于软件包的控制其实是类似套娃的, 所以当你创建一个新的软件包目录的时候, 还需要在你自定义的目录上层加入你的软件包说明.

我们还是以这个软件包为例. 可以在他上层的目录中找到对于这个软件包的描述.

linux-5.15.134/drivers/net/ethernet/Makefile
obj-$(CONFIG_NET_VENDOR_HUAWEI) += huawei/
linux-5.15.134/drivers/net/ethernet/Kconfig
source "drivers/net/ethernet/huawei/Kconfig"

结语

好的, 本篇到此为止, 下篇再更新关于如何在openwrt路径下添加内核软件包.

标签:Kconfig,软件包,Makefile,内核,linux,hinic,openwrt
From: https://blog.csdn.net/yoga_n/article/details/143358114

相关文章

  • Linux查看文件大小的命令-续
    几年前,写了Linux中如何查看文件夹的大小这篇文章,这里再做点补充。大家想要了解一个文件是多大,最直观的方式,就是看看Windows告诉咱们某个文件有多大。可以看到,这个文件大小是2.4GB。有了这个信息,再往下去看Linux中的大小就有了准绳。我测试的是一个仅包含一个语料库的压缩包的目录......
  • #渗透测试#SRC漏洞挖掘# 操作系统-Linux系统基础04之内存管理
    免责声明本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章阅读。                            ......
  • linux 虚拟机扩容
    虚拟机扩容是一件非常简单的事情,我们不要把他想的太麻烦了,下面我们开始操作!1.我们先用df-TH命令查看虚拟机根目录的内存通过这个命令我们发现可用的内存还有大约7G,这里一定是看根目录下的内存。2.我们先关闭虚拟机,找到编辑虚拟机设置、硬盘、扩展注意:这里的虚拟机必须......
  • Linux常见命令
    Linux系统提供了大量强大的命令行工具,这里列举了一些最常用的基本命令,来帮助您在Linux环境下进行日常管理和操作:1、ls-列出目录内容ls:显示当前目录下的文件和文件夹。ls-l:以长格式列出,显示文件的详细信息,如权限、大小、修改日期等。ls-a:显示包括隐藏文件在内......
  • Linux Ubuntu 20.04 LTS 解决无法输入中文 输入法问题
     卸载fcitxsogou输入法#彻底卸载sogou和fcitxsudoaptpurgesogoupinyinsudoaptpurgefcitxsudoaptautoremovesudoaptremovefcitx*sudoaptpurgefcitx*sudoaptautoremove#删除配置文件cd.config/rm-rfsogoupinyin/rm-rfibus安装&配置ibus-rime#安装ib......
  • 还在为慢速数据传输苦恼?Linux 零拷贝技术来帮你!
    前言程序员的终极追求是什么?当系统流量大增,用户体验却丝滑依旧?没错!然而,在大量文件传输、数据传递的场景中,传统的“数据搬运”却拖慢了性能。为了解决这一痛点,Linux推出了零拷贝技术,让数据高效传输几乎无需CPU操心。今天,我就用最通俗的语言讲解零拷贝的工作原理、常见实现方......
  • Linux总结(上)
    Linux    根目录:/   家目录:~ (~指代的内容,如果是root,家目录就是/root,如果是普通用户user,家目录就是/home/user)   上一层目录:..   当前目录:.   前一个工作目录:-   命令格式:命令[选项]参数1.时间:   date    date+%Y/%m/%d%H......
  • Linux之Chronyd 时间服务器配置(Chronod Time Server Configuration in Linux)
      ......
  • Linux之sudo高级应用(Sudo Advanced Applications in Linux)
     ......
  • Linux离线安装gcc4.8
    Linux离线安装gcc4.8https://pan.baidu.com/s/1J-wVsAoTmfn_iiOnYSrmZApwd:beeelinux离线安装gcc4.8.5(简单易懂,已成功安装)联网的情况下直接使用命令yum-yinstallgcc安装。不能联网就需要离线安装了。步骤如下:获取离线安装包:可以使用我已经下载好的包,链接:https://p......