qianyi
qianyi
## ARM64异常处理之中断处理 - ARM核心两个和中断相关的 管脚:nIRQ 和 nFIQ - 每个CPU核心有一对这样的 中断相关的管脚  - PSTATE状态中有两个比特位和中断相关 - I:用来屏蔽IRQ中断 - F:用来屏蔽FIQ中断 ## ARM64中的GIC控制器 - ARM提供了标准的GIC控制器,例如树莓派4b上支持GIC-400 - 树莓派3b上支持 传统的中断方式(legacy interrupt)  ### 中断处理过程  ###...
## ARM64的异常等级 ARM64异常等级: - EL0:非特权模式,例如应用程序 - EL1:特权模式,例如OS内核 - EL2:虚拟化监控程序,例如hypervisor - EL3:安全模式,例如secure monitor  ## ARM64异常的一些基本概念 - Taking an exception:正在处理一个异常 - Returning from an exception:从一个异常中返回 - Exception levels:异常等级 - Precise exception:精准异常...
## adrp和ldr究竟有什么不同 adrp指令:加载PC相对地址的label的地址,它加载label所属的4KB对齐的地址,范围为 +/- 4GB. 而ldr指令能访问64位地址空间的所有范围, 有了ldr为什么还需要adrp呢?. 先看下这幅图.  1. 程序编译时的链接地址为: 0xffff_0000_0008_0000 2. 树莓派程序在上电复位后,BOOTROM把该程序 ,加载到0x80000地址处运行,此时运行地址 != 链接地址 3. 此时,使用需要加载程序定义的一个变量地址init_pg_dir, 这时候应该使用 adrp x0, init_pg_dir 还是 ldr x0, =init_pg_dir 呢? 首先需要明白: ldr伪指令:...
## GCC内嵌汇编 - 内嵌汇编(Inline Assembly Language):在C语言中嵌入汇编代码 - 目的: - 优化:对于特定重要代码(time-sensitive)进行优化 - C语言需要访问某些特殊指令来实现特殊功能比如 内存屏障指令 ### 内嵌汇编两种模式 - 基础内嵌汇编(Base Asm):不带参数 - 扩展的内嵌汇编(Extended Asm):C语言变量参数 ### 基础内嵌汇编 asm asm-qualifiers ( AssemblerInstructions ) 格式: -...
## 链接器Linker - 链接器(Linker)是一个程序,将一个或多个由编译器或汇编器生成的目标文件外加 库链接为一个可执行文件。 - GNU Linker采用AT&T链接脚本语言 - 官方文档:最新版本v2.34 - 链接脚本最终会把一大堆编译好的二进制文件(.o文件)综合生成最终二进制可执行文件,也就是把每一个二进制文件整合到一个大文件中。这个大文件有一个总的text/data/bss段。 ### ld命令 - aarch64-linux-gnu-ld:arm64版本的链接器命令 - 命令参数查看: aarch64-linux-gnu-ld --help 常用参数: -T: 指定链接脚本 -Map:输出一个 符号表 文件 -o: 输出最终可执行二进制文件 ### 基本概念...
## Arm64的汇编器 - ARM公司官方的汇编器 - GNU AS汇编器:aarch64-linux-gnu-as - gcc采用as作为其汇编器,所以汇编码是AT&T格式的 - AT&T格式:源自贝尔实验室,为开发UNIX系统而产生的汇编语法 - ARM格式:arm官方汇编语法 ## gas汇编器语法 - label: 任何以冒号结尾的标识符都被认为是一个标号 - 注释: - “//” 表示注释 - “#”:在一行的开始,表示注释整行 - 指令,伪指令,寄存器,可以全部是大写或者小写,GNU风格默认是小写 - Symbol:代表它所在的地址, 也可以当作变量或者函数来使用...
## 加载指令 ### ldr指令寻址之1:地址偏移模式(unsigned offset) 地址偏移模式常常使用寄存器的值来表示一个地址,或者基于寄存器的值做一些偏移来计算出内存地址,并且把这个内存地址的值加载到通用寄存器中。偏移量可以是正数,也可以是负数。 LDR Xd, [Xn, $offset] 首先在Xn寄存器的内容上加一个offset偏移量后作为内存地址,加载此 地址的内容到Xd寄存器。 ### ldr指令寻址之2:变基模式 变基模式主要有两种。 - 前变基模式(pre-index模式),先更新偏移地址然后再访问内存 - 后变基模式(post-index模式),先访问内存地址然后再更新偏移地址 LDR X0, [X1, #8]! //前变基模式。先更新X1的值为X1+8,然后以新的X1值为地址,加载内存的值到X0 LDR X0, [X1], #8 //后变基模式。以X1的值为地址,加载该内存地址的值到X0,然后再更新X1寄存器为X1+8 ###...
最近开始学习音视频方面的技术。音视频处理用的最多的就是FFmpeg。 这里把编译FFmpeg中遇到的一些问题记录下来,以便下次需要编译的时候方便回顾。 ## 下载代码 FFmpeg可以直接通过git下载最新的代码,下载完成后建议切换到最新的release分支 ``` git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg ``` 我下载的时候最新的是4.1版本。 ## 编译 由于我也是第一次编译,所以就使用了最简单的配置方法 ``` ./configure --enable-shared --disable-x86asm --prefix=/usr/local --enable-gpl --enable-libx264 --enable-libfreetype ``` ~直接安装在/usr/local目录下,可以避免很多编译链接问题。~ ``` 系统里面/usr/lib/x86_64-linux-gnu/已经有较老的ffmpeg库了,这个和新的库会不会有冲突? ldconfig -p |...
## 背景 服务器上有一个虚机发现删不掉, ps命令查看发现qemu-kvm变成了zombie. **僵尸进程出现的原因, 一般是子进程退出时父进程没有回收子进程的资源, 这个时候子进程就会变成僵尸进程, 或者子进程根本没有发送SIGCHLD通知父进程回收** ## 分析过程 查看进程状态 ``` [root@node-3 ~]# cat /proc/22889/status Name: qemu-kvm State: Z (zombie) Tgid: 22889 Ngid: 22985 Pid: 22889 PPid: 1 TracerPid:...
## 内存测试 STREAM为业界公认的内存性能测试工具,项目地址为http://www.cs.virginia.edu/stream/。 主要用于测试CPU访问内存的带宽,代码有C语言和FORTRAN语言两种版本. 访问http://www.cs.virginia.edu/stream/FTP/Code/ 网站,获取stream.c文件 编译, 编译参数仅供参数 ``` gcc -O3 -fopenmp -DSTREAM_ARRAY_SIZE=100000000 -DNTIME=30 stream.c -o stream.o ``` 为了避免单次执行的误差,建议执行3次以上 ``` [root@node-23 tmp]# ./stream.o ------------------------------------------------------------- STREAM version $Revision: 5.10 $ -------------------------------------------------------------...