目前市面上大部分处理器都是64位的,我们知道32位的程序可以无缝的运行在64位系统上。那么一个32bit的程序如何在64位的系统上运行呢?
一 cpu支持
目前主流的arm 和x86 64位的CPU对于32bit指令是无缝兼容的,所以32bit bin运行在64bit CPU上是没有问题的。

二 应用库支持
如果应用的elf文件为32bit,那么他依赖的库必须也是32bit,这就要求在/lib下也有一套32位的支持库,常见的32bit 64bit都支持的系统中会看到两套库,一套是/lib一套是/1ib64
三 Kernel支持
32bit的应用程序运行32bit的指令,32bit的用户空间,由于Kernel是64bit的,kernel如何支持32bit的调用呢?
以我们使用的close调用为例,其libc的syscall调用指令如下:
ENTRY(___close)
mov ip, r7
.cfi_register r7, ip
ldr r7, =__NR_close
swi #0
mov r7, ip
.cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
b __set_errno_internal
END(___close)
.hidden ___close
使用swi软中断进入到kernel模式,那么如何将32_EL0进入到64_EL1级别呢?

从上面的图可以看出,在64bit的中断向量表中有一部分是预留给32使用,比如我们使用的swi在此处切换为SVC。至此完成了64bit kernel空间的进入。
四 地址空间
如果我们通过系统调用返回地址空间给user,由于User部分使用的是32bit的地址空间,那么32bit的app如何进行进程空间的映射呢?
先看一下64bit MMU的vmm的内存分配

“Any 32-bit code will of course be limited to operating in the first 4 GB of address space, and as such the hardware will automatically zero-extend the virtual address into any elevated 64-bit call.
”
从上面的话可以看出,32bit的app用户空间生长在0~4G起始的空间中。
网友评论