B站课程学习记录,原视频 BV1NJ411m75T
若按此教程学习,不要使用版本差异太大的源码,会有问题,已经踩过坑。
如有错误感谢指正。
apt install gcc-arm-linux-gnueabi //arm通用(可选安装g++)
arm-linux-gnueabi-gcc -v //查看安装版本
apt install qemu
qemu-system-arm --version
qemu-system-arm -M help //查看支持的开发板
make vexpress_defconfig
make zImage -j4 生成./arch/arm/boot/zImage
make modules -j4
make dtbs //生成./arch/arm/boot/dts/vexpress-v2p-ca9.dtb,同时生成的其他dtb我们不需要
//可以看到最后一行显示没有挂载文件系统,就算编译成功了,下面再继续制作文件系统
//-M指定开发板,-m指定内存大小,-kernel指定内核镜像,-dtb指定dtb文件,-nographic不适用图形显示,-append追加命令使用串口控制台
qemu-system-arm -M vexpress-a9 -m 512M -kernel ./zImage -dtb ./vexpress-v2p-ca9.dtb -nographic -append "console=ttyAMA0"
可以整理成脚本boot.sh
qemu-system-arm \
-M vexpress-a9 \
-m 512M \
-kernel ./zImage \
-dtb ./vexpress-v2p-ca9.dtb \
-nographic \
-append "console=ttyAMA0"
CROSS_COMPILE ?= arm-linux-gnueabi-
ARCH ?= arm
make defconfig
make menuconfig //图形化配置方法,并且设置Busybox Settings-->Build Options中选静态库,可能需要安装apt install libncurses5-dev
make -j4
make install //生成的文件都在./_install目录下
mkdir rootfs
cd rootfs
mkdir lib
mkdir dev
cp -r busybox-1.27.0/_install/* rootfs/
cp -p /usr/arm-linux-gnueabi/lib/* rootfs/lib/
cd rootfs/dev
mknod -m 666 tty1 c 4 1 //新建串口节点,-m权限,tty1串口,c字符设备,4主设备号(类型),1次设备号(编号)
mknod -m 666 tty2 c 4 2
mknod -m 666 tty3 c 4 3
mknod -m 666 tty4 c 4 4
mknod -m 666 console c 5 1
mknod -m 666 null c 1 3 //null表示什么都没有,可以理解为垃圾站
dd if=/dev/zero of=rootfs.ext3 bs=1M count=32 //dd生成镜像,if输入,of输出,bs缓冲区大小,count块的大小
mkfs.ext3 rootfs.ext3 //格式化该sd卡,存储设备一般都是块设备,所以要挂载后才能读写
mount -t ext3 rootfs.ext3 /mnt -o loop
cp -r rootfs/* /mnt/
umount /mnt/ //挂载只是为了进行读写,所以都写完就可以卸载掉
qemu-system-arm \
-M vexpress-a9 \
-m 512M \
-kernel ./zImage \
-dtb ./vexpress-v2p-ca9.dtb \
-nographic \
-append "root=/dev/mmcblk0 rw console=ttyAMA0" \
-sd rootfs.ext3
启动后该系统可以直接进入命令行进行操作;也可以在关闭后重新在rootfs文件夹下修改,然后再挂载复制到挂载目录下达到修改的目的
qemu-system-arm \
-M vexpress-a9 \
-m 512M \
-kernel ./zImage \
-dtb ./vexpress-v2p-ca9.dtb \
-append "root=/dev/mmcblk0 rw console=tty0" \
-sd rootfs.ext3
一般情况下,机器上电后会有bootloader检测硬件并将操作系统从磁盘上读取到内存进行启动,如个人PC的BIOS,嵌入式设备一般用uboot(开源,且兼容大多数板子)启动内核,常见的有从flash/sd卡/网络启动内核
CROSS_COMPILE ?= arm-linux-gnueabi-
ARCH := arm
make vexpress_ca9x4_defconfig
vim u-boot-2017.05/include/configs/vexpress-common.h
//在这个打开的头文件中找到CONFIG_BOOTCOMMAND,屏蔽原来的定义,重新定义
#define CONFIG_BOOTCOMMAND "tftp 0x60003000 uImage;\
tftp 0x60500000 vexpres s-v2p-ca9.dtb;\
setenv bootargs 'root=/dev/mmcblk0 console=ttyA MA0';\
bootm 0x60003000 - 0x60500000;"
#define CONFIG_IPADDR 192.168.31.153 //与CONFIG_SERVERIP 在同一网段就行
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_SERVERIP 192.168.31.152 //qemu所在主机的ip
make -j4
qemu-system-arm -M vexpress-a9 -m 512M -nographic -kernel u-boot
apt install uml-utilities bridge-utils //必要插件
ls /dev/net/ //查看该目录有无tun,有才支持,无。。。
vim /etc/network/interfaces //添加以下内容,大致意思是桥接两个网卡,配置成功后要重启
auto ens33 ##本机网卡名,根据实际情况变更
auto br0
iface br0 inet dhcp
bridge_ports ens33
cd linux-4.4.76/
make LOADADDR=0x60003000 uImage -j4 //编译完成后生成linux-4.4.76/arch/arm/boot/uImage
apt install tftp-hpa tftpd-hpa xinetd
vim /etc/default/tftpd-hpa //修改为以下形式
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-l -c -s"
mkdir /home/tftpboot //创建tftp目录
chmod 777 tftpboot
/etc/init.d/tftpd-hpa restart //配置完成后,tftp重启
cp linux-4.4.76/arch/arm/boot/uImage /home/tftpboot/
cp linux-4.4.76/arch/arm/boot/dts/vexpress-v2p-ca9.dtb /home/tftpboot/
qemu-system-arm \
-M vexpress-a9 \
-m 512M \
-kernel u-boot \
-nographic \
-net nic,vlan=0 -net tap,vlan=0,ifname=tap0 \
-sd rootfs.ext3
事实上以上教程仅能够达到运行qemu的作用,并不能完全模拟开发板进行开发,还有很多配置没有进行,任重而道远。