首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在linux上使用qemu交叉编译arm程序集并模拟非OS arm环境

在Linux上使用QEMU进行交叉编译ARM程序集并模拟非操作系统(Non-OS)ARM环境的过程如下:

  1. 安装QEMU:首先,需要在Linux系统上安装QEMU模拟器。可以使用包管理器(如apt、yum等)来安装QEMU,或者从QEMU官方网站下载源代码进行编译安装。
  2. 获取ARM交叉编译工具链:为了在Linux上编译ARM程序集,需要获取ARM交叉编译工具链。可以使用Linaro提供的工具链,也可以使用其他第三方提供的工具链。安装工具链后,将其添加到系统的环境变量中。
  3. 编写ARM程序:使用任何文本编辑器编写ARM汇编或C语言程序。确保程序适用于非操作系统(Non-OS)环境,因为在QEMU中模拟的是非操作系统环境。
  4. 交叉编译ARM程序:使用ARM交叉编译工具链将程序编译为ARM可执行文件。例如,使用arm-linux-gnueabi-gcc编译C语言程序,或使用arm-linux-gnueabi-as和arm-linux-gnueabi-ld编译和链接汇编程序。
  5. 创建模拟器镜像:使用QEMU提供的工具(如qemu-img)创建一个空的模拟器镜像文件,该文件将用于模拟ARM环境。
  6. 将编译好的可执行文件复制到模拟器镜像中:使用QEMU提供的工具(如qemu-nbd)将模拟器镜像挂载到Linux系统中,并将编译好的可执行文件复制到模拟器镜像中的合适位置。
  7. 启动QEMU模拟器:使用QEMU命令行工具启动模拟器,并指定模拟器镜像作为启动参数。例如,使用以下命令启动ARM模拟器:
  8. 启动QEMU模拟器:使用QEMU命令行工具启动模拟器,并指定模拟器镜像作为启动参数。例如,使用以下命令启动ARM模拟器:
  9. 其中,path/to/kernel是模拟器镜像中的内核文件路径,path/to/image是模拟器镜像文件路径。
  10. 在模拟器中运行ARM程序:一旦模拟器启动,可以在模拟器中运行编译好的ARM程序。根据程序的类型,可以使用QEMU提供的命令行参数来运行可执行文件。

以上是在Linux上使用QEMU进行交叉编译ARM程序集并模拟非操作系统ARM环境的基本步骤。这种方法适用于开发和测试ARM程序,以及在非操作系统环境中运行ARM应用程序。对于更复杂的应用场景,可能需要进一步了解QEMU的高级功能和配置选项。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

多平台容器镜像构建就看这一篇

我们可以设想一个简单粗暴的,无视镜像的平台,强行把交叉编译出来的其它平台的二进制程序添加到镜像内,使用 Repository 名称或者 Tag 名称来区分不同平台的镜像,例如 coredns/coredns...交叉编译 在我们的 Golang 代码中没有使用 CGO 的时候,通过简单设置环境变量就能够交叉编译出其它平台和操作系统上能够执行的二进制文件。...本篇中,我们构建能够在 Linux 发行版中执行的容器镜像,所以编译目标系统环境变量GOOS统一设置为linux。执行代码段0-4中的命令构建出二进制文件备用。 // 代码段-04 #!...而使用 Linux 发行版操作系统的同学则需要自行安装配置 binfmt_misc,以便能够非原生的其它平台的镜像。 要在宿主机上执行其它 CPU 平台的指令,需要安装 QEMU 模拟器。...因为程序执行时会在当前程序可见的文件系统中查找动态库,而在容器或chroot环境中注册的处理程序在其它的 cgroup namespace 中可能无法找到,所以需要静态编译连接的QEMU。

2K50

一步步教你:在x86平台,如何用Qemu来模拟ARM系统

为什么需要ARM模拟系统 ARM平台的软件开发工作,可以划分为2类: 应用程序的开发 系统开发(内核、文件系统、驱动程序) 应用程序的开发 我们在开发嵌入式项目的时候,一般都是先在x86平台上把大部分的功能开发完成...,然后再交叉编译,得到在ARM平台的可执行程序或者库文件。...比如:Qemu可以模拟出一个ARM系统中的:CPU、内存、IO设备等,然后在这个模拟层之上,可以跑一台ARM虚拟机,这个ARM虚拟机认为自己在和硬件进行打交道,但实际上这些硬件都是Qemu模拟出来的。...以上这些场景中,都非常适合使用Qemu来模拟ARM系统。...安装交叉编译器 交叉编译器的作用就不需要详细解释了,因为我们是在x86平台上进行编译,而运行的平台是ARM系统,这2个平台的指令集不一样,所以需要交叉编译得到ARM系统上可以执行的程序。

