需求来源于如何构建arm平台的Ubuntu文件系统。

我们希望在ARM开发板上使用Ubuntu系统,那么就需要构建一个Ubuntu的根文件系统,然后可基于该基础文件系统,进一步扩展开发。比如,可以使用不同的桌面版本,安装需要的arm源安装包等。

当然,也可能是,大部分的需求更多来源于如何在host系统上构建arm环境,编译arm程序。

殊途同归,问题都归结为一点,即如何在host系统上构建arm模拟环境

从上述构建文件系统需求出发,查找资料。发现,搜索到的资料无一例外的都提到了chroot命令和qemu-arm-static安装包。

具体思路是,先安装qemu-arm-static安装包,然后构建一个目标平台的根文件系统(其实是根文件系统目录,包含有常规的一些可执行程序)。我们将该根文件系统作为基础裸根文件系统。这一基础根文件系统可从Ubuntu官网上下载。注意,这个基础根文件系统里面自带的arm平台程序,是在ubuntu官网上打包好的,我们只需要根据硬件平台特点,下载对应的包解压即可。比如是32位还是64位,是否支持硬件浮点计算等。如果你有自己待验证的程序,也可以放进去,只要保证是基于对应硬件平台的交叉工具链编译的。

https://ubuntu.com/

有了上述基础文件系统目录后,还需要将主机的proc  sys  dev  pts等目录挂载到目标文件系统对应的路径下,最终实际切换到目标系统硬件上时,proc  sys等是所在目标硬件上运行的内核生成的,设备目录也是目标硬件内核动态监测生成或者极少的是通过应用层udev工具生成。这些东西并不天然的包含在镜像文件中。

也就是到时候,这些目录下的系统信息和设备信息还是基于主机系统的,这样便于我们做一些操作,毕竟是模拟的。后面了解模拟器工作原理后,你就可以更深刻的理解这一点。

之后,将安装qemu-arm-static后下载的usr bin目录下的qemu-arm-static 或者qemu-aarch-static程序拷贝到目标文件系统对应目录下。

至此,我们在host上构建了一个目标平台的根目录,这个根目录包含三部分:

1 原始的ubuntu系统的基于arm平台的基础程序

2 主机host系统挂载过去的proc 和 sys等目录

3 下载的qemu-arm-static或aarch(64位)对应目录下的程序

上述工作准备好后,执行chroot切换到目标平台根目录。如此,即切换到arm环境,也就是qemu构建的模拟器环境

按照上述流程执行,确实进入了arm模拟器环境。但是疑问来了,chroot是怎么就切换到arm模拟器环境了,这中间到底发生了什么?

chroot本身是一个命令,可以完成根文件目录的切换,也就是将新的目录作为根目录,挂载到系统中。

这样做,就构建了一个比较弱的隔离环境。说是比较弱的,是因为此时只是根目录相关的路径变换了,而系统的很多内部资源仍然是全局可见的。

当然,需求本身就是多样的,如果用户只是想在独立的目录下进行编译安装更新等操作,chroot的功能则很好的契合了这种需求,再多一些隔离操作,反而显得多余了。

但是,仅从切换根目录路径这一点来看,chroot似乎还不至于完成平台的切换。再多一点细节,chroot切换根目录后,会默认执行bash程序,构建新的交互环境。当然,调用者也可以指定要执行的程序。

那从这个逻辑思路来走的话,chroot只能完成将根目录切换到为arm环境准备的根目录,并执行arm环境根目录下的bash程序。且这个bash程序应该是基于arm指令的,不能够成功执行才对。

但是我们看到实际结果是成功切换到arm模拟器环境了。

这中间的中间发生了什么?一定是有一个纽带,完成了关联

再回到原始流程上,除了chroot外,我们发现,需要安装qemu-arm-static并拷贝这个程序到目标平台的usr bin 目录下,即跟其安装目录一致。为什么会有这个要求

再继续搜索资料。

https://blog.csdn.net/weixin_35511255/article/details/117550321中提到了binfmt_misc,

https://hblok.net/blog/posts/2014/02/06/chroot-to-arm/ 外部的一些资料也提到了,之前看资料时,对这些忽略了。

查看binfmt_misc的说明,大意是一个二进制格式的适配系统。类似windows平台上,根据后缀选择或者说匹配执行程序这样一个功能。

而linux下的这个系统,也具有这个功能,而且不仅可以通过后缀匹配,还可以根据文件魔术字段匹配。

查看系统下该目录下的相关信息

root@ubuntu:/proc/sys/fs/binfmt_misc# ls -ltotal 0-rw-r--r-- 1 root root 0 Nov 23 19:47 python2.7-rw-r--r-- 1 root root 0 Nov 23 19:47 python3.6-rw-r--r-- 1 root root 0 Nov 23 19:47 qemu-aarch64-rw-r--r-- 1 root root 0 Nov 23 19:47 qemu-alpha-rw-r--r-- 1 root root 0 Nov 23 19:47 qemu-arm-rw-r--r-- 1 root root 0 Nov 23 19:47 qemu-armeb-rw-r--r-- 1 root root 0 Nov 23 19:47 qemu-cris-rw-r--r-- 1 root root 0 Nov 23 19:47 qemu-m68k-rw-r--r-- 1 root root 0 Nov 23 19:47 qemu-microblaze-rw-r--r-- 1 root root 0 Nov 23 19:47 qemu-mips-rw-r--r-- 1 root root 0 Nov 23 19:47 qemu-mips64-rw-r--r-- 1 root root 0 Nov 23 19:47 qemu-mips64el-rw-r--r-- 1 root root 0 Nov 23 19:47 qemu-mipsel-rw-r--r-- 1 root root 0 Nov 23 19:47 qemu-ppc-rw-r--r-- 1 root root 0 Nov 23 19:47 qemu-ppc64-rw-r--r-- 1 root root 0 Nov 23 19:47 qemu-ppc64abi32-rw-r--r-- 1 root root 0 Nov 23 19:47 qemu-ppc64le-rw-r--r-- 1 root root 0 Nov 23 19:47 qemu-s390x-rw-r--r-- 1 root root 0 Nov 23 19:47 qemu-sh4-rw-r--r-- 1 root root 0 Nov 23 19:47 qemu-sh4eb-rw-r--r-- 1 root root 0 Nov 23 19:47 qemu-sparc-rw-r--r-- 1 root root 0 Nov 23 19:47 qemu-sparc32plus-rw-r--r-- 1 root root 0 Nov 23 19:47 qemu-sparc64--w------- 1 root root 0 Nov 23 19:47 register-rw-r--r-- 1 root root 0 Nov 23 19:47 statusroot@ubuntu:/proc/sys/fs/binfmt_misc#

可以看到qemu注册到里面,所以qemu是使用了该系统。

那么现在可以猜测,qemu安装时应该是注册了对arm架构程序的支持。也就是,如果目标文件是arm架构的(通过可执行文件里的magic字段匹配),则使用其对应的程序来解释执行。

这里的register文件只能写,不能读,但是其他文件提供了注册的信息。我们来看看

root@ubuntu:/proc/sys/fs/binfmt_misc# cat qemu-armenabledinterpreter /usr/bin/qemu-arm-staticflags: OCoffset 0magic 7f454c4601010100000000000000000002002800mask ffffffffffffff00fffffffffffffffffeffffff
root@ubuntu:/proc/sys/fs/binfmt_misc# cat qemu-aarch64 enabledinterpreter /usr/bin/qemu-aarch64-staticflags: OCoffset 0magic 7f454c460201010000000000000000000200b700mask ffffffffffffff00fffffffffffffffffeffffffroot@ubuntu:/proc/sys/fs/binfmt_misc#

