① linux怎么编译进驱动进内核
在Linux内核中增加程序需要完成以下三项工作:
1. 将编写的源代码复制到Linux内核源代码的相应目录;
2. 在目录的Kconfig文件中增加新源代码对应项目的编译配置选项;
3. 在目录的Makefile文件中增加对新源代码的编译条目。
以bq27501驱动编译到内核中为例,具体步骤如下:
1. 首先将bq27501驱动代码文件夹复制到ti-davinci/drivers/目录下。确定bq27501驱动模块应在内核源代码树中处于何处。设备驱动程序存放在内核源码树根目录drivers/的子目录下,按照类别、类型等有序地组织。
2. 在bq27501目录下新建一个Makefile文件,向里面添加代码:obj-$(CONFIG_BQ27501)+=bq27501.o,此时构建系统运行将进入bq27501目录下,编译bq27501.c为bq27501.o。
3. 在bq27501目录下新建Kconfig文件,添加代码:menu "bq27501 driver" config BQ27501 tristate "BQ27501" default y ---help--- Say 'Y' here, it will be compiled into the kernel; If you choose 'M', it will be compiled into a mole named as bq27501.ko. endmenu。
4. 修改drivers目录下的Kconfig文件,在endmenu之前添加一条语句“source drivers/bq27501/Kconfig”。对于驱动程序,Kconfig通常和源代码处于同一目录。若建立了一个新的目录,而且也希望Kconfig文件存在于该目录中的话,那么就必须在一个已存在的Kconfig文件中将它引入,需要用上面的语句将其挂接在drivers目录中的Kconfig中。
5. 修改drivers目录下的Makefile文件,添加“obj-$(CONFIG_BQ27501) +=bq27501/”。这行编译指令告诉模块构建系统在编译模块时需要进入bq27501子目录中。此时的驱动程序的编译取决于一个特殊配置CONFIG_BQ27501配置选项。
6. 修改arch/arm目录下的Kconfig文件,在menu "Device Drivers……endmenu"直接添加语句“source "drivers/bq27501/Kconfig"”。
注意:此处的文件组织规则并非绝对不变,例如:USB设备也属于字符设备,也可以存放在drivers/usb/目录下。在drivers/char/目录下,在该目录下同时存在大量的C源代码文件和许多其他目录。所有对于仅仅只有一两个源文件的设备驱动程序,可以直接存放在该目录下,但如果驱动程序包含许多源文件和其他辅助文件,那么可以创建一个新子目录。bq27501的驱动是属于字符设备驱动类别,虽然驱动相关的文件只有两个,但是为了方便查看,将相关文件放在了bq27501的文件夹中。在drivers/char/目录下增加新的设备过程比较简单,但是在drivers/下直接添加新的设备稍微复杂点。所以下面首先给出在drivers/下添加bq27501驱动的过程,然后再简单说明在drivers/char/目录下添加的过程。
在完成上述步骤后,需要重新编译内核。使用如下命令:
make menuconfig
make
make moles_install
make install
最后,需要在/boot/grub/grub.cfg文件中添加启动项,以便在启动时选择新的内核版本。编辑grub.cfg文件,添加如下内容:
menuentry "Linux-4.19.75" {
linux /boot/vmlinuz-4.19.75 root=/dev/sda3
initrd /boot/initramfs-4.19.75.img
}
保存并退出编辑器,然后运行update-grub命令以更新GRUB配置。重启系统,选择新的内核版本启动,验证bq27501驱动是否成功编译到内核中。
② linux Kbuild详解系列(0) - 内核的编译操作
欢迎进入Linux内核编译操作的探索之旅!此系列博客将详尽阐述Linux内核从编译到安装的全过程,重点介绍Linux的Kbuild系统。Kbuild系统复杂性较高,理解它对于深入Linux内核配置、调试及开发大有裨益。建议阅读本系列前先回顾Makefile知识。
学习Linux内核编译安装机制,能够为后续配置、调试及开发奠定坚实基础。我们从内核编译操作开始,逐步深入。
我们先从下载源码谈起。Linux源码托管在GitHub,通过在搜索栏输入“torvalds/linux”即可找到主线代码。
下载源码后,进入根目录,执行配置步骤。配置为何重要?因为它允许用户选择各种功能模块,如存储、时钟、外设等,灵活裁剪内核大小,满足不同设备需求。
配置通常涉及选择模块,包括平台选择。配置命令在根目录执行,生成的.config文件记录所有配置选项,为编译器提供内核源码编译依据。
在嵌入式开发中,通常采用交叉编译,以提高效率。交叉编译在功能强大的PC机上进行,编译成果在目标开发板上运行。架构差异要求对编译器进行适配。
编译过程需考虑目标平台与交叉编译器。配置后生成镜像文件vmlinix。镜像根据架构不同,可进一步处理为vmlinuz、Image、zImage、bzImage等。
配置阶段将模块分为内核编译与外部模块。内核编译模块直接存在于镜像中,外部模块需加载后使用。
编译后需将内核和模块安装至目标平台。镜像文件根据架构不同而异,通常通过替换或定制系统文件完成安装。模块安装遵循相似流程,可能需复制至特定目录。
内核编译与安装关键步骤包括:
同时,嵌入式开发中需关注交叉编译。通过此系列,希望您对Linux内核编译过程有更深入的理解与掌握。