7. 编译驱动进内核 |
您所在的位置:网站首页 › 编译内核驱动后不开机 › 7. 编译驱动进内核 |
7. 编译驱动进内核¶
7.1. 分析内核源码的Kconfig和Makefile¶
关于Kconfig和Makefile文件的作用,在前面的 《kernel menuconfig》 章节中做了介绍,这里就简单概述一下。 Kconfig 文件主要是用来提供menuconfig菜单选项的。 Makefile 文件用于源码编译的。 下面将以下面这几个文件进行分析: /kernel/Makefile /kernel/Kconfig /kernel/drivers/Makefile /kernel/drivers/Kconfig /kernel/drivers/char/Makefile /kernel/drivers/char/Kconfig /kernel/drivers/tty/Makefile /kernel/drivers/tty/Kconfig 7.1.1. 分析内核源码的Kconfig¶在上述所列文件基础上添加Kconfig调用关系,简化后可以表示成: 1 2 3 4 5 6 7 8 9 10 11 12kernel ├── drivers | ├── char | | ├── Makefile | | └── Kconfig ─────┐ Makefile config TTY 选项被调用 手动配置 生成配置 CONFIG_TTY=y 根据配置编译 7.2. 将helloworld例程驱动编译进内核¶看了上述的描述,关于如何实现“编译驱动到内核”,相信你心里已经有想法了。下面就以先前的helloworld例程进行演示一下。 进入内核源码同级目录,将案例的helloworld例程文件夹复制到内核源码的drivers/char路径下。 7.2.1. 新建Kconfig文件¶的内核源码目录下的drivers/char/helloworld路径(刚刚复制的)下,新建Kconfig文件。 文件内容如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14# # Helloworld test configuration # menu "Helloworld test" config HELLOWORLD tristate "Helloworld option" default y help helloworld 测试选项 endmenu #endmenu后一定要加空行第5行:菜单名 第7行:声明config选项 第8行:声明选项的类型,选项的名称, 第9行:默认配置,default y表示默认配置是编译进内核 第10-11行:帮助信息 第13行:菜单结束 第14行:endmenu后需要加空行 选项支持的类型:tristate和bool。 tristate支持三个选项: < >不编译 编译到内核 编译成模块 bool支持两个选项: < >不编译 编译到内核 7.2.2. 将Kconfig加到另一个Kconfig¶首先,我们要有一个概念,除了主Kconfig,其他Kconfig都需要被加载才能起效。 以drivers/char/Kconfig中添加为例,添加以下内容。 1source "drivers/char/helloworld/Kconfig"添加后如下: 1 2 3 4 5 6 7 8 9# SPDX-License-Identifier: GPL-2.0 # # Character device configuration # menu "Character devices" source "drivers/tty/Kconfig" source "drivers/char/helloworld/Kconfig"此时我们就可以打开menuconfig配置界面查看选项信息了,可以看到helloworld选项的路径在: 主界面 --> Device Drivers --> Character devices --> Helloworld test 7.2.3. Kconfig小练习(menuconfig)¶ 7.2.3.1. 小练习1¶将上述的 1source "drivers/char/helloworld/Kconfig"放到 drivers/char/Kconfig 文件的第5行(menu前),查看选项位置发生了哪些变化。 7.2.3.2. 小练习2¶将上述的 1source "drivers/char/helloworld/Kconfig"放到内核源码根目录下的 Kconfig 文件的末尾(即可最末尾留空行),查看选项位置发生了哪些变化。 7.2.4. 修改Makefile文件¶ 7.2.4.1. 修改例程下的Makefile文件¶此处修改 drivers/char/helloworld/Makefile 文件,修改后内容如下: 1obj-$(CONFIG_HELLOWORLD) += helloworld.o 7.2.4.2. 修改例程上一级Makefile文件¶此处需要修改 drivers/char/Makefile 文件。 文件原内容为: 1 2 3 4 5 6 7 8 9 10 11# SPDX-License-Identifier: GPL-2.0 # # Makefile for the kernel character device drivers. # obj-y += mem.o random.o obj-$(CONFIG_TTY_PRINTK) += ttyprintk.o obj-y += misc.o obj-$(CONFIG_ATARI_DSP56K) += dsp56k.o obj-$(CONFIG_VIRTIO_CONSOLE) += virtio_console.o ……在第4行和第6之间加上如下内容: 1obj-y += helloworld/提示 这里演示的是相对路径,表示编译该文件同级的helloworld文件夹里的内容。 7.2.5. menuconfig配置¶ 1 2 3 4 5 6 7# 加载defconfig到.config make ARCH=arm64 linux_h618_defconfig # 打开menuconfig配置界面,会加载.config make ARCH=arm64 menuconfig # 将配置好的.config保存为defconfig cp .config arch/arm64/configs/linux_h618_defconfigmenuconfig配置时,将“Helloworld”选项设置成编译进内核。 7.2.6. 重新编译内核¶ 1 2 3 4 5 6 7 8 9#清除之前生成的所有文件和配置 make mrproper # 加载linux_h618_defconfig配置文件 # 这步执行之后,会将linux_h618_defconfig配置加载到.config make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- linux_h618_defconfig # 编译内核,指定平台,指定交叉编译工具,使用16线程进行编译,线程可根据电脑性能自行确定 make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j16 7.2.7. 查看编译结果¶进入“drivers/char/helloworld”文件夹,查看编译生成的文件。 注意 如果编译完发现并没有生成文件,请检查操作步骤和文件修改是否正确。 可以通过以下命令查看配置里是否有选项信息。 1cat .config | grep HELLO如果生成了如图的文件,恭喜你,说明你编译进内核的操作成功了。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |