历史上的今天
今天是:2024年12月25日(星期三)
2019年12月25日 | 在ARM64位开发板上兼容ARM32位的可执行程序
2019-12-25 来源:eefocus
在嵌入式开发时,经常会通过编译busybox来制作rootfs,然后在上面跑可执行程序。那么如何通过修改配置,让一个rootfs同时兼容32位和64位的可执行程序呢?
我们知道,如果EL1运行在64位时,那么EL0既可以运行在64位,也可以运行在32位。具体到这里,我们让内核运行在64位(EL1),然后在EL0运行64位或者32位的可执行程序,在加载32位的可执行程序时,会先陷入Linux内核(EL1),然后通过解析elf文件发现EL0要运行在32位模式,那么在eret异常返回到EL0时会通过SPSR将当前cpu切到32位模式运行。

正文
1、配置linux kernel
使kernel支持在EL0上运行32位可执行程序:(arch/arm64/Kconfig中)
config COMPAT
bool "Kernel support for 32-bit EL0"
depends on ARM64_4K_PAGES || EXPERT
select COMPAT_BINFMT_ELF if BINFMT_ELF
select HAVE_UID16
select OLD_SIGSUSPEND3
select COMPAT_OLD_SIGACTION
help
This option enables support for a 32-bit EL0 running under a 64-bit
kernel at EL1. AArch32-specific components such as system calls,
the user helper functions, VFP support and the ptrace interface are
handled appropriately by the kernel.
If you use a page size other than 4KB (i.e, 16KB or 64KB), please be aware
that you will only be able to execute AArch32 binaries that were compiled
with page size aligned segments.
If you want to execute 32-bit userspace applications, say Y.
具体是在:Userspace binary formats --> Kernel support for 32-bit EL0
然后重新编译内核
2、配置根文件系统
这一步需要视情况而定,如果32位的可执行程序采用的是静态链接的,那么此时应该就可以直接运行。如果采用的是动态链接,那么就需要专门的设置了。
在rootfs的根目录下创建/lib32目录,然后将要用到的32位的动态库拷贝到其中
设置LD_LIBRARY_PATH环境变量,将刚才的路径添加到其中:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib32
进入/lib目录,在其中创建一个指向/lib32/ld-linux-armhf.so.3的软连接:ld-linux-armhf.so.3

3、测试
运行32位可执行程序
在64位系统里运行一个32位的测试程序:

然后可以查看其虚拟内存地址分配

运行64位可执行程序

查看其地址分配:

完。
史海拾趣
|
急问:MP3电路原理图!请教高手,帮我分析下这个MP3原理图中各个组成部分的原理、处理器的功能。 http://blog.ednchina.com/Upload/Blog/2007/3/30/826adf84-7829-4de7-8065-2149d80d0c85.jpg 请高手帮我分析下这个MP3原理图中各个组成部分的原理、处理器的功能。 谢谢!… 查看全部问答> |
|
求助Could not find file 'C:\WINCE500\PBWorkspaces\e\RelDir\Geode_x86_Release\MyDri Could not find file \'C:\\WINCE500\\PBWorkspaces\\e\\RelDir\\Geode_x86_Release\\MyDriver.exe\' on disk 在生成操作系统镜像的时候出现的问题 怎么解决啊 是编译的过程中出现的问题 … 查看全部问答> |
|
弱弱的问一个问题,Windows中的WinInet API在Window Mobile中能用吗? 例如HttpSendRequest、InternetReadFile之类的函数。 如果不可以,是否手机就不能通过http协议请求某个服务器的数据?… 查看全部问答> |
|
我的2812芯片flash写入了一次之后,就没办法写了怎么回事的?CCS连接之后点on-chip flash programmer,对话框全是灰色的,只有一个onlock按钮可以点,但是点了之后弹出unlock failed,CCS提示解锁失败,设备锁定。 但是上次烧写的时候我并没有改动 ...… 查看全部问答> |
|
在移植mtd-utils时遇到个问题,就是使用nandwrite写入文件系统的映像(jffs2格式)时,出现:Unknown flash (not normal NAND)错误,通过查看源码,这个错误是在程序中检测flash的页面大小处打印的, /* Make sure device page sizes are val ...… 查看全部问答> |
|
我正在学DSP,有几个问题: 关于C5416 外扩的FLASH型号该怎么选择,做音频处理的话,一般用什么型号的FLASH? C5416如何跟FLASH连接? 如何读取数据及存储数据? 希望和各位DSP的大牛们能帮帮我,非常感谢!… 查看全部问答> |
|
本人刚开始学uCOS系统,现在有一块S3C44B0X的板子,想把uCOS移植进去,于是在网上找了一些基于S3C44B0X的uCOS源码,但是不知道如何运用编译器把源码处理,自然也就不知道怎么把内核系统烧进板子,现在不知道如何下手,而且在网上找的资料都没有运用 ...… 查看全部问答> |
|
Pca采集的问题: 单片机C8051F120 我用Pca采集脉冲传感器个数,为什么进入单片机只有一个脉冲,而采集出来的是很多个呢?? Pca初始化: PCA0L = 0x00; PCA0H = 0x00; &nb ...… 查看全部问答> |




