
ARM+Linux
文章平均质量分 67
ARM+Linux实践笔记
科学边界
这个作者很懒,什么都没留下…
展开
-
ARM64基础14:ARM64的中断处理之GIC400实现(以树莓派4采用的BCM2711芯片为例)
接上篇,ARM64基础13:ARM64的异常处理之中断处理(以树莓派4采用的BCM2711芯片为例)传统中断控制器,比如树莓派4b的legacy interrupt controller,具备中断enable寄存器;中断状态寄存器;随着新业务的出现,比如1.中断源变得越来越多;2.不同类型的中断出现,比如多核间中断,中断优先级,软中断等;传统中断控制器已经无法满足需求,由此GIC控制器应运而生;...原创 2021-09-26 17:49:38 · 2715 阅读 · 5 评论 -
ARM64基础13:ARM64的异常处理之中断处理(以树莓派4采用的BCM2711芯片为例)
ARM64的中断属于异常模式的一种,对中断的处理流程跟上节的异常处理类似,走其中的一个分支;树莓派4b的中断控制器分两种:传统的中断方式legacy interrupt和GIC(BCM2711支持GIC-400);原创 2021-09-23 20:53:03 · 3131 阅读 · 5 评论 -
ARM64基础12:ARM64的异常模式及异常向量表
1.ARM64的异常等级ARM64包含4个异常等级:EL0:非特权模式,常用来跑应用程序;EL1:特权模式,常用来跑内核;EL2:虚拟化监控程序,例如hypervisor;EL3:安全模式,例如secure monitor;2.同步异常和异步异常同步异常包括:1.系统调用,svc, hvc, SMC等;2.MMU引发的异常;3.SP和PC对齐检查;4.未分配的指令;异步异常:IRQ中断;FIQ中断;SError注:在官方手册D1.12有详细列出那些是同步异常;3.异常入口原创 2021-09-13 11:37:34 · 7195 阅读 · 6 评论 -
ARM64基础11:GCC内嵌汇编补充
目的:(1)优化,对特定代码进行优化;(2)C语言需要访问某些特殊指令来实现特殊功能,比如内存屏障指令;内嵌汇编两种模式:基础内嵌汇编:不带参数;扩展的内嵌汇编:C语言变量参数;(1)基础内嵌汇编格式:asm关键字:表明是一个GNU扩展;修饰词(qualifiers)volatile:基础内嵌汇编中,通常不需要;inline:内敛,asm代码会尽可能小;汇编代码块:GCC编译器把内嵌汇编当成一个字符串;GCC编译器不会去解析和分析内嵌汇编;多条汇编指令,需要使用“\n\t”换行原创 2021-09-06 18:16:43 · 2406 阅读 · 0 评论 -
ARM64基础10:GNU LD链接器介绍
连接器Linker:是一个程序,将一个或多个编译器或汇编生成的目标文件,及依赖库,连接为一个可执行文件。GNU Linker采用AT&T链接脚本语言;链接脚本文件:包含ld程序链接的规则,其决定输出可执行文件的内存布局;LD命令:arm64版本的连接器是aarch64-linux-gnu-ld查看命令参数:aarch64-linux-gnu-ld --helpLD命令的参数有很多,常用的如下:$(ARMGNU)-ld -T $(SRC_DIR)/linker.ld -Map xxx.原创 2021-09-01 16:46:42 · 2089 阅读 · 0 评论 -
ARM64基础9:GNU AS汇编器介绍
ARM64的汇编器(1)ARM公司官方的汇编器;(2)GNU AS汇编器:aarch64-linux-gnu-as;(3)gcc采用as作为汇编器,所以汇编码是AT&T格式;(4)AT&T格式:源于贝尔实验室;(5)ARM格式:ARM官方汇编语法;汇编语法(1)label:任何以冒号结尾的标识符,都被认为是一个标号;(2)注释:“//”,注释“#”,在一行的开始,注释整行;(3)指令、伪指令、寄存器,可以全部大写或者小写,GNU默认风格是小写;(4)Symbol:代表原创 2021-08-30 18:32:15 · 1792 阅读 · 1 评论 -
ARM64基础8:A64其他常用指令
1.加载指令(PC相对地址)ADR: 加载PC相对地址的label地址,范围+/- 1MB;ADRP: 加载PC相对地址,label地址,并且4KB对齐,范围+/- 4GB;/* others inst */.align 3.global my_test_datamy_test_data: .dword 0x12345678abcdeeff.global adrp_testadrp_test: adr x0, my_test_data adrp x1, my_test_data原创 2021-08-26 15:39:43 · 1500 阅读 · 0 评论 -
ARM64基础7:A64的比较和跳转指令
pstate的nzcv标志位条件标志位描述N负数标志(上次运算结果为负值,则N=1,否则N=0)Z上次运算结果为0C对于加法运算,无符号溢出,C=1, 其他不变V有符号溢出条件码后缀助记符标志位定义0000EQZ=1相等0001NEZ=0不相等0010CS/HSC=1无符号大于或者等于0011CC/LOC=0无符号小于0100MIN=1负值0101PLN=0正值或0原创 2021-08-25 17:41:14 · 5186 阅读 · 0 评论 -
ARM64基础6:A64的算术和移位指令
条件操作码在pstate处理器(对应a32之前是CPSR)状态中有4个条件操作吗NCZV条件标志位描述N负数标志(上次运算结果为负值,则N=1,否则N=0)Z上次运算结果为0C对于加法运算,无符号溢出,C=1, 其他不变V有符号溢出普通加法指令add1.使用寄存器的加法;2.使用立即数的加法;3.使用移位操作的加法adds指令,影响条件标志位csubs指令,影响条件标志位cadc指令ADC Xd, Xn, Xm //Xd = Xn + X原创 2021-08-22 20:04:53 · 2027 阅读 · 0 评论 -
ARM64基础5:A64的存储和加载指令
ldr和str指令ARMv8也是基于指令加载和存储的架构,即不能直接操作内存;LDR <reg_dst>,<addr> //把存储器地址的数据加载到目的寄存器中;STC <reg_src>,<addr> //把原寄存器的值,存储到内存中;ldr指令寻址1:地址偏移模式ldr Xd,[Xn,$offset].global ldr_test //申明全局函数ldr_test: // 1. ldr地址偏移模式 mov x1, 0x80000原创 2021-08-17 20:28:55 · 4810 阅读 · 0 评论 -
用QEMU模拟调试裸机ARM64汇编,支持gdb单步调试
完全是方便自己查询,做个记录。树莓派4支持ARM64, cortex A72,支持最新的ARMv8指令集,且有众多的开源资料,适合用来学习ARM64汇编,其他芯片大同小异,遇到需要,再进一步研究qemu支持的芯片;这里直接采用笨叔提供的qemu工具,以及初始化代码BenOS,再添加自己的测试代码来调试ARM汇编指令。考虑版权因素,用到的工具及BenOs源码,这里不公开,有兴趣的朋友,可以去购买笨叔的教材,获取详细资料。编译好BenO后,在qemu启动BenOS: qemu-system-aarch6原创 2021-08-11 20:37:30 · 6413 阅读 · 1 评论 -
ARM64基础4:在C语言中嵌入ARM64汇编代码
如题,有时为了提高部分代码运行性能,可以将部分C代码实现,用汇编改写(自己编写常比编译器优化效果更好)1.先看案例:#include <stdio.h> static int compare_data(int a, int b){ int val; asm volatile ( "cmp %1,原创 2021-08-02 16:59:01 · 4214 阅读 · 0 评论 -
ARM64基础3:在ARM64汇编中调用C语言函数
如题,演示汇编程调用C函数方法1.创建两个文件compare.cint compare_data(int a, int b){ return (a >= b) ? a : b;}main.S文件.section .data.align 3print_data: .string "big data: %d\n".section .text.globl mainmain: stp x29, x30, [sp, -16]!原创 2021-08-02 15:48:07 · 994 阅读 · 0 评论 -
ARM64基础2:在C语言调用ARM64汇编函数
如题,通过C语言代码调用汇编实现的函数1.创建两个文件:compare.S和main.ccompare.S.section .text.globl compare_datacompare_data: cmp x0, x1 csel x0, x0, x1, hi //若x0>1则返回x0, 否则返回x1 retmain.c文件#include <stdio.h>extern int compare_data(int a, i原创 2021-07-31 17:32:21 · 1157 阅读 · 1 评论 -
ARM64基础1:用ARM汇编实现,查找给定数组的最大数
如题,用ARM汇编实现功能,在给定数组中查找最大数.section .data //定义数据段段.align 3 //以2^3对齐my_data: //定义一个数据 .quad 1 .quad 2 .quad 5 .quad 8 .quad 10 .quad 12my_data_count: //数组的个数 .quad 6.align 3print_data: //定义一个字符串 .string "big data: %d\n".sectio原创 2021-07-31 17:16:05 · 1485 阅读 · 2 评论 -
ARM64基础0:ARM64架构简介
如题,一些ARM64通用的架构知识原创 2021-07-31 17:15:05 · 6690 阅读 · 0 评论 -
ARM64相关列表
如题,收藏一些ARM64相关的笔记,随心所为,纯为方便自己查阅;原创 2021-07-31 17:13:04 · 327 阅读 · 0 评论 -
用Eclipse+QEMU搭建可视化环境,单步调试Linux内核
step1:安装java环境Eclipse运行依赖jave环境;sudo apt install openjdk-13-jrestep2:安装Eclipse-CDT官网:http://www.eclipse.org/cdt/step3:配置Eclipse-CDT(1)创建工程在Eclipse菜单选择File->New->Project,选择Makefile Project with Exiting Code,即可创建一个新工程;(2)配置调选项选择Eclipse菜单中的Ru原创 2021-07-28 20:28:17 · 1736 阅读 · 1 评论 -
使用qemu搭建ARM64调试环境,支持文件共享,支持gdb调试
环境主机ubuntu版本: 20.04qemu模拟处理器:ARM64Linux内核版本:https://www.kernel.org/ 最新版step1:安装编译工具链sudo apt-get install gcc-aarch64-linux-gnu查看版本号leon@leon:~/work$ aarch64-linux-gnu-gcc -vUsing built-in specs.COLLECT_GCC=aarch64-linux-gnu-gccCOLLECT_LTO_WRAPPE原创 2021-07-06 10:18:03 · 3855 阅读 · 8 评论