AArch64教程第一章

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位的事情。

Ubuntu 16.04的例子

只需要安装QEMU和一个AArch64的交叉工具链

$sudo apt-get install qemu-user gcc-aarch64-linux-gnu

现在测试你能运行一个"Hello world"的C程序。创建一个hello.c,并在该文件中写入以下的代码。

#include <stdio.h>
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去运行你的程序。

我们第一个AArch64的编译程序

让我们写一个非常简单的程序,该程序只是返回一个2的错误码

//first.s
.text
.globl main
main:mov w0, #2ret

让我们编译它

$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 ← 2ret        // return

这时我们程序的入口。第六行是main标志(如上所述是一个全局的标志)。第七行和第八行是2个指令。第一个指令是设置寄存器w0里面的值为2(我们会在下一张看到什么是寄存器)。第二句式从main函数返回,我们的程序立刻结束。

当一个函数结束,w0寄存器内的内容被用来决定程序的错误码。这就是echo $0为什么会打印2。

参考文献

有关AArch64的相关文献可以在下面网址找到 ARM® Architecture Reference Manual ARMv8, for ARMv8-A architecture profile

这就是今天的内容。

AArch64教程第一章相关推荐

  1. javascript进阶教程第一章案例实战

    javascript进阶教程第一章案例实战 一.学习任务 通过几个案例练习回顾学过的知识 通过练习积累JS的使用技巧 二.实例 练习1:删除确认提示框 实例描述: 防止用户小心单击了"删除& ...

  2. 北大青鸟c语言课后答案,北大青鸟C语言教程--第一章 C语言基础.ppt

    <北大青鸟C语言教程--第一章 C语言基础.ppt>由会员分享,可在线阅读,更多相关<北大青鸟C语言教程--第一章 C语言基础.ppt(20页珍藏版)>请在人人文库网上搜索. ...

  3. 乐行学院Redis5学习教程 第一章redis5的安装

    乐行学院Redis5学习教程 第一章redis5的安装 1.安装虚拟机 2.centeros下载 3.vmware安装centeros 4.vmware安装centeros设置IP 5.安装redis ...

  4. laravel教程 第一章安装laravel

    #laravel教程# ##第一章 安装laravel## ###前言 ### 有很多人,都在纠结于自己学什么框架,用什么框架.在这里我想告诉你,框架都是死的,但是人是活的,只要你明白的框架的基本原理 ...

  5. matlab里面atn是什么意思,matlab教程第一章

    <matlab教程第一章>由会员分享,可在线阅读,更多相关<matlab教程第一章(63页珍藏版)>请在人人文库网上搜索. 1.第1章 矩阵及其基本运算MATLAB,即&quo ...

  6. 乐行学院RabbitMQ学习教程 第一章 RabbitMQ介绍(可供技术选型时使用)

    乐行学院RabbitMQ学习教程 第一章 RabbitMQ介绍 RabbitMQ介绍 1.RabbitMQ技术简介 2.RabbitMQ其他扩展插件 2.1监控工具rabbitmq-managemen ...

  7. 计算机中的数制与编码教程,第一章计算机中的数据和编码教程.doc

    第一章计算机中的数据和编码教程 第一章 计算机中的数据和编码 1.1计算机中的数制 1.2计算机中数的表示 1.3计算机中的编码 1.1 计算机中的数制之进位计数制 进位制: 按照进位的方法进行计数的 ...

  8. excel工具栏隐藏了怎么办_Office2016基础教程第一章:认识Excel #excel #职场 #办公技巧...

    今日详讲Excel基础 教程 第一章:认识Excel 1. 版本兼容性 2. Excel2016的独特之处 3. 安装Excel2016 4. 启动Excel2016 5. 退出Excel2016 6 ...

  9. 软考 程序员教程-第一章 计算机系统基础知识

    软考 程序员教程-第一章 计算机系统基础知识 为了督促自己学习,告别懒惰,在此先给自己定个小目标,请大家监督哟! 目标:一个月内过一遍<程序员教程>,下一个月开始上真题. 简单看了下,我在 ...

最新文章

  1. Ajax——从服务器获取各种文件
  2. 插件框架Extensible Framework for Delphi
  3. java离群值,监视-衡量Java中单线程复杂算法的最佳宏基准测试工具/框架是什么?...
  4. 发布-订阅消息常用通信方式
  5. 《读书报告 – Elasticsearch入门 》----Part II 深入搜索(2)
  6. 存储专访:整合磁带与磁盘 昆腾为用户提供更灵活的选择
  7. 英文书信格式——书写款式(转载)
  8. 微软也招 Java!
  9. 小球落地c语言编程答案,c语言模拟小球落地
  10. #二维差分# [ssloj 1467] U
  11. Fresco之强大之余的痛楚
  12. java 的vm是什么_java – 什么是VM,为什么动态语言需要一个?
  13. 什么是平台即服务 (PaaS)?定义、示例、组件和最佳实践
  14. POJ 计算几何入门题目推荐(转)
  15. 阿里无人超市 “微笑打折”成世界互联网大会热点
  16. SGVision与FX3U通讯
  17. 关于SE54视图簇的创建和维护
  18. 那些年啊,那些事——一个程序员的奋斗史 ——121
  19. 如何打开已经 force-push 的 PR (branch was force-pushed or recreated)
  20. PHP 5.5从零开始学 视频教学版pdf

热门文章

  1. MySQL数据库进阶版
  2. WEB网站安全检测系统设计与实现
  3. 疑似流氓软件? 价值4000万的过滤软件绿坝分析报告
  4. key与PRIMARY KEY区别
  5. CryEngine3引擎最新进展 BeamNG展示超强物理碰撞
  6. C语言文件操作-总是打不开文本文档
  7. windows核心宝藏
  8. 《别告诉我你懂PPT》札记
  9. 分支结构 单分支多分支嵌套分支结构
  10. C++gets()函数的使用