可以看到,这两个应该都是通过magic过滤的,并且enable了。我们记下这里的magic头几个字节内容,后面会用到。7f 45 4c 46

我们执行以下arm架构的程序看看

root@ubuntu:/proc/sys/fs/binfmt_misc# /home/work/Ubuntu/bin/bash /lib/ld-linux-aarch64.so.1: No such file or directory

提示的是动态链接库找不到。

status文件提供了全局的使能功能,我们关闭所有匹配,再来看看

root@ubuntu:/proc/sys/fs/binfmt_misc# echo 0 > status root@ubuntu:/proc/sys/fs/binfmt_misc# root@ubuntu:/proc/sys/fs/binfmt_misc# cat status disabledroot@ubuntu:/proc/sys/fs/binfmt_misc# /home/work/Ubuntu/bin/bash bash: /home/work/Ubuntu/bin/bash: cannot execute binary file: Exec format errorroot@ubuntu:/proc/sys/fs/binfmt_misc#

此时执行提示的是格式不对,不是库找不到了。到此,我们可以总结出,enable时,虽提示库找不到,但那是程序运行过程的错误,说明程序的格式匹配是成功了,只是在当前文件系统路径下,无法找到对应的动态库。而disable后,一开始就是可执行文件是无法运行的。

这就说明,chroot本身的功能并没有差异,当切换路径后,执行默认bash程序时,系统判断到是arm文件(通过qemu注册的匹配检测),就调用usr  bin目录(上述注册信息中使用的,这也是为啥要拷贝到对应目录的原因)下的qemu模拟器程序来执行

最终,模拟器程序将arm指令翻译为host系统的x86指令,进行执行,从而完成模拟执行。

bash执行时及之后所有调用链上的程序都是由上述模拟器程序模拟后在主机系统中执行的。

如此,就完成了一种弱的平台环境暂时切换的功能。

为了进一步的验证,我们看看arm平台下bash程序的开头几十个字节

root@ubuntu:/proc/sys/fs/binfmt_misc# hexdump -n 64 /home/work/Ubuntu/bin/bash0000000 457f 464c 0102 0001 0000 0000 0000 00000000010 0003 00b7 0001 0000 2610 0003 0000 00000000020 0040 0000 0000 0000 83a0 0012 0000 00000000030 0000 0000 0040 0038 0009 0040 001b 001a0000040

可以看到 45 7f 46 4c等几个字节,跟前面注册里的magic可以匹配上,问题得到验证。

chroot应该只是切换当前的shell,甚至跟用户都非强绑定,当前shell切换到arm模拟器环境后,我们还可以继续登录原始host,在原始host的正常目录下进行正常的操作。

在当前shell中执行exit就退出chroot切换的环境,回到host系统。至此,进出模拟器的过程就通过chroot命令完成了。

有了上面的基础,我们就可以在arm模拟器中安装arm包,然后做出属于自己的定制跟文件系统,将其刷机到自己的开发板,实现自己的专属系统。

ENJOY......

