qemu搭建和运行起来一个linux内核环境

2023-11-17

qemu搭建和运行起来一个linux内核环境。

参考了博客:

搭建linux调试环境 (一)-- qemu环境搭建vexpress开发平台 - Edver - 博客园
【嵌入式Linux之QEMU模拟器】4、使用busybox制作根文件系统_ReCclay的博客-CSDN博客_busybox编译根文件系统 qemu

qemu模拟vexpress开发板 - bigsissy - 博客园

qemu 模拟arm - 小水同学 - 博客园

 QEMU简述:

因此,上述QEMU所做的工作,相当于:

1. 编译Linux Kernel镜像

#!/bin/sh


# 预期工具准备:
# Ubuntu 22.04 安装qemu全套
sudo apt install qemu
sudo apt install qemu-system
sudo apt install qemu-user
sudo apt install qemu-efi
sudo apt install qemu-web-desktop
sudo apt install qemu-guest-agent
sudo apt install qemu-block-extra
sudo apt install qemu-utils
sudo apt install qemubuilder
# gcc-arm-linux-gnueabi工具
sudo apt install gcc-arm-linux-gnueabi
# 后续的编译过程还需要的工具
sudo apt install u-boot-tools
sudo apt install flex
sudo apt install bison
sudo apt install libncurses5-dev
sudo apt install libncurses-dev
# 开发时常用工具
sudo apt install cmake
sudo apt install git
sudo apt install vim
sudo apt install build-essential



# 注意编译的Linux内核版本, 如内核版本过低, 而工具链和主机Ubuntu过旧, 则可能会带来大量编译错误



# 1.
# 修改linux kernel的Makefile的两个变量为:
#   ARCH ?= arm
#   CROSS_COMPILE ?= arm-linux-gnueabi-
#
cd linux-4.19.269/
vim Makefile

# 编译配置
make vexpress_defconfig
make menuconfig     # 这个只要没有报错, 直接推出出现的窗口即可



# 2.
# 编译linux kernel代码, 为了加速编译, 开启多线程编译
#
make zImage -j 4
make modules -j 4
make dtbs -j 4
make LOADADDR=0x60003000 uImage  -j 4



# 3.
# 把镜像文件zImage和uImage, 设备树文件dtbs, 复制到工程目录testboot里, 进行测试一下
cd ..
mkdir testboot
cp arch/arm/boot/zImage ../testboot/
cp arch/arm/boot/uImage ../testboot/
cp arch/arm/boot/dts/vexpress-v2p-ca9.dtb ../testboot/



# 4.
# 测试
sh testboot/test_boot.sh
# test_boot.sh内容:
#       #!/bin/sh
#       # 测试uboot
#       # 上级路径
#       top_path="/home/thinks2/ProgramProject/qemu_study/"
#       src_path="linux-4.14.302/arch/arm/boot/"
#       # 内核文件与dtb文件的路径
#       kernel_path=${top_path}${src_path}"zImage"
#       dtb_path=${top_path}${src_path}"dts/vexpress-v2p-ca9.dtb"
#       qemu-system-arm \
#           -M vexpress-a9 \
#           -m 512M \
#           -kernel ${kernel_path} \
#           -dtb ${dtb_path} \
#           -append "console=ttyAMA0" \
#           -nographic \

2.  使用busybox制作最小文件系统

#!/bin/sh


# 1.
# 修改busybox的Makefile的两个变量为:
#   ARCH ?= arm
#   CROSS_COMPILE ?= arm-linux-gnueabi-
#
cd busybox-1.35.0/
vim Makefile

# 设置编译为静态库:
# Settings  --->
#     Build Options  --->
#         [*] Build as a static binary (no shared libs)
make menuconfig



# 2.
# 编译:
#   编译完成后会在busybox目录下生成一个_install的目录, 
#   该目录是编译好的文件系统需要使用的一些命令集合
make defconfig
make -j 4
make install



# 3.
# 新建一个根文件系统的文件夹
cd ..
mkdir rootfs
cd rootfs/

