QEMU模拟器
QEMU是一个模拟器,可以模拟CPU,例如ARM、x86、MIPS等架构
可以用于仿真ARM处理器:ARM926E、ARM1136、Cortex-A8\A9。用于模拟真实的开发板、外设:串口、LCD、网卡、USB、SD卡等
用途:
1、研究内核虚拟化
2、模拟CPU,芯片公司用于在流片之前在QEME上做验证、驱动开发
3、利用qemu-system-arm学习嵌入式开发、研究Bootloader、Linux内核、驱动开发、应用开发等
好处:
1、节省学习成本
2、跳过硬件(开发板)的各种坑
QEMU安装:
自动安装:apt install qemu
手动编译安装:
首先安装QEMU编译依赖包 -apt install zlib1g-dev
-apt install libglib2.0 libglib2.0-dev
-apt install libsdl1.2-dev
-apt install libpixman-1-dev libfdt-dev
下载QEMU源码,git clone git://git.qemu-project.org/qemu.git
切换稳定版本:git checkout v2.7.0
编译配置:./configure --target-list=arm-softmmu --audio-drv-list=
编译安装:make; make install
qemu-system- #显示所支持的CPU架构
qemu-system-arm --version #显示版本
qemu-system-arm -M help #显示ARM架构的开发板
软件远更新下载:
Ubuntu采用集中式的软件仓库机制,将软件包分类存在软件仓库中进行管理。
软件仓库放置在各种镜像服务器中,对于用户来说,但使用apt-get install安装软件时,
会从这些服务器下载软件包,这些镜像服务器就是软件源。
原理:执行apt update, 程序分析/etc/apt/source.list目录,自动连接网络寻找list中对应的Packages/Sources/Release列表文件,如果有更新则重新下载,存入/var/lib/apt/lists/目录
,然后apt install 相应的包,下载到本地进行安装。
下载Linux内核
-www.kernel.org
-git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/
修改Makefile
进入内核源码的根目录,修改顶层的Makefile文件
ARCH=arm
CROSS_COMPILE=arm-linux-gnueabi-
cd linux-4.4.76/arch目录可以查看linusx支持的内核
cd linux-4.4.76/arch/arm查看支持的ARM架构的芯片(开发板),
cd linux-4.4.76/arch/arm/config针对不同的开发板,的内核配置文件
编译内核、模块、dtb文件,回到Linux-4.4.76内核根目录
$make vexpress_defconfig; ##针对vexpress开发板编译配置文件,生成.config文件
$make zImage -j6; #6多线程编译内核镜像, 在arch/arm/boot/zImage目录
$make modules -j4; #编译内核模块,有时需要使用内核模块的形式配置内核,生成模块.ko文件
$make dtbs; 在linux-4.4.76/arch/arm/boot/zImage生成的镜像为ARM架构通用镜像,针对具体的芯片开发板,在linux-4.4.76/arch/arm/boot/dts/vexpress-v2p-ca9.dtb 目录生成具体的配置文件。
1 cat boot.sh 2 qemu-system-arm \ 3 -M vexpress-a9 \ #指定开发板 4 -m 512M \ #指定内存大小 5 -kernel linux-4.4.76/arch/arm/boot/zImage \ #指定Arm架构镜像 6 -dtb linux-4.4.76/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \ #指定具体芯片的配置文件 7 -nographic \ #非图形化界面 8 -append "console=ttyAMA0" #指定开发板串口通信端口 9 10 ./boot.sh
ps -a #显示当前的进程
kill 12345 #结束指定进程
文件系统:
对存储在设备上的数据进行组织的机制
文件系统的思想:Linux一切皆文件,用户与操作系统进行交互主要是用文件系统调用,用户和底层存储的接口
根文件系统:Linux内核启动后的第一个要挂载的文件系统,主要由基本的shell命令、各种库、字符设备、配置脚本组成,提供/根目录,RFS(根文件系统)可以放置在nor/nand flash、SD卡、U盘(启动盘)、磁盘、网络空间等地方。
使用Busybox制作根文件系统
编译安装Busybox: Busybox是一个集成100多个Linux常用命令和工具的制作文件系统的软件工具
-下载源代码:http://www.busybox.net/downloads/
-修改Makefile: ARCH=arm
CROSS_COMPILE=arm-linux-gnueabi-
-配置: make defconfig; #对上面修改进行默认配置
make menuconfig; #图形化配置
-编译:make
-安装:make install
制作根文件系统
$mkdir rootfs $mkdir rootfs/lib $cp -r busybox-1.27.0/_install/* rootfs/ #拷贝各种 $cp -p /usr/arm-linux-gnueabi/lib/* rootfs/lib ##拷贝动态链接库 $mkdir -p rootfs/dev/ ##创建字符设备,和底层设备进行交互 $cd dev $mknod -m 666 tty1 c 4 1 ##m权限读写执行,串口设备名 字符设备 主设备号 次设备号 $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 ##垃圾站 $
使用SD卡制作文件系统镜像
生成镜像:dd if=/dev/zero of=rootfs.ext3 bs=1M count=32
格式化为exts文件系统:mkfs.ext3 rootfs.ext3
将文件拷贝到系统镜像中:
$mount -t ext3 rootfs.ext3 /mnt/ -o loop #挂载SD卡在mnt目录
$cp -r rootfs/* /mnt #把文件系统文件拷贝到mnt中
$umount /mnt #卸载mnt
启动内核,挂在rootfs
1 qemu-system-arm \ 2 -M vexpress-a9 \ #指定开发板 3 -m 512M \ #指定内存大小 4 -kernel linux-4.4.76/arch/arm/boot/zImage \ #指定Arm架构镜像 5 -dtb linux-4.4.76/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \ #指定具体芯片的配置文件 6 -nographic \ #非图形化界面 7 -append "root=/dev/mmcblk0 rw console=ttyAMA0" #挂在SD卡,根文件系统,指定开发板串口通信端口 可读可写 8 -sd rootfs.ext3
(https://www.bilibili.com/video/BV1PJ411m7Rs/?spm_id_from=333.788.recommend_more_video.0&vd_source=0415fb7922143138e3687e92fcad0752)
图形化启动内核
1 qemu-system-arm \ 2 -M vexpress-a9 \ #指定开发板 3 -m 512M \ #指定内存大小 4 -kernel linux-4.4.76/arch/arm/boot/zImage \ #指定Arm架构镜像 5 -dtb linux-4.4.76/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \ #指定具体芯片的配置文件 6 -append "root=/dev/mmcblk0 rw console=ttyAMA0" #挂在SD卡,根文件系统,指定开发板串口通信端口 可读可写 7 -sd rootfs.ext3
启动之后修改启动界面:
$cd /etc/init.d
$touch rcS
$chmod a+x rcS
$vim rcS
echo "----------------------------------------------------------"
echo " Hello World "
echo "-----------------------------------------------------------"
使用bootload (U-boot)加载Linux内核