盗梦空间:在X86平台上构建ARM模拟器相关推荐

  1. 云上的云:AVOS Cloud在云平台上构建云服务的经验分享

    2019独角兽企业重金招聘Python工程师标准>>> 云上的云:AVOS Cloud在云平台上构建云服务的经验分享 AVOS Cloud作为国内领先的云后端服务提供商,为移动应用开 ...

  2. OpenCASCADE:Windows平台上构建OCCT使用的第三方库

    OpenCASCADE:Windows平台上构建OCCT使用的第三方库 OpenCASCADE:Windows平台上构建OCCT使用的第三方库 Tcl/Tk 从源安装:Tcl 从源安装:Tk Free ...

  3. 如何在低代码平台上构建ERP软件

    ERP软件是企业管理日常运营需求的关键组件.然而,对于许多企业,尤其是资源有限的企业来说,尝试构建和管理ERP平台可能要担负较高的成本的.幸运的是,低代码平台可以使这个过程变得容易得多.今天我们来解释 ...

  4. 管家婆 源码 php,在windows平台上构建本身的PHP

    这是一篇翻译的文章,原文拜见:https://wiki.php.net/internals/windows/stepbystepbuild 趁便提一句,wiki.php.net有很多出色的内容,想深切 ...

  5. hsf传输文件到linux,x86 平台上的 Linux到 SPARC 平台上的 Solaris的说明

    x86平台上的Linux到SPARC平台上的Solaris的说明 关于本次移植的说明 由于目前没有Solaris开发环境,移植过程,主要是参考本文档的说明.具体是对函数调用.字节序列.数据类型.内存对 ...

  6. 在百度开放云平台上构建Web App

    在3月23日的百度开发者大会上,百度推出了开放云计算平台来帮助开发者构建分布式网络应用.它包括云存储.云环境.关系服务.消息服务等组成部分,开发者可以利用云平台方便的编写分布式网络应用,无需考虑集群扩 ...

  7. oracle禁用系统用户登录,关闭系统 - 在 x86 平台上引导和关闭 Oracle Solaris

    关闭系统 以下过程和示例说明如何使用 shutdown 和 init 命令关闭系统. 如何确定登录到系统的用户 对于作为多用户分时系统的 Oracle Solaris 系统,关闭系统前可能需要确定是否 ...

  8. 在X86平台上安装摄像头驱动及应用

    http://mxhaard.free.fr处下载的需的驱动,内核版本是2.6.11以上的用gspca,2.6.11以下的用spca5xx(这也不是绝对的,因为我曾在2.6.17下也驱动成功过). 目 ...

  9. Linux为什么可以在x86平台上运行,考虑在x86/Linux平台上的应用程序,以下指令执行时可能......

    已知某程序部分代码及其反汇编后的机器级代码如下: void add (int x, int y, int *z ) { ...... *z = x + y; 8048469:8b 55 08 mov ...

最新文章

  1. 新网站如何推广 新建设的网站如何宣传
  2. 佛山居住证办理(首次)
  3. 2021夏季每日一题 【week5 完结】
  4. 洛谷 P3374 【模板】树状数组 1
  5. Bootstrap模态框垂直高度居中问题
  6. MVC2验证(自定义异常)
  7. JPA –我应该成为懒惰的极端主义者吗?
  8. 【STM32】【STM32CubeMX】STM32CubeMX的使用之七:定时器输入捕获实现超声波测距
  9. 虚拟机设置固定ip,ping不通,xshell无法连接
  10. python爬虫百度文库源码_Python爬取百度文库学习
  11. apicloud开发之使用usb真机同步到安卓虚拟机
  12. linux下的遥控器软件下载,万能遥控器软件
  13. 串口服务器通讯协议,串口服务器的组成和应用实例
  14. synchronized-锁总结
  15. 8.7.1. Declaration of Enumerated Types
  16. 推荐系统之隐语义模型(LFM)及Python实现
  17. ubuntu系统中的好用的键盘指法及打字练习软件
  18. 【GCC】warning: pointer targets in passing argument 1 of 'strlen' differ in signedness
  19. 高精度练习之超大整数开根
  20. 阿里云短信服务不对个人开放?如何在阿里云市场免费购买短信服务?云市场购买到的短信服务如何使用?(以谷粒学院项目为例)

热门文章

  1. C#使用WinExec调用exe程序
  2. Havok物理引擎与Unity3D游戏的结合
  3. 重装系统:电脑进入BIOS方法大全!!
  4. Oracle DCD
  5. mvc中Scripts.Render、Styles.Render
  6. 埃文科技推出免费区县级别IP地址定位库 提升IP地址定位行业标准
  7. oracle添加外键约束
  8. 郑码词库制作for百度输入法
  9. ruijie交换机lacp动态_华为、华三交换机端口聚合与静态LACP、动态LACP汇聚
  10. java中的IO流之序列化与反序列化(对象数据和文件的读写交互)