尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

为什么 64 位内核跑 32 位用户态?

为什么 64 位内核跑 32 位用户态? 设备ZTE B860AV1.1-T2Cortex-A53系统Android 4.4.2内核 4.1.18现象这台设备上有一个看起来矛盾的现象text# uname -a Linux localhost 4.1.18 ... aarch64 GNU/Linux # cat /proc/cpuinfo Processor : ARMv8 Processor rev 4 (aarch64) # getconf LONG_BIT 32 # ls /lib/ld-linux* /lib/ld-linux-armhf.so.3CPU 是 64 位的内核也是 64 位的但用户态程序却是 32 位的。动态链接器是ld-linux-armhf.so.3ARM 32 位没有ld-linux-aarch64.so。原因这不是 bug是 Android 4.4.2 时代的正常现象。1. Android 4.4 不支持 64 位用户态Android 的 64 位支持是逐步引入的Android 版本年份64 位用户态4.4 KitKat2013❌ 不支持5.0 Lollipop2014✅ 首次支持6.0 Marshmallow2015✅ 成熟ZX296716 搭载的是 Android 4.4.2这个版本没有 64 位 ART 运行时没有 64 位 NDK 支持没有 64 位 linker/system/bin/linker64所以即使内核可以编译成 64 位用户空间所有二进制文件libc、linker、zygote、app都只能编译成 32 位 ARM。Android 的build.prop里只声明了 32 位 ABItextro.product.cpu.abiarmeabi-v7a ro.product.cpu.abi2armeabi没有arm64-v8a。2. 64 位内核是有意义的Cortex-A53 是 ARMv8 架构64 位内核相比 32 位内核有几个优势更大的寻址空间4GB更多通用寄存器31 个 vs 15 个原生 AES/SHA 加密指令更好的虚拟化支持所以 ZTE 选择把内核编译成 aarch64是为了利用硬件能力但用户态受限于 Android 版本只能用 32 位。3. COMPAT 模式ARM64 内核有一个 COMPAT 机制让 32 位程序在 64 位内核上透明运行textARM64 内核 ├── AArch64 进程64 位 ← 目前没有 └── AArch32 进程32 位 ← 全部用户态在这里内核自动处理32 位系统调用号映射寄存器高位截断32 位地址空间布局信号处理转换用户态程序不知道自己跑在 64 位内核上。影响编译软件编译 Debian/Ubuntu chroot 时bash# 正确32 位 ARM debootstrap --archarmhf bookworm /data/debian # 错误64 位 ARM无法执行 debootstrap --archarm64 bookworm /data/debian编译内核模块bash# 内核模块aarch64 aarch64-linux-gnu-gcc -C /path/to/kernel M$(pwd) modules # 用户态程序armhf arm-linux-gnueabihf-gcc -o mytool mytool.c可用的 rootfs 架构架构能用吗armhf32 位✅arm6464 位❌无 linkeri386 / amd64❌架构不同总结内核编译成 64 位是为了利用硬件能力用户态只能跑 32 位是因为 Android 4.4 不支持 64 位应用。这在 ARM64 过渡期2014-2015 年的设备上是很常见的配置。对于无头服务器用途来说32 位用户态主要影响的是包管理器的架构选择只能用 armhf实际性能差异不大。
返回列表