技术 | 64位MPU Linux环境下32位应用开发

来源: 瑞萨嵌入式小百科 作者:Gary Yin 2025-06-23 15:22:49

本文主要介绍基于瑞萨64位MPU RZ/G2L进行32位应用软件开发的介绍,用于解决客户32位软件移植相关问题,供客户参考。

  
很多客户在32bit开发平台迁移过程中,会遇到Linux应用程序移植问题,老平台应用程序是基于32bit ARMv7a处理器开发的,新平台通常是基于64bit的ARMv8a的MPU平台,比如RZ/G2L系列。有些客户误认为,切换到64bit Linux平台,必须重新开发64bit应用程序,其实并不是必须的。

  
首先,在硬件层面:

64bit ARMv8a MPU是能兼容32bit ARMv7a应用程序的,也就是ARMv8a体系支持32bit(AArch32)和64bit(AArch64)两套指令集,这两套指令集或者说是工作模式,会根据具体的32/64bit应用程序自动切换,这是指令集层面的兼容,不是模拟或者翻译,不会导致性能损失。这种设计,很大一部分原因,是为了保护客户在32bit老平台上面的投资。

  
其次,在软件层面:

64bit MPU的Linux kernel运行在特权模式,应用程序运行在非特权的用户空间。通常厂商仅仅移植64bit Linux kernel,如果移植32bit Linux kernel,很多底层64bit相关特性会不支持,特别是大寻址空间,而且只能支持32bit应用程序。64bit Linux kernel则能发挥MPU的全部性能,并能运行32bit和64bit应用程序(基于上述硬件层面的设计)。

  
ARM官方提供的ARMv8a相关设计框图如下:

ELx

ARMv8a引入的Exception Level,数字越大,特权越高,类似ARMv7a的异常模式,EL0最低,运行应用程序。

  
图中的AArch64 OS/AArch32 OS,指具体64/32bit操作系统kernel,通常是Linux kernel。OS运行于更高EL等级的Hypervisor的管理之下,AArch64 OS可以支持32或者64bit应用程序App,AArch32 OS则只能支持32bit应用程序。上面的设计,跟x86 Linux的设计非常相似,比如,64bit x86处理器也原生支持32bit和64bit两种应用程序,64bit Linux系统,也能直接运行32bit App,微软64bit Windows系统也是一样的,用户从来不用关心EXE是之前32位Windows下的老应用,还是新开发出来的64位应用软件,直接双击运行即可。个人认为,ARMv8a很大程度上参考借鉴了64bit x86处理器的设计思路,因为ARMv8a是在2012年左右发布的,而64bit x86处理器在2003年左右就上市了。

  
下面介绍一下64bit RZ/G2L相关内容。RZ/G2L官方发布的Yocto系统,里面已经提供了64bit Linux kernel,并且集成了64bit和32bit的各种库,还有适配好的64bit和32bit的工具链,在Yocto系统编译完成之后,以core-image-qt为例进行说明:

  
提取工具链安装包

MACHINE=smarc-rzg2l bitbake core-image-qt -c populate_sdk

  
安装工具链到本机

sudo sh poky-glibc-x86_64-core-image-qt-aarch64-smarc-rzg2l-toolchain-3.1.26.sh

  
通常安装到默认的/opt目录下,安装之后,如果需要使用工具链编译32bit源码,需要首先运行一个工具链所在目录的脚本:

即图中的environment-开头的脚本文件,对于32bit App开发,运行:

source /opt/poky/3.1.26/environment-setup-armv7vet2hf-neon-vfpv4-pokymllib32-linux-gnueabi

  
即可准备好32bit App开发环境,可以使用:echo $CC等命令查看,相关环境变量已经设置好:

另一个environment-开头的脚本,是用来设置64位App开发环境的。

 

另一方面,如果客户愿意往64bit应用移植,也是可以的,因为64bit模式下,可以使用更加强大的指令集,还有海量的寻址空间。但是面临的问题,主要是需要重新编译源代码,FPU相关配置选项可能失效,ARMv7a处理器的FPU相关配置是可选的,ARMv8a处理器则标配FPU,还有一点,就是代码里面指针的处理,32bit应用程序中,可能使用了不可移植的数据类型如unsigned int保存指针,这是可以的,但是不加修改,编译成64位应用程序的话,会出现警告或错误,地址数值截断了32位,肯定是不安全的。

  
如需了解更详细的使用方法请参考如下网站:

瑞萨官网

https://www.renesas.cn/cn/zh/products/microcontrollers-microprocessors/rz-mpus/rzg2l-getting-started

 

RZ产品WIKI网站

https://renesas.info/wiki/Main_Page  

0
收藏
0