15.2K30
  • 从零使用qemu模拟器搭建arm运行环境

    提醒:本文已有自动构建的项目支持,请移步到:再续【从零使用qemu模拟器搭建arm运行环境】 为什么会有这篇文章 早在2011年的时候,跟当时同事一起讨论,做Linux系统开发正处于整个Linux开发中间层...或者你像我一样,对内核机制关心,而不关心于具体的外设器件,最多是关心arm架构相关的功能,也可以使用qemu进行开发。 一句话:搭建qemu+arm环境,用于做内核开发和功能分析调试。...安装arm的交叉编译工具链 想必做嵌入式开发的朋友,对交叉编译工具链不陌生。如果你订制一个交叉编译工具链,建议你使用 crosstool-ng开源软件来构建。...但在这里建议直接安装arm的交叉编译工具链: sudo apt-get install gcc-arm-linux-gnueabi 编译Linux内核 生成vexpress开发板子的config...+arm开发环境,你可以上面的基础上修改内核,或者增加一些测试程序在单板上运行,甚至使用单板的flash设备。

    2.7K30

    Ubuntu上搭建arm虚拟运行环境

    没有开发板,如何调试运行arm程序? 本文主要讲解如何在Ubuntu上搭建arm交叉编译、运行环境。...一、安装交叉编译工具链 安装交叉编译工具链arm-linux-gnueabihf-gcc: sudo apt-get install gcc-arm-linux-gnueabihf 安装完毕,可以看到系统上已经新增了这么多交叉编译工具...BuildID[sha1]=7592a0494955ca8bb953948ea4cfbefc90b2e2e9, not stripped 二、安装arm模拟器qemu 安装arm模拟器qemu : sudo...可以看到,程序输出了正确的结果helloworld: helloworld@ubuntu:~$ qemu-arm a.out helloworld 说明:qemu可以模拟很多平台,不限于arm。...三、通过gdb调试arm程序 在Ubuntu上用gdb调试arm程序的原理:qemu端作为gdb server启动可执行程序,另一端作为gdb client连接gdb server,进行本地远程调试。

    5.3K31

    跨平台构建 Docker 镜像新姿势,x86、arm 一把梭

    通过模拟一个完整的操作系统,可以创建通用的 ARM 虚拟机,该虚拟机可以引导 Linux,设置开发环境,也可以在虚拟机内编译程序。...方法三:模拟目标硬件的用户空间 在 Linux 上,QEMU 除了可以模拟完整的操作系统之外,还有另外一种模式叫用户态模式(User mod)。...方法四:使用交叉编译器 最后介绍一种嵌入式系统社区常用的方法:交叉编译(cross-compilation)。...例如,amd64 架构的 Linux 系统上的 C++ 交叉编译器可以编译出运行在 aarch64(64-bit ARM) 架构的嵌入式设备上的可执行文件。...但交叉编译不具有通用性,它的复杂度取决于程序使用的语言,如果使用 Golang 的话,那就超级容易了。 在全民容器时代,我们讨论构建时不仅包括构建单个可执行文件,还包括构建容器镜像。

    42.5K119

    鸿蒙系统研究之三:迈出平台移植第一步

    OpenHarmony OS 2.0 发布时,标准系统只支持 Hi3516DV300 一种硬件平台,而 Android、IOS 均提供了模拟器供开发人员使用。...这也可以理解,毕竟华为长期以来都是设备供应商,专长是硬件,在软件开发方面缺少底蕴。鸿蒙应用开发提供了模拟器,但那是真机模拟器,需要接入到华为的开发平台才能使用。...在本文你将了解到: 如何为 OpenHarmony OS 2.0 标准系统增加新的产品定义; 如何将新的平台移植加入构建系统; 为模拟器编译出 Linux 内核; 常用的模拟器软件有 QEMU,能够模拟多种硬件型号...Makefile 中,指定交叉编译工具链,并进行内核编译,最后生成 zImage 镜像。.../build.sh --product-name vexpress-a9 --ccache 然后使用 QEMU 模拟器来启动内核: $ qemu-system-arm -M vexpress-a9 -

    2K50

    Docker多架构容器镜像构建方式

    跨平台开发:如果您正在开发需要在多个平台上运行的应用程序,例如ARM和x86,您可以使用buildx构建多架构Docker镜像并在不同架构上测试应用程序。...使用多架构容器镜像的好处 使用多架构容器镜像的几个优点是: 能够在多个 CPU 架构上运行 Docker 镜像 使我们能够选择环保的CPU架构 从一种架构无缝迁移到另一种架构 使用arm64获得更好的性能并节省成本...,负责模拟 CPU 指令集。...它还在后台使用 QEMU CPU 模拟。...构建多架构容器映像也需要时间,而在 QEMU 仿真上构建 arm64 会消耗大量时间和资源。 与本机运行二进制文件相比,在不同 CPU 上模拟运行二进制文件的性能明显较低。

    1.4K41

    使用QEMU搭建ARM64实验环境

    注:这篇文章是之前写的,当时最新内核版本是linux-5.9.2,不想做重复工作,现在基本上都使用linux-5.11内核讲解代码,但是qemu环境搭建基本一致,且本文暂不涉及虚拟化讲解。...2.交叉编译工具链的安装 工欲善其事必先利其器,搭建QEMU的模拟环境首先需要下载安装对应架构的交叉编译工具链(这里是arm64架构): 注:有时候需要安装一些依赖,根据提示安装即可!...4)共享文件 前面已经支持了主机和qemu上的系统共享目录,这个目录就是kmodules目录:通过mount可以查看被挂载到了qemu上的系统的/mnt目录下 在主机的内核源码目录的kmodules目录中...\n"); return 0; } 然后使用交叉编译工具链动态编译: $ aarch64-linux-gnu-gcc test.c -o test...可以发现被成功执行了,说明模拟出来的系统可以运行应用程序,而且可以使用动态链接库!!!

    3.3K20

    深入了解 Golang 多架构编译:交叉编译最佳实践

    最佳实践 3.1 多架构编译 以下是一个示例,你可以使用环境变量 GOOS 和 GOARCH 来为不同的平台编译你的程序,并生成适用于不同操作系统和架构的可执行文件。...,使得我们的应用程序能够在各种环境中运行。...3.3 安装和使用交叉编译工具链 对于一些架构,例如 ARM,你可能需要安装特定的交叉编译工具链。例如:在 CentOS X86 架构的环境上,编译 ARM 架构的应用。...aarch64-linux-gnu-gcc --version 5. 使用 ARM 工具链进行交叉编译 安装完成并验证工具链后,你可以使用这些工具链为 ARM 平台进行交叉编译。...7 amd64 上安装 ARM 工具链,并为 ARM 平台进行交叉编译。

    1.5K10

    使用 Docker Buildx 构建多种系统架构镜像

    提供了与 docker build 相同的用户体验,并增加了许多新功能。 BuildKit 是下一代的镜像构建组件,主要特点有很多,本文主要使用其可以编译多种系统架构的特性。...您可以使用 Buildx 和 Dockerfiles 支持的三种不同策略构建多平台镜像: 1 在内核中使用 QEMU 仿真支持 2 使用相同的构建器实例在多个本机节点上构建 3 使用 Dockerfile...中的一个阶段交叉编译到不同的架构 如果您的节点已经支持 QEMU,那么 QEMU 是最简单的入门方式(例如,如果您使用的是 Docker Desktop)。...要使binfmt_misc在主机操作系统上注册的 QEMU 二进制文件在容器内透明地工作,它们必须使用该fix_binary 标志进行注册。...启用 Buildx Docker在19.03引入了一个新的特性,使得Docker可以构建不同CPU体系结构的镜像,比如ARM镜像,这是不必引入模拟器的情况下,Docker自身所提供的原生统一构建机制,但是使用时需要进行设定才能进行使用

    1.7K20

    VVの嵌入式(一)开发环境搭建

    交叉编译系统的搭建 平台:Ubuntu32位虚拟机 目标平台:海思Hi3559V100 工欲善其事必先利其器,在进行嵌入式linux开发的时候需要搭建一个能够调试的环境,在电脑上无疑是最好最方便的了...至于虚拟机怎么搭建就不多说了,这里我用的32位的Ubuntu16.04主要是方便编译之前文章中自己写的OS 首先安装aarch64-linux-gnu工具链 apt-cache search aarch64...,所以虚拟机是非常有必要的,arm环境的模拟器用的qemu,还是老样子直接安装就好了。...sudo apt-get install qemu qemu-user-static 然后开始着手模拟一个base ubuntu的arm64环境 首先下载rootfs mkdir ~/rootfs &...(我这里是用windows去连接ubuntu linux的虚拟机的,在linux下执行也是同样的道理) 此时需要配置一下基本的工具环境 apt-get install net-tools network-manager

    1.4K40

    TKEStack适配ARM架构之路

    因为不同架构的指令集不一样,在一个架构下编译并生成的二进制可执行文件,包含的是这个架构下的指令,直接将这个可执行文件放到另一架构上运行,会报cannot execute binary file类似错误。...问题挑战 常规适配arm架构的做法就是在arm服务器上,把应用程序的编译、构建、打包的流程都走一遍,然后再将生成的arm组件包,跟x86的组件包分别命名,再打包一起交付给客户,然后部署时,由客户选择安装...容器技术:docker manifest list 在多个架构(x86 / arm)或者多个平台上(linux_amd64 / windows_amd64)上使用容器镜像时,就不得不提Docker公司在...QEMU可以模拟很多平台,所以只要想办法在构建跨平台的容器镜像时,将其他平台的可执行文件传递给QEMU,由QEMU模拟对应的平台并执行,就可以达到跨平台构建的目的。...所以只要在x86平台上安装QEMU模拟器,并在binfmt_misc中注册QEMU,让Linux遇到其他平台的执行文件时就传递给QEMU,这样就可以实现跨平台执行arm指令了。 5.

    2K21

    riscv64 qemu上进行Linux环境搭建与开发记录

    riscv64 qemu上进行Linux环境搭建与开发记录 1.本文说明 2.riscv64 qemu的编译 3.riscv64 交叉编译工具链准备 4.编译uboot 5.编译opensbi 6.编译...从上层到底层,从知其然到知其所以然,这必将是一个循序渐进的过程,本文梳理了一下riscv上的环境搭建方法(ubuntu18.04),让系统在qemu上正常的运行起来。...5.编译opensbi RISC-V Supervisor二进制接口(SBI)是针对RISC-V的一些底层的接口,有两种模式,在M模式下运行的特定于平台的固件,以S模式或HS模式执行的引导加载程序,管理程序或通用...简单的理解就是芯片的bios,通过该程序,可以加载不同的OS或者uboot。本文就将演示启动uboot的步骤。...其中的 Image 是上一章节编译完成后拷贝过来的,直接运行该目录下的start-qemu.sh脚本就可以看到系统正常的运行起来。 ? 输入root可以正常的进入Linux系统。

    3.7K11

    OS开发爱好者福利来了:树莓派上编译C语言,顺便掌握一波硬件知识

    此外,该教程假设你具有一定的 GNU/Linux 知识,对编译程序、创建磁盘和文件系统镜像有一定的了解。 对于为何选择树莓派 3,作者给出了解释:首先,它既便宜又容易买到。...预备知识 在开始前,你将需要在 FAT 文件系统上使用交叉编译器(有关详细信息,请参见 00_crosscompiler 目录)和带有固件文件的 Micro SD 卡。...但作者已经实现了,并将很快发布(更新:在 qemu2.12 中提供)(https://wiki.qemu.org/ChangeLog/2.12#ARM)。在此之前,你必须从最新的源代码编译 qemu。...当初始化完成时,通过执行 bootcode.bin,它将加载并执行 start.elf。这不是一个 ARM 可执行文件,而是专门为 GPU 编译的。...加载后,GPU 触发 ARM 处理器上的复位线,开始在地址 0x80000(或更准确地说是 0)处执行代码。

    1.3K40

    Android 渗透测试学习手册 第八章 ARM 利用

    8.2 建立环境 在开始利用 ARM 平台的漏洞之前,建议你建立环境。...即使 Android SDK 中的模拟器可以通过模拟 ARM 平台来运行,大多数智能手机也是基于 ARM 的,我们将通过配置 QEMU(它是一个开源硬件虚拟机和模拟器)开始 ARM 漏洞利用。...为了在 Android 模拟器/设备上执行以下所有步骤,我们需要下载 Android NDK 并使用 Android NDK 中提供的工具为 Android 平台编译我们的二进制文件。...但是,如果你使用 Mac 环境,安装 QEMU 相对容易,可以通过键入brew install qemu来完成。 现在让我们在 Ubuntu 系统上配置 QEMU。...ASLR 是由 OS 实现的安全技术,来防止攻击者有效地确定载荷的地址并执行恶意指令。 在 Android 中,ASLR 的实现始于 4.0。

    43630

    IoT漏洞研究(一)固件基础

    无法解析arm环境下的lua文件,但网上也有相应的工具,这里不再赘述。...可以看到真的搜索到了,而且也是一个表的结构: 根据基址找到在IDA pro中的位置: 可以看到完成了部分的交叉引用,后续分析比较复杂,这里就不再展开,实际上0x100位置是函数地址表,在该固件中这样表有很多...1.3.1 交叉编译 如果能从正向开发角度来打包当然最方便,也就是交叉编译的事。...此时可以直接用模拟工具运行该程序,只需考虑动态库是否能加载。 (二) 需要模拟固件shell,与整个系统有所交互。这里可以通过chroot改变根路径,并利用模拟工具执行/bin/sh。...值得注意的是,qemu在对程序黑盒测试时也经常使用,比如AFL的qemu_mode,在后面的篇章里我们会探讨,当然AFL同样可以使用unicorn_mode,使用的就是下面介绍的模拟器unicorn。

    2.8K10

    Linux中的binfmt-misc原理分析

    _64系统中运行arm64应用 先准备一个arm64架构的程序(可以使用go跨平台编译生成一个),执行后发现有报错: bash: ....这个偏移量将作为模拟器的一个参数 C: 表示credentials,这意味着模拟器将使用与原始程序相同的用户ID和组ID运行。...可以看出,qemu-aarch64-static是没有动态库依赖的,也就是说,docker必须使用静态编译的qemu才能工作。通过这种方式,可以实现在x86_64机器上编译跨架构镜像的目的。...因此,使用--platform linux/arm64参数就可以编译出arm64架构的镜像。...0x06 在Linux上运行Windows可执行文件 使用binfmt-misc机制可以支持直接在Linux上运行Windows的exe文件,这是通过wine来实现的。

    1.1K20

    Android模拟器识别技术

    其实,现在绝大部分手机都是基于ARM架构,其他CPU架构给忽略不计,模拟器全部运行在PC上,因此,只需要判断是运行的设备否是ARM架构即可。...无论是x86还是ARM,只要是静态编译的程序,都没有修改代码段的权限,所以,首先需要将上面的汇编代码翻译成可执行文件,再需要申请一块内存,将可执行代码段映射过去,执行。...通过arm交叉编译链编译出的可执行代码如下: 8410: e92d41f0 push {r4, r5, r6, r7, r8, lr} 8414: e3a07000...如果是在ARM上运行,e2844001处指令无法被覆盖,最终执行的是add r4,#1 ,而在x86平台上,执行的是add r7,#1 ,代码执行完毕, r0的值在模拟器上是1,而在真机上是10。...在32位真机上完美运行,但是在64位的真机上可能会存在兼容性问题,可能跟arm64-v8a的指令集不同有关系,也希望人能指点。

    3K40

    KVM最初的2小时——KVM从入门到放弃

    而ARM处理器也引入了类似的技术,在ARM的非安全模式之下,分为EL0这个level跑guest APP,EL1这个level跑GUEST OS,而EL2这个level跑VMM,完成各个guest OS...IO操作并进行模拟,由于所有的IO操作都会引发异常,最终陷入VMM,而VMM可以借由host OS之上运行的一个应用进行行为级模拟并最终调用Host OS的系统调用来完成最后的操作。...相似的,KVM 在 IO 虚拟化方面,就是使用 QEMU 这个应用软件的方式来模拟 IO 设备。 KVM是个什么鬼?...QEMU:修改过的为 KVM虚拟机使用的 QEMU 代码(称为qemu-kvm),运行在用户空间,除了提供硬件 I/O 设备的模拟,还通过对/dev/kvm设备执行IOCTL来和 KVM 交互执行创建虚拟机...QEMU提供了guest管理的功能、I/O转换的功能。 ? 在ARM处理器上,KVM内核组件的运行情况如下图: ? 而ARM V8.1 VHE支持后,则可以变成: ?

    1.2K20
    领券