1.在校验镜像文件的完整性之前,需要准备如下文件:
镜像文件:openEuler-21.03-raspi-aarch64.img
校验文件:openEuler-21.03-raspi-aarch64.img.sha256sum
2.文件完整性校验操作步骤如下:
①获取校验文件中的校验值。执行命令如下:
[Windows]> type openEuler-21.03-raspi-aarch64.img.sha256sum
命令执行结果:
②计算文件的 sha256 校验值。执行命令如下:
[Windows]> certutil -hashfile openEuler-21.03-raspi-aarch64.img SHA256
命令执行结果:
经过两次校验值的对比,两次结果完全一致,文件完整性没有受到破坏。
1.可以使用 balenaEtcher等软件工具将解压的镜像烧写入 TF 卡:
1.登录树莓派有以下两种方式:
①本地登录
树莓派连接显示器(树莓派视频输出接口为 Micro HDMI)、键盘、鼠标后,启动树莓派,可以看到树莓派启动日志输出到显示器上。待树莓派启动成功,输入用户名(root)和口令(默认:openeuler)登录:
②ssh 远程登录
树莓派默认采用 DHCP 的方式自动获取 IP。如果树莓派连接已知路由器,可登录路由器查看,新增的 IP 即为树莓派 IP。例如,树莓派对应 IP 为:192.168.31.109,使用命令 ssh [email protected] 后输入口令 openeuler,即可远程登录树莓派:
默认根目录分区空间比较小,在使用之前,需要对分区进行扩容。
1.在 root 权限下执行 fdisk -l 命令查看磁盘分区信息:
SD 卡对应盘符为 /dev/mmcblk0,包括 3 个分区,分别为:
/dev/mmcblk0p1:引导分区
/dev/mmcblk0p2:交换分区
/dev/mmcblk0p3:根目录分区
这里我们需要将根目录分区 /dev/mmcblk0p3 进行扩容。
2.在 root 权限下执行 fdisk /dev/mmcblk0 命令进入到交互式命令行界面,按照以下步骤扩展分区:
输入 p,查看分区信息。
记录分区 /dev/mmcblk0p3 的起始扇区号,即 /dev/mmcblk0p3 分区信息中 Start 列的值,示例中为 1593344。
输入 d,删除分区。
输入 3 或直接按 Enter,删除序号为 3 的分区,即 /dev/mmcblk0p3 分区。
输入 n,创建新的分区。
输入 p 或直接按 Enter,创建 Primary 类型的分区。
输入 3 或直接按 Enter,创建序号为 3 的分区,即 /dev/mmcblk0p3 分区。
输入新分区的起始扇区号,即第 1 步中记录的起始扇区号,示例中为 1593344。
3.执行 df -lh 命令查看磁盘空间信息,以确保根目录分区已扩展。
1.实验目的
通过本实验了解和熟悉ARM64汇编语言。
2.实验要求
使用ARM64汇编语言来实现如下功能:在给定的一组数中查找最大数。程序可使用GCC(Aarch64版本)工具来编译,并且可在树莓派Linux系统或者QEMU + ARM64实验平台上运行。
3. 实验代码讲解
下面是本实验的参考代码:
第1~16行,定义数据段,比如my_data定义了一个数组,这里使用.quad来定义一个8字节大小的数。my_data_count表示这个数组的个数,一个是6个数。print_data定义了一个字符串,后面会使用printf函数来打印。这里使用. string来定义个字符串。
第18行,表示接下来的是代码段。
第19行,声明一个main函数。
第21行,把x29和x30寄存器保持到栈里。X29寄存器是FP栈帧寄存器,x30是链接寄存器。
第23行,读取my_data标签的地址。
第24行,读取my_data_count标签地址里面的内容,会读取8个字节的内容到x1寄存器里,即读取数组的数量,这里为6.
第26行,数组中最后一个数的地址。
第28行,x3是一个临时寄存器,初始值为0.
第30行,后变基加载模式,以X0的值为地址,加载该内存地址的值到X2,然后再更新X0寄存器为X0 +8。
第31行,比较x2和x3的值
第32行,csel指令是一个条件选择指令。当条件满足(这里是比较x2是否大于x3)的时候,x3寄存器会选择x2的值。
第34行,判断当前是否为最后一个候选的数了,不是的话,跳转到1标签处。
第37行,加载print_data标签的地址到x0寄存器。
第38行,通过上面的比较,x3寄存器存放最大值。接下来要调用printf函数来打印了,我们通过x0寄存器和x1寄存器来传递参数给printf函数。
第42行,从main函数的栈中恢复x29和x30寄存器。
第43行,函数返回。
编译及运行:
4.调试
我们可以使用gdb来单步调试汇编程序:
在main函数里设置一个断点,输入“r”命令运行test程序,可以使用“info reg”命令来查看寄存器的值:
5. 使用qemu-aarch64-static来运行程序
除了在ARM64系统里运行test程序之外,我们也可以在主机中使用qemu-aarch64-static来运行ARM64的test程序。
在Ubunut 主机上运行:
1.实验目的
通过本实验了解和熟悉C语言中如何调用汇编函数。
2.实验要求
使用汇编语言实现一个汇编函数,用于比较两个数的大小并返回最大值,然后用C语言代码调用这个汇编函数。程序可使用GCC(Aarch64版本)工具来编译,并且可在树莓派Linux系统或者QEMU + ARM64实验平台上运行。
3. 代码讲解
本实验的参考代码有两个文件:compare.S和main.c :
编译运行:
1.实验目的
通过本实验了解和熟悉汇编语言中如何调用C函数。
2.实验要求
使用C语言实现一个函数,用于比较两个数的大小并返回最大值,然后用汇编代码调用这个C函数。程序可使用GCC(Aarch64版本)来编译,并且可在树莓派Linux系统或者QEMU + ARM64实验平台上运行。
3.实验代码讲解
本实验的参考代码有两个文件:main.S和compare.c文件:
编译运行:
1.实验目的
通过本实验了解和熟悉GCC内联汇编的使用。
2.实验要求
使用GCC内联汇编实现一个函数,用于比较两个数的大小并返回最大值,然后用C语言代码调用这个函数。程序可使用GCC(Aarch64版本)工具来编译,并且可在树莓派Linux系统或者QEMU + ARM64实验平台上运行。
Linux的库文件分成两大类:一类是动态链接库(通常以.so结尾),另一类是静态链接库(通常以.a结尾)。在默认情况下,GCC在链接时优先使用动态链接库,只有当动态链接库不存在时才使用静态链接库。下面使用“–static”来让test程序静态链接C语言标准库,原因是交叉工具链使用的libc的动态库和QEMU中使用的库可能不一样。如果使用动态链接,可能导致运行报错。