Loading

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内核

 

posted @ 2023-01-11 11:41  KairusZhang  阅读(1384)  评论(0编辑  收藏  举报