文章目录
1 base on arm
- info
- arm-linux-gnueabihf-gcc (Linaro GCC 7.5-2019.12) 7.5.0
- linux-5.10
- busybox-1.34.1
- QEMU emulator version 6.2.0
linux
-
编译
-
make distclean; make clean
-
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- vexpress_defconfig
-
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
-
- Kernel hacking > printk and dmesg options
- Show timing information on printks #打印时间
- Enable dynamic printk() support #打开动态debug机制
- Device Drivers > Generic Driver Options
- Support for uevent helper #支持热插拔
- Kernel hacking > printk and dmesg options
-
-
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4
-
-
验证
- qemu-system-arm -M vexpress-a9 -m 128M -kernel arch/arm/boot/zImage -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic
- qemu-system-arm -M vexpress-a15 -m 128M -kernel arch/arm/boot/zImage -dtb arch/arm/boot/dts/vexpress-v2p-ca15-tc1.dtb -nographic
文件系统 init.c
//init.c
#include <stdio.h>
void main()
{
printf("\033[1;36m Hello qemu!\033[m\n"); //打印一串亮青色的字体
while(1);
}
采用静态库编译: arm-linux-gnueabihf-gcc -static -o init init.c
linux2.6 内核支持两种格式的 initrd(虚拟文件系统),一种是 linux2.4 内核那种传统格式的文件系统镜像 image-initrd,其核心文件就是 /linuxrc
另外一种格式的 initrd 是 cpio 格式的,这种格式的 initrd 使用 cpio 工具生成,其核心文件不再是 /linuxrc,而是 /init,本文将这种 initrd 称为 cpio-initrd。
将init制作成cpio镜像
- echo init | cpio -o --format=newc > initramfs
验证
- qemu-system-arm -M vexpress-a9 -m 128M -kernel arch/arm/boot/zImage -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -initrd …/initramfs
- qemu-system-arm -M vexpress-a15 -m 128M -kernel arch/arm/boot/zImage -dtb arch/arm/boot/dts/vexpress-v2p-ca15-tc1.dtb -nographic -initrd …/initramfs
- 停止qemu:ctrl + a,x(组合键ctrl+a,之后再按x)
busybox
使用静态库方式编译
编译
-
make distclean; make clean
-
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- defconfig
-
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
-
Settings —>
- [*] Build static binary (no shared libs) #使用静态库
-
-
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4
-
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- install
- 生成结果位于:当前根目录下的_install文件夹下
- 备注:默认安装到根目录下的_install,若想更改,可以通过menuconfig里面的选项更改
文件系统镜像
-
根目录构建
-
mkdir -p rootfs/{ dev,etc/init.d,lib,proc,sys} #创建根目录 cp -raf busybox-1.34.1/_install/* rootfs #拷贝busybox命令到根目录 sudo mknod -m 666 rootfs/dev/tty1 c 4 1 #创建4个tty端终设备 sudo mknod -m 666 rootfs/dev/tty2 c 4 2 sudo mknod -m 666 rootfs/dev/tty3 c 4 3 sudo mknod -m 666 rootfs/dev/tty4 c 4 4 sudo mknod -m 666 rootfs/dev/console c 5 1 #创建console字符设备 sudo mknod -m 666 rootfs/dev/null c 1 3 #创建null 字符设备 # vim rootfs/etc/init.d/rcS #输入如下内容 #!/bin/bash mount -t proc proc /proc mount -t sysfs sysfs /sys /sbin/mdev -s echo /sbin/mdev > /proc/sys/kernel/hotplug #支持热插拔 # sudo chmod +x rootfs/etc/init.d/rcS
-
-
制作启动镜像
- 注意:一定要在rootfs目录下执行,否则会失败
- cd rootfs;find ./ | cpio -o --format=newc > …/rootfs.img #制作成cpio镜像
验证
-
启动
- qemu-system-arm -M vexpress-a9 -m 128M -kernel arch/arm/boot/zImage -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -append “root=/dev/ram rdinit=sbin/init console=ttyAMA0” -nographic -initrd …/rootfs.img
- qemu-system-arm -M vexpress-a15 -m 128M -kernel arch/arm/boot/zImage -dtb arch/arm/boot/dts/vexpress-v2p-ca15-tc1.dtb -append “root=/dev/ram rdinit=sbin/init console=ttyAMA0” -nographic -initrd …/rootfs.img
-
执行demo
- code:https://gitee.com/tianzong2019/bookcode/blob/drv/6.chardev/example
- 编译后执行,若需要手动创建节点,可通过如下实现
- 加载设备
- insmod mdrv.ko
- mknod /dev/miscdev c 10 2
- /dev/miscdev 设备节点名称
- c b和c 分别表示块设备和字符设备
- 10 MAJOR表示主设备号
- 2 MINOR表示次设备号
- 使用手动mknod则需要配置静态的主次设备号
- 卸载设备
- rmmod mdrv.ko
- rm -rf /dev/miscdev
- 加载设备
-
综合脚本
-
#!/bin/bash cur=${1:-`pwd`} busybox=${cur}/busybox-1.34.1 linux=${cur}/linux-5.10 rootfs=${cur}/rootfs app=${cur}/app rootfsimg=${cur}/cpio-rootfs.img rcs=${rootfs}/etc/init.d/rcS #[[ ! -d ${app} ]] && mkdir ${app} [[ -d ${rootfs} ]] && rm -rf ${rootfs} mkdir -p ${rootfs}/{ dev,etc/init.d,lib,proc,sys} #创建根目录 cp -raf ${busybox}/_install/* ${rootfs} #拷贝busybox命令到根目录 #cp -raf ${app} ${rootfs} sudo mknod -m 666 ${rootfs}/dev/tty1 c 4 1 #创建4个tty端终设备 sudo mknod -m 666 ${rootfs}/dev/tty2 c 4 2 sudo mknod -m 666 ${rootfs}/dev/tty3 c 4 3 sudo mknod -m 666 ${rootfs}/dev/tty4 c 4 4 sudo mknod -m 666 ${rootfs}/dev/console c 5 1 #创建console字符设备 sudo mknod -m 666 ${rootfs}/dev/null c 1 3 #创建null 字符设备 echo "#!/bin/sh" >> ${rcs} echo "mount -t proc proc /proc" >> ${rcs} echo "mount -t sysfs sysfs /sys" >> ${rcs} echo "/sbin/mdev -s" >> ${rcs} echo "echo /sbin/mdev > /proc/sys/kernel/hotplug" >> ${rcs} echo "mount -t debugfs none /sys/kernel/debug" >> ${rcs} sudo chmod 777 ${rcs} #一定要在rootfs目录下执行,否则会失败
-

本文详细介绍了在ARM和Aarch64平台上使用Busybox编译,构建文件系统镜像,验证启动方式,包括cpio和hda/SD9p/9pshare,并配合QEMU进行网络配置和Buildroot构建的教程。
最低0.47元/天 解锁文章
228

被折叠的 条评论
为什么被折叠?



