本教程旨在引导您完成Linux内核和busybox的编译,以及使用QEMU启动内核的过程。为了确保学习的流畅性,建议在VirtualBox运行的Ubuntu 22.04.3 LTS上测试本教程。理解makefile的原理和使用方法将有助于您更好地执行后续的“make”命令。
首先,准备编译所需的文件和环境。新建文件夹存放所有文件,并下载Linux内核源码(版本6.7.5)和busybox源码(版本1.36.1)。解压这些压缩包,确保目录结构清晰。将这些文件放置在新建的文件夹内,本教程中将此文件夹称为“主目录”,以方便描述。
接下来,开始编译Linux内核。在“主目录”中,确保已安装所有必要的依赖项。使用命令“make -j8”在Linux内核文件夹下运行编译命令(注意:此命令需在“linux-6.7.5”文件夹下执行,且电脑CPU为i5-13400,虚拟机分配8个核心)。对于AMD 7840hs真机,使用“make -j12”命令,编译时长约为1分钟。编译成功后,内核会生成名为“bzImage”的文件,记住其输出路径,后续步骤将使用到。
在完成内核编译后,紧接着编译busybox。无需额外依赖,直接执行编译过程。在“busybox-1.36.1”文件夹下运行命令,选择静态二进制构建选项以确保内核精简性,以便在QEMU上运行。快速编译完成后,生成的文件位于“busybox-1.36.1/_install”目录下。
接下来,安装QEMU模拟器。安装完成后,准备制作文件系统,以运行内核。在“busybox-1.36.1/_install”目录下,选择一种制作文件系统的方式:一种是快速但会丢失更改,另一种是麻烦但可保存更改并永久存储。首先实现快速方式。
在“busybox-1.36.1/_install”目录下,找到并使用initramfs.cpio.gz文件。在“主目录”中启动QEMU模拟器。运行过程中,可以通过命令行输入简单命令验证系统功能。尝试新建文件并关闭系统,重启后发现文件消失,因为内存系统在重启后会清空。
为了实现永久保存数据功能,分配磁盘文件并制作一个磁盘文件。在“主目录”内运行相关命令,创建磁盘文件后,内核操作磁盘的数据将被永久保存。再次运行模拟器并验证文件持久性。
为了简化后续操作,提供了一个makefile文件,放置在“主目录”下。运行该makefile启动命令,方便管理和操作。
Ⅱ 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驱动是否成功编译到内核中。