Skip to content

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

🕒 Published at:

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

结论 ​

ZTE B860AV1.1-T2 的 CPU (Cortex-A53) 是 64 位的,内核也编译成了 aarch64,但整个用户空间(Android + 工具链 + Debian chroot)全部跑在 32 位 ARM 模式下。

这不是 bug,是 Android 4.4.2 时代的正常设计。

证据 ​

# 内核是 64 位
$ uname -a
Linux localhost 4.1.18-svn103878 #1 SMP PREEMPT ... aarch64 GNU/Linux

# CPU 是 64 位
$ cat /proc/cpuinfo
Processor : ARMv8 Processor rev 4 (aarch64)
CPU part  : 0xd03          ← Cortex-A53

# 但用户态是 32 位
$ getconf LONG_BIT
32

# 动态链接器是 32 位
$ ls /lib/ld-linux*
/lib/ld-linux-armhf.so.3     ← 没有 aarch64 版本

# Android 只声明了 32 位 ABI
$ grep cpu.abi /system/build.prop
ro.product.cpu.abi=armeabi-v7a    ← 只有 32 位
ro.product.cpu.abi2=armeabi       ← 兼容旧 32 位

为什么会这样? ​

原因一:Android 4.4.2 不支持 64 位 ​

Android 的 64 位支持时间线:

Android 版本年份64 位支持
4.4 KitKat2013❌ 不支持
5.0 Lollipop2014✅ 首次支持
5.12015✅ 完善
6.0 Marshmallow2015✅ 成熟

ZX296716 搭载的是 Android 4.4.2(2013 年),这个版本:

  • 没有 64 位 ART 运行时(只有 Dalvik)
  • 没有 64 位 NDK 支持
  • 没有 64 位 linker(/system/bin/linker64)
  • Zygote 进程只启动 32 位版本

即使内核是 64 位的,用户空间的所有二进制文件(libc、linker、zygote、app)都是 32 位 ARM 编译的。

原因二:内核用 64 位是为了硬件能力 ​

Cortex-A53 (ARMv8) 的 64 位能力体现在:

能力32 位内核64 位内核
寻址空间最大 4GB理论上 256TB
通用寄存器15 个 (x0-x14)31 个 (x0-x30)
指令集AArch32AArch64
加密指令❌✅ AES/SHA 硬件加速
虚拟化需要额外扩展原生支持

ZTE 选择 aarch64 内核是因为:

  1. 性能:64 位指令集更高效,寄存器更多
  2. 未来兼容:为以后升级到 64 位 Android 预留
  3. 内核本身的需要:某些内核功能(如大页、更大的虚拟地址空间)在 64 位下更好

原因三:COMPAT 模式让 32 位程序透明运行 ​

ARM64 内核有一个叫 COMPAT 的机制:

ARM64 内核
├── AArch64 进程(64 位)  ← 当前没有
└── AArch32 进程(32 位)  ← 所有用户态都在这里
    ├── Android 系统服务
    ├── Zygote
    ├── 所有 App
    └── Debian chroot

内核在 64 位模式运行,但对 32 位程序提供完全透明的兼容层:

  • 系统调用号自动映射
  • 寄存器自动截断(64→32)
  • 内存布局自动调整(32 位地址空间)
  • 信号处理自动转换

所以用户态完全不知道自己跑在 64 位内核上,一切正常工作。

对我们的影响 ​

编译 Debian chroot ​

bash
# 应该用 armhf(32 位),不是 arm64
debootstrap --arch=armhf bookworm /data/debian http://deb.debian.org/debian

# 或者用 multiarch
dpkg --add-architecture armhf

编译内核模块 ​

bash
# 交叉编译时目标是 aarch64(内核是 64 位的)
aarch64-linux-gnu-gcc -C /path/to/kernel M=$(pwd) modules

# 但用户态工具是 32 位 ARM
arm-linux-gnueabihf-gcc -o mytool mytool.c

选择 rootfs ​

架构能用吗说明
armhf (arm32)✅当前使用,完全兼容
arm64 (aarch64)❌没有 64 位 linker,无法执行
i386 (x86)❌架构不同

一句话总结 ​

内核是 64 位的(为了利用 Cortex-A53 的硬件能力),但 Android 4.4.2 时代没有 64 位用户空间支持,所以整个用户态都是 32 位 ARM。这是 ARM64 过渡期的标准做法,不是设计缺陷。


作者: Xiaomi MiMo 日期: 2026-07-30 版本: 1.0