AArch64是一个新的64位模式,它是ARMv8架构下的一部分,它于2011年随着ARM发布。它被逐步部署于智能手机和服务器。所以我认为现在学习一点关于此架构的知识是比较好的。
目前,有ARMv6/ARMv7的单板电脑是比较容易获得的,其中最流行的一个选择是树莓派。
相反,支持64位ARMv8模式的单板电脑就没有那么多了,但是它们最近也慢慢变得流行了起来。例如,Pine64,ODROID-C2, Dragonboard 410c, 等等。它们中的任何一种都可以做64位开发,但是对于指定电路板的系统开发还是有点不同。
注意:树莓派3有一个实现ARMv8 64位模式的CPU(Cortex-A53),技术上是能够运行一个64位系统。但是由树莓派基金会提供的软件系统只能运行32位,并且还没有官方计划提供64位系统
更新:SUSE由一个64位的OpenSUSE发布系统,该系统能够运行在树莓派3上。Arch也由一个64位的版本能够安装在树莓派3上。
是否意味着没有硬件则没办法运行AArch64?当然不,我们能够通过交叉工具链和用户模式下的QEMU做很多关于64位的事情。
只需要安装QEMU和一个AArch64的交叉工具链
$sudo apt-get install qemu-user gcc-aarch64-linux-gnu
现在测试你能运行一个"Hello world"的C程序。创建一个hello.c,并在该文件中写入以下的代码。
#include
int main(int argc, char *argv[])
{
printf("Hello AArch64!\n");
return 0;
}
现在用前面我们安装过的AArch64的交叉编译器编译它(-static标志很重要)
$aarch64-linux-gnu-gcc -static -o hello hello.c
检查它是一个AArch64的二进制
$ file hello
hello: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, for GNU/Linux 3.7.0, BuildID[sha1]=97c2bc66dbe4393aab9e4885df8e223a6baa235a, not stripped
尝试去运行它应该会有一些令人迷惑的错误导致的失败
$ ./hello
-bash: ./hello: No such file or directory
但是我们能够用先前安装的AArch64下的QEMU运行它
$ qemu-aarch64 ./hello
Hello AArch64!
耶!
注意:如果你使用这个选项,记得总是使用qemu-aarch64去运行你的程序。
让我们写一个非常简单的程序,该程序只是返回一个2的错误码
//first.s
.text
.globl main
main:
mov w0, #2
ret
让我们编译它
$aarch64-linux-gnu-as -c first.s
现在链接它,为了方便起见,我们会用gcc
$aarch64-linux-gnu-gcc -static -o first first.o
运行它,并且检查返回值
$ ./first # or use qemu-aarch64 ./first
$ echo $?
2
是的!
让我们回顾一下上面的每行代码
//first.s
.text
行1是一个在例子中使用的文件名的注释。任何一个跟随“//”的行都是注释,并且会被忽略。行2是一个汇编指示器,该指示器意思是“现在来到了程序的指令”。这是因为我们能在汇编器文件中表达数据。(数据在.data指示之后)
.globl main
这时另一个汇编器指示,该指示表明main
是一个全局符号。这也意味着当构建一个最终的程序,这个文件会有一个全局的main
标志,而这个标志是C库开始运行程序的地方
main:
mov w0, #2 //w0 ← 2
ret // return
这时我们程序的入口。第六行是main
标志(如上所述是一个全局的标志)。第七行和第八行是2个指令。第一个指令是设置寄存器w0里面的值为2(我们会在下一张看到什么是寄存器)。第二句式从main
函数返回,我们的程序立刻结束。
当一个函数结束,w0
寄存器内的内容被用来决定程序的错误码。这就是echo $0
为什么会打印2。
有关AArch64的相关文献可以在下面网址找到 ARM® Architecture Reference Manual ARMv8, for ARMv8-A architecture profile
这就是今天的内容。