# 拷贝_install目录的命令集到rootfs中
cp -rf ../busybox-1.35.0/_install/* ./

# 在rootfs中, 新建lib目录,从工具链中拷贝arm执行库到该lib中
mkdir lib
cp -p /usr/arm-linux-gnueabi/lib/* lib/



# 4.
# 创建字符设备: 设备文件, 跟用户和底层进行交互的接口, 这些接口以文件节点的形式存在, 读写文件, 直接读写对应的结点即可

# 在rootfs中, 创建dev文件夹, 存放各种目录结点
mkdir dev
cd dev

# 创建4个串口结点
#
# 命令和其参数的意义:
#     mknod:  创建结点
#     -m 666: 设置权限为666
#     ttyX:    表示串口
#     c:      表示字符设备
#     4:      表示主设备号
#     1:      表示次设备号
sudo mknod -m 666 tty1 c 4 1
sudo mknod -m 666 tty2 c 4 2
sudo mknod -m 666 tty3 c 4 3
sudo mknod -m 666 tty4 c 4 4

# 创建1个工作台结点
sudo mknod -m 666 console c 5 1

# 创建null结点
sudo mknod -m 666 null c 1 3



# 5.
# 制作SD根文件系统镜像: 根文件系统放到SD卡里, 内核启动后, 从SD卡挂载根文件系统
cd ../..

# 生成根文件系统镜像rootfs.ext3, 直接把rootfs.ext3看成一个SD卡即可
# bs: 缓冲区大小, count: 表示块大小
dd if=/dev/zero of=rootfs.ext3 bs=1M count=64

# 格式化rootfs.ext3
mkfs.ext3 rootfs.ext3



# 6.
# 将各种文件拷贝到文件系统镜像中
mkdir tmpfs

# 将虚拟sd卡挂载到/tmpfs
#   -t ext3: 表示文件系统是ext3格式
#   -o loop: 使用loop模式用来将一个档案当成硬盘分割挂上系统
sudo mount -t ext3 rootfs.ext3 tmpfs/ -o loop

# 拷贝rootfs的所有文件到sd卡中
sudo cp -r rootfs/* tmpfs/

# 卸载sd(块设备不能直接读写)
sudo umount tmpfs



# 7.
# 使用qemu在这个最小文件系统上运行linux kernel
sh step_qemu_run_os.sh
# step_qemu_run_os.sh内容:
#       #!/bin/sh
#       # 使用qemu启动内核
#       # 上级路径
#       top_path="/home/thinks2/ProgramProject/qemu_study/"
#       src_path="linux-4.14.302/arch/arm/boot/"
#       # 内核文件与dtb文件的路径
#       kernel_path=${top_path}${src_path}"zImage"
#       dtb_path=${top_path}${src_path}"dts/vexpress-v2p-ca9.dtb"
#       # 用qemu运行Linux内核, 其中:
#       #
#       #   1. -M vexpress-a9:      模拟vexpress-a9单板, 能够使用-M ?參数来获取该qemu版本号支持的全部单板
#       #   2. -m 512M:             单板执行物理内存512M
#       #   3. -kernel xxx/zImage:  告诉qemu单板执行内核镜像路径
#       #   4. -nographic:          不使用图形化界面, 仅仅使用串口
#       #
#       #   5. -append "root=/dev/mmcblk0 rw console=tty0": 
#       #      内核启动參数这里告诉内核vexpress单板执行. 其中:
#       #          5.1 root=/dev/mmcblk0:  文件系统的加载Root位置
#       #          5.2 rw:                 以读写的方式打开文件系统, 以便能够创建, 修改, 删除文件
#       #          5.3 console=tty0:       控制台
#       #
#       #   6. -sd rootfs.ext3:     从SD卡加载系统
#       qemu-system-arm \
#           -M vexpress-a9 \
#           -m 512M \
#           -kernel  ${kernel_path} \
#           -dtb ${dtb_path} \
#           -append "root=/dev/mmcblk0 rw console=ttyAMA0" \
#           -sd rootfs.ext3 \
#           -nographic \
#       # console=ttyAMA0

3.  使用qemu在最小系统上运行编译好的Linux Kernel镜像

#!/bin/sh


# 使用qemu启动内核



# 上级路径
top_path="/home/thinks2/ProgramProject/qemu_study/"
src_path="linux-4.14.302/arch/arm/boot/"

# 内核文件与dtb文件的路径
kernel_path=${top_path}${src_path}"zImage"
dtb_path=${top_path}${src_path}"dts/vexpress-v2p-ca9.dtb"



# 用qemu运行Linux内核, 其中:
#
#   1. -M vexpress-a9:      模拟vexpress-a9单板, 能够使用-M ?參数来获取该qemu版本号支持的全部单板
#   2. -m 512M:             单板执行物理内存512M
#   3. -kernel xxx/zImage:  告诉qemu单板执行内核镜像路径
#   4. -nographic:          不使用图形化界面, 仅仅使用串口
#
#   5. -append "root=/dev/mmcblk0 rw console=tty0": 
#      内核启动參数这里告诉内核vexpress单板执行. 其中:
#          5.1 root=/dev/mmcblk0:  文件系统的加载Root位置
#          5.2 rw:                 以读写的方式打开文件系统, 以便能够创建, 修改, 删除文件
#          5.3 console=tty0:       控制台
#
#   6. -sd rootfs.ext3:     从SD卡加载系统
qemu-system-arm \
    -M vexpress-a9 \
    -m 512M \
    -kernel  ${kernel_path} \
    -dtb ${dtb_path} \
    -append "root=/dev/mmcblk0 rw console=tty0" \
    -sd rootfs.ext3 \
    # -nographic \

# console=ttyAMA0

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

qemu搭建和运行起来一个linux内核环境 的相关文章

  • jq中如何分组?

    这是 json 文档 name bucket1 clusterName cluster1 name bucket2 clusterName cluster1 name bucket3 clusterName cluster2 name bu
  • ftrace:仅打印trace_printk()的输出

    是否可以只转储trace printk 输出于trace文件 我的意思是过滤掉函数跟踪器 或任何其他跟踪器 中的所有函数 一般来说 您可以在选项目录中关闭选项 sys kernel debug tracing options Use ls显
  • 如何通过ssh检查ubuntu服务器上是否存在php和apache

    如何通过ssh检查Ubuntu服务器上apache是 否安装了php和mysql 另外如果安装的话在哪个目录 如果安装了其他软件包 例如 lighttpd 那么它在哪里 确定程序是否已安装的另一种方法是使用which命令 它将显示您正在搜索
  • MySQL 中的创建/写入权限

    我的设备遇到一些权限问题SELECT INTO OUTFILE陈述 当我登录数据库并执行简单的导出命令时 例如 mysql gt select from XYZ into outfile home mropa Photos Desktop
  • 如何在基于 Linux 的系统上的 C 程序中使用 mqueue?

    如何在基于 Linux 的系统上的 C 程序中使用 mqueue 消息队列 我正在寻找一些好的代码示例 可以展示如何以正确且正确的方式完成此操作 也许是一个操作指南 下面是一个服务器的简单示例 该服务器接收来自客户端的消息 直到收到告诉其停
  • Windows CE 与嵌入式 Linux [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 现在我确信我们都清楚 Linux 与 Windows 桌面的相对优点 然而 我对嵌入式开发世界的了解却少得多 我主要对行业解决方案感兴
  • 监控子进程的内存使用情况

    我有一个 Linux 守护进程 它分叉几个子进程并监视它们是否崩溃 根据需要重新启动 如果父进程可以监视子进程的内存使用情况 以检测内存泄漏并在超出一定大小时重新启动子进程 那就太好了 我怎样才能做到这一点 您应该能够从 proc PID
  • 在 C++ linux 中将 STRINGS 写入串口

    我知道这个问题遍布互联网 但仍然没有任何东西能让我完全解决这个问题 我想用 C linux 将数据写入 Propeller 板的串行端口 从控制台获取输入时程序运行良好 但是当我向它写入字符串时总是返回 ERROR Invalid comm
  • 在 unix 中编译 dhrystone 时出错

    我是使用基准测试和 makefile 的新手 我已经从下面的链接下载了 Dhrystone 基准测试 我正在尝试编译它 但我遇到了奇怪的错误 我尝试解决它 但没有成功 有人可以帮助我运行 dhrystone 基准测试吗 以下是我尝试编译的两
  • Mcrt1.o和Scrt1.o有什么用?

    我坚持使用以下两个文件 即 Mcrt1 o 和 Scrt1 o 谁能帮我知道这两个文件的用途 如何使用它 我们以 gcrt1 o 为例 在使用 pg 选项编译进行性能测试时非常有用 谢谢 表格的文件 crt o总是 C 运行时启动代码 大部
  • 从 systemd bash 内联脚本创建 filename_$(date %Y-%m-%d)

    我正在尝试执行systemd计时器并希望将执行脚本的输出保存在每个日期的文件中 这是我的ExecStart脚本中的 service file ExecStart bin bash c echo date Y m d gt gt home u
  • 限制 Imagemagick 使用的空间和内存

    我在 Rails 应用程序上使用 Imagemagick 使用 rmagick 但我的服务器 Ubuntu 不是很大 当我启动转换进程时 Imagemagick 占据了我的服务器 30GB HDD 的所有位置 内存 我想限制内存和 tmp
  • 每个命令都返回“bash:<命令>:找不到命令...”[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我刚刚安装了 Scala 并添加了路径gedit bashrc export SCALA HOME home avijit sca
  • 如何在 GNU/Linux 上设置 Subversion (SVN) 服务器 - Ubuntu [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一台运行 Ubuntu 的笔记本电脑 我想将其用作 Subversion 服务器 既让我自己在本地承诺 也让其他人远程承诺 要使其
  • 后台分叉无法正常工作[重复]

    这个问题在这里已经有答案了 我运行这个程序 在前景和背景中 int main int pid printf App Start pid d n getpid while 1 pid fork if pid 0 printf Child n
  • 如何从 PROC 获取有关子进程的信息

    我正在尝试编写一个以几个进程作为参数的程序 然后父进程执行每个子进程并打印出一些相关的统计信息 示例 generate ls l 将生成一个程序 打印出有关 ls l 的一些统计信息 特别是其系统时间 用户时间和上下文切换次数 我不想使用
  • Fedora dnf 更新不起作用?

    当我尝试使用 update 命令更新 Fedora 22 时 sudo dnf update 我收到以下错误 错误 无法同步存储库 更新 的缓存 无法准备内部镜像列表 Curl 错误 6 无法解析主机名 无法解析主机 mirrors fed
  • linux命令中括号的用途是什么[重复]

    这个问题在这里已经有答案了 我在 Linux 终端中运行以下命令 谁能告诉我 Linux 终端中括号和以下命令的用途是什么 echo GET HTTP 1 0 echo 主机 www google com echo 数控 www googl
  • 为什么我的 Dockerfile CMD 不起作用?

    所以在我的 Dockerfile 的末尾我有这样的内容 WORKDIR home CMD django admin startproject whattt CMD bin bash 当我创建映像然后运行容器时 一切都按预期运行 没有错误 D
  • 无法在 64 位 Linux 上从汇编 (yasm) 代码调用 C 标准库函数

    我有一个函数foo以汇编语言编写 并在 Linux Ubuntu 64 位上使用 yasm 和 GCC 编译 它只是使用以下命令将消息打印到标准输出puts 如下所示 bits 64 extern puts global foo secti

随机推荐

  • 钉钉应用开发,提示Warning: Invalid CERT Authority

    我司的网页应用与钉钉进行了单点登录的对接 结果在钉钉App中打开提示SSL error 顶上的提示是Warning invalid CERT Authority 点击Yes可以正常访问 只是每次提示很麻烦 应用是Nginx Tomcat架构
  • 关于三通道彩色图像的存储方式理解

    像素值以 矩阵方式 保存 矩阵的大小取决于图像采用的颜色模型 灰度图 如果是灰度图 那么图像就是单通道的 图像中的每个像素只需要一个矩阵元素来保存 一般就是 0 255 的值 保存灰度图的矩阵长这样 其中 Row0 和 Column0 的交
  • 测试用例设计方法——等价类

    等价类 思路 输入的集合是无穷的 不能全部都覆盖到 依据需求将输入 特殊情况下会考虑输出 划分为若干个等价类 从等价类中挑选一个测试用例 如果这个测试用例通过 则认为所代表的等价类通过 这样就可以用较少的测试用例达到尽可能多的功能覆盖 解决
  • usart串口只能发送不能接收

    今天出了一个低级错误 记录一下 下次注意 我想用stm32做一个usart发送和接收的程序 目标 发送用的是usart1串口 接收用的是中断 当有数据发送给单片机的时候 会触发中断 中断函数中将接受到的数据再发送出去 程序非常简单 我就不放
  • SpringBoot项目捕捉@Validated下@NotBlank、@NotNull等注解抛出的异常

    java捕捉 Validated下 NotBlank NotNull等注解抛出的异常 使用场景 新增通用返回实体类 修改controller 实体类添加 NotBlank 新增WebConfig 新增WebExceptionHandler
  • C++学习总结(二十二)——类模板与友元(友元函数,友元类模板)

    一 类模板与友元 当友元函数在外部定义时 友元函数以及所属的类必须声明 友元函数放在类模板的内部时 友元函数可以直接调用 无需加类限定符 include
  • 使用boost库来计算文件夹的大小

    include
  • 投资学实务 期货日志及实践总结

    我的期货交易可以分为三个阶段 摸索阶段9 27 9 30 日期 单日净盈利 累计净值 单日回撤 9 27 14370 0 9707 0 03 9 28 29670 1 0295 0 9 29 11855 1 0517 0 9 30 1647
  • Acwing-27. 数值的整数次方

    由于本题的指数是int范围 可能很大 所以需要用快速幂 Acwing 875 快速幂 中有详细介绍快速幂 点击链接即可传送 求解 https blog csdn net weixin 43844521 article details 127
  • torch.cat过程中遇到的问题

    项目场景 有关深度强化学习过程中使用torch cat遇到的问题 问题描述 在学习MEC 使用深度强化学习改变卸载率的过程中 要将action和state通过torch cat合并的时候遇到的问题 第一个问题 torch cat当中直接使用
  • 在Vim(gvim)中使用cscope

    之前已经详细的介绍了在vim中使用ctags 这篇文章我们就来详细介绍一下如何在vim中使用cscope 首先 我们还是了解一下什么是cscope 简单来讲 cscope主要用来协助浏览C C 语言 他的功能要强大于ctags 不仅支持变量
  • python基础--除法、地板除、取余

    在Python中 有两种除法 一种除法是 gt gt gt 10 3 3 3333333333333335 除法计算结果是浮点数 即使是两个整数恰好整除 结果也是浮点数 gt gt gt 9 3 3 0 还有一种除法是 称为地板除 两个整数
  • libevent涉及的知识积累

    O 1 实现单链表插入删除 阅读libevent源码时发现了linux提供的一个链表 宏定义如下 define LIST ENTRY type struct struct type le next next element struct t
  • msvcp140.dll丢失的解决方法,win10系统dll报错的解决方法

    今天 我将为大家分享一个关于msvcp140 dll丢失的解决方法 特别是针对在Windows 10系统上遇到这个问题的朋友们 在开始之前 我想先简要介绍一下msvcp140 dll文件的作用 msvcp140 dll是Microsoft
  • linux怎么修改目录的所有者,linux修改文件或目录的所有者(chown)和用户组

    chown更改文件或目录的所有者 注意 所有者 必须存在于 etc passwd 下 比如 linux修改文件或目录的所有者 chown 和用户组 更改文件或目录的所有者命令 1 新建测试文件test 命令为 touch test 2 查看
  • 由于找不到msvcp140.dll无法继续执行代码”问题的解决方法

    DLL文件对于Windows上的应用程序至关重要 因为这些文件在运行时是必需的 如果没有这些文件 或者它们已经损坏 相应的应用程序可能会变得不稳定 或者根本无法运行 现在 让我们一起探讨 由于找不到msvcp140 dll无法继续执行代码
  • html提示框延时消失,JS实现提示效果弹出及延迟隐藏的功能

    自动登录勾选提示效果 要求 鼠标移入显示提示信息框 鼠标离开 信息框消失 消失的效果延迟Document sign display inline block width 15px height 15px border 1px solid c
  • 小白的高德地图初体验(一) —— 打点

    小白的高德地图初体验 一 打点 说到高德地图 肯定要推荐官方文档 传送门 走你 小白的高德地图初体验 一 打点 小白的高德地图初体验 二 点聚合 小白的高德地图初体验 三 轨迹 小白的高德地图初体验 四 矢量图形 小白的高德地图初体验 五
  • NetBeans下载安装

    1 下载 网址 Apache NetBeans Releases 2 安装 执行exe 选择安装目录和jdk
  • qemu搭建和运行起来一个linux内核环境

    qemu搭建和运行起来一个linux内核环境 参考了博客 搭建linux调试环境 一 qemu环境搭建vexpress开发平台 Edver 博客园 嵌入式Linux之QEMU模拟器 4 使用busybox制作根文件系统 ReCclay的博客