
ARM
文章平均质量分 78
myxmu
不积跬步无以至千里,不积小流无以成江海
展开
-
ARM汇编编程基础之四 —— ARM汇编伪操作
掌握了基本的ARM汇编指令后,要写出简单的ARM汇编程序,还必须要掌握基本的ARM汇编伪操作(directive)。现在我们来看一个简单的汇编程序,该程序调用子程序完成了加法操作。1 ;文件名:TEST.S2 ;功能:实现两个寄存器相加3 AREA Example,CODE,READONLY ;声明代码段Example4 ENTRY ;标识程序入转载 2012-12-25 16:16:09 · 586 阅读 · 0 评论 -
SMP Primer for Android
Android 3.0 and later platformversions are optimized to support multiprocessor architectures. This documentintroduces issues that can arise when writing code for symmetric multiprocessorsystems in C转载 2013-12-26 10:35:06 · 1475 阅读 · 0 评论 -
浅析arm(kernel-2.6.13)自旋锁与信号量
在单处理器上,自旋锁仅仅当作一个设置内核抢占的开关。如果内核抢占也不存在,那么自旋锁会在编译时被完全剔除出内核。我的是s3c2440 armv4的单核。这个内核被配置为可抢占的。# Kernel Features#CONFIG_PREEMPT=y自旋锁的实现:spin_lock的定义如下:#define spin_lock(lock) _spin_lo转载 2013-12-23 14:56:55 · 1000 阅读 · 0 评论 -
linux 2.6 互斥锁的实现-源码分析
1. 首先介绍一下互斥锁所使用的数据结构:struct mutex { 引用计数器 1: 所可以利用。 小于等于0:该锁已被获取,需要等待 atomic_t count; 自旋锁类型,保证多cpu下,对等待队列访问是安全的。 spinlock_t wait_lock; 等待队列,如果该锁被获取,任务将挂在此队列上,等待调度。 struct li转载 2013-12-23 15:21:23 · 703 阅读 · 0 评论 -
Linux spin_lock的实现
Spin_lock是Linux内核的一种同步机制。内核代码可以通过获得spin_lock宣称对某一资源的占有,直到其释放该spin_lock;如果内核代码试图获得一个已经锁定的spin_lock,则这部分代码会一直忙等待,直到获得该spin_lock。 Spin_lock的kernel中的实现对单核(UP),多核(SMP)有不同的处理方式。对单核来说,如果spin_lock不处于中断上下文转载 2013-12-23 12:46:05 · 1375 阅读 · 0 评论 -
Spinlock在ARM及X86平台上的实现
本文主要以2.6.22.6内核分析Linux中spinlock在ARM及X86平台上的实现(不同版本的内核实现形式会有一些差异,但原理大致相同)。此处默认大家已经熟悉了spinlock的使用,重点解释容易引起迷惑的体系结构相关的实现部分。一、spin_lock(lock)的实现/***include/linux/spinlock.h中***/#if defined(CONFIG_SMP转载 2013-12-23 11:34:55 · 1054 阅读 · 0 评论 -
Linux内核ARM构架中原子变量的底层实现研究
前段时间重新研究了一下Linux的并发控制机制,对于内核的自旋锁、互斥锁、信号量等机制及其变体做了底层代码上的研究。因为只有从原理上理解了这些机制,在编写驱动的时候才会记得应该注意什么。这些机制基本都从代码上理解了,但是唯有一个不是非常理解的是内核对于ARM构架中原子变量的底层支持,这个机制其实在自旋锁、互斥锁以及读写锁等内核机制中都有类似的使用。这里将学习的结果写出,请大家指正。 假设转载 2013-12-23 11:32:00 · 1163 阅读 · 0 评论 -
Linux 中 x86 的内联汇编
如果您是 Linux 内核的开发人员,您会发现自己经常要对与体系结构高度相关的功能进行编码或优化代码路径。您很可能是通过将汇编语言指令插入到 C 语句的中间(又称为内联汇编的一种方法)来执行这些任务的。让我们看一下 Linux 中内联汇编的特定用法。(我们将讨论限制在 IA32 汇编。)GNU 汇编程序简述让我们首先看一下 Linux 中使用的基本汇编程序语法。GCC(用于 Lin转载 2013-12-19 17:44:54 · 615 阅读 · 0 评论 -
内联汇编
GGNU 汇编程序简述Linux 中使用的基本汇编程序语法。GCC(用于 Linux 的 GNU C 编译器)使用 AT&T 汇编语法。下面列出了这种语法的一些基本规则。寄存器命名寄存器名称有 % 前缀。即,如果必须使用 eax,它应该用作 %eax。源操作数和目的操作数的顺序在所有指令中,先是源操作数,然后才是目的操作数。这与将源操作数放在目的操作数之后的转载 2013-12-18 17:31:04 · 754 阅读 · 0 评论 -
Linux DMA meory简述
1. DMA memory分类2. 2. DMA对memory的操作函数3. 3. DMA的层次结构4. 4. MIPS上的DMA实现5. 5. ARM上的DMA实现 首先,应该先读Documentation/DMA-API.txt和DMA-mapping.txt.转载 2013-12-23 18:23:05 · 2651 阅读 · 0 评论 -
ARM平台的地址对齐问题
前言ARM流行已久,做嵌入式开发的不知道ARM不大可能。鉴于其所具备的较低功耗下的较高性能,也就成了大多数嵌入式设备的首选了。不过对于刚上手的人来说,有可能会遇到一些稀奇古怪的问题。毕竟大部分人都习惯了IA-32下的程序设计,虽然两者都是32位的处理器,但是体系架构完全不同,于是也导致了一些隐含的问题。这里想描述一下一个有点蛊惑的问题,即在ARM上访问非对齐地址内容,会出现所谓“不可预料”转载 2014-04-14 23:19:10 · 2942 阅读 · 0 评论 -
GNU ARM汇编
目 录1 GNU ARM汇编...31.1 基本语法...31.2 GNU ARM汇编伪指令...32 ATPCS约定...32.1 寄存器使用规定...33 汇编与C语言对照...5 1 GNU ARM汇编不同的转载 2013-01-06 11:36:20 · 1010 阅读 · 0 评论 -
ARM体系结构下面内存和i/o映射区别
(1)关于IO与内存空间: 在X86处理器中存在着I/O空间的概念,I/O空间是相对于内存空间而言的,它通过特定的指令in、out来访问。端口号标识了外设的寄存器地址。Intel语法的in、out指令格式为: IN 累加器, {端口号│DX} OUT {端口号│DX},累加器 目前,大多数嵌入式微控制器如ARM、PowerPC等中并不提供I/O空间,而仅存在转载 2014-04-15 23:18:53 · 1138 阅读 · 0 评论 -
ARM汇编:printf
#include int main(){ char* p="Hello world!"; printf("func printf: %s\n", p); return 0;} ~/workspace/mt6592_dev/android/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/arm-l原创 2013-12-03 09:17:45 · 2332 阅读 · 0 评论 -
字符串常量引起的思考
记得以前看过一道这样的题目: 以下程序的执行结果是?#include int main(){ char* p="Hello World"; *(p+1)='a'; printf("%s\n",p);转载 2013-12-02 17:48:47 · 644 阅读 · 0 评论 -
ARM汇编编程基础之四 —— ARM汇编伪操作
掌握了基本的ARM汇编指令后,要写出简单的ARM汇编程序,还必须要掌握基本的ARM汇编伪操作(directive)。现在我们来看一个简单的汇编程序,该程序调用子程序完成了加法操作。1 ;文件名:TEST.S2 ;功能:实现两个寄存器相加3 AREA Example,CODE,READONLY ;声明代码段Example4 ENTRY ;标识程序入转载 2012-09-06 13:50:47 · 846 阅读 · 0 评论 -
ARM汇编编程基础之三 —— 基本寻址方式与基本指令
要想进行ARM的汇编编程,首当其冲要知道最基本、最常用的指令,而要了解指令则必须要了解寻址方式。所以本文将聚焦在——基本寻址方式和基本指令。首先,来看一看我们已经见过的2条指令:MOV pc, lr; BL addsub最简单的汇编指令格式是操作码(例如:MOV、BL)和操作数(例如:pc, lr, addsub)。操作码易于理解,例如MOV表示将某个值从一处传送到另一处,BL表示跳转到某转载 2012-09-06 13:49:42 · 1700 阅读 · 0 评论 -
ARM汇编编程基础之一 —— 寄存器
ARM的汇编编程,本质上就是针对CPU寄存器的编程,所以我们首先要弄清楚ARM有哪些寄存器?这些寄存器都是如何使用的?ARM寄存器分为2类,普通寄存器和状态寄存器寄存器类别寄存器在汇编中的名称各模式下实际访问的寄存器用户系统管理中止未定义中断快中断转载 2012-09-06 13:48:13 · 906 阅读 · 0 评论 -
ARM 内存对齐总结
一、啥是内存对齐?为啥要内存对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问都可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就是对齐。字节对齐的原因大致是如下两条: 1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据转载 2014-04-14 22:13:34 · 3728 阅读 · 0 评论 -
设备树使用手册
This page walks through how to write a device tree for a new machine. It is intended to provide an overview of device tree concepts and how they are used to describe a machine.本文将介绍如何为一个新机器编写设转载 2014-01-01 10:06:06 · 1437 阅读 · 0 评论 -
ARM汇编实战3: destory stack issue
[ 2894.179063] [(2012-12-31 07:20:58.219291396 UTC)] Unable to handle kernel paging request at virtual address da922100[ 2894.179583] [(2012-12-31 07:20:58.219808063 UTC)] pgd = d8330000[ 2894.179原创 2013-12-16 12:39:07 · 1004 阅读 · 0 评论 -
ARM的FP寄存器
ARM的FP寄存器说明。FP实际上就是R11寄存器,在APCS调用规则中,使用R11作为帧指针寄存器。C程序在编译过程中,通常将所有函数的局部变量都分配到一个连续的存储区中,而这个存储区存放于堆栈中,被称为函数的“存储帧”,通过一个指针访问,这个指针就是帧指针寄存器。高地址 栈栈底转载 2013-10-30 16:50:00 · 9943 阅读 · 0 评论 -
android上gdb coredump步骤
gdb 使用参考: 参照如下步骤试试: 首先,编译生成的out/target/product/$project/symbols目录的如下文件放到您新建的symbols 文件夹下,目录结构保持一致:(symbols 例子)symbols/system/lib/libbinder.so symbols/system/lib/libandroid_runtime.so sym原创 2013-10-30 17:25:31 · 6232 阅读 · 0 评论 -
gdb core dump调试程序错误
这几天编译项目,总是遇到segment fault: core dumped。一开始还能马上知道是刚才的修改引起的,到后来就不行了。到网上搜了一下core dump,很方便的找到问题了。记录一下。当程序crash退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息)。使用gdb来查看core文件,可以指示出导致程序出错的代码所在文件和行数。1. 使用转载 2013-10-30 17:07:02 · 1212 阅读 · 0 评论 -
使用objdump看内核源码
1. 修改源代码的顶层 Makefile CC =$(CROSSCOM_PILE)gcc --> CC =$(CROSSCOM_PILE)gcc -g 使成生的vmlinux中含有debug信息2. 所有生成.o的rule中再加一条 CC -E -dD -C $ /preprocessing/$(shell pwd)转载 2013-10-25 13:54:50 · 2042 阅读 · 0 评论 -
KGDB/KDB FIQ (NMI) debugger
Hi all,There wasn't much feedback on v4, the only comment was from BrianSwetland concerning async console (I explained how we deal with it).It would be really great if the core functionality coul转载 2013-01-08 13:32:24 · 2806 阅读 · 0 评论 -
ARM反汇编学习
在bin文件中,就是一条条的机器指令,每条指令4个字节。 在ADS中打开一个.s文件,选择project->disassemble 可以看到汇编的机器码 汇编代码如下(ADS中的一个例程\ARM\ADSv1_2\Examples\asm\armex.s): AREA ARMex, CODE, READONLY ; name this block of code ENTRY ;转载 2013-01-04 16:56:48 · 1144 阅读 · 0 评论 -
ARM芯片的启动程序的分析和总结
1、综述: 目前大多基于ARM芯片的系统都是一个比较复杂的片上系统,多数硬件模块都是可配置的,可以通过软件来设置其需要的工作状态。因此在运行用户的应用程序之前,需要由专门的一段代码来完成对系统的初始化。这一段代码就称为启动程序。 由于这类代码直接面对处理器内核和硬件控制器进行编程,一般都是用汇编语言。在ARM系统上电复位后,需要设置中断向量表、初始化各模式堆栈、设置系统时钟频率转载 2012-12-25 10:48:01 · 1519 阅读 · 0 评论 -
ARM汇编编程基础之二 —— 流水线对PC值的影响
CPU模型图,源自http://teach.jwc.bupt.cn:4213/jsjzcyl/resource/cai/素材库/fig/Flash/5.1.swf从上图中我们看到CPU内部有3个主要组成部分:指令寄存器,指令译码器,指令执行单元(包括ALU和通用寄存器组)。CPU在执行1条指令的时候,主要有3个步骤:取指(将指令从内存或指令cache中取入指令寄存器);译码(指令译码器对指转载 2012-12-25 15:55:53 · 756 阅读 · 0 评论 -
ARM汇编实战1:内核函数netlink_lookup
Exception Class: Kernel (KE)Current Executing Process: [wpa_supplicant, 687][logwrapper, 686]Backtrace: [] emmc_ipanic+0x4c/0x46c[] notifier_call_chain+0x64/0xdc[] __atomic_notifier_call_c原创 2013-10-30 16:13:00 · 1864 阅读 · 0 评论 -
一个简单的linux crackme的逆向
前言 最不喜欢的就是写破解教程,酒后一时冲动,老夫卿发少年狂,许下将写一篇linux平台逆向的文章的诺言,作此文实非颇不得已。 在此申明:本文在技术上非常初级,并没有用到什么高深的技术,本人水平亦有限,如有差错,还请见谅! 开始之前的准备 正如C语言教程从 hello world 开始,我们也由一个 crackme 说开去。本文的例子程序你可以到转载 2013-11-28 11:23:46 · 3723 阅读 · 0 评论 -
Arm Linux 内核生成过程
1. 依据arch/arm/kernel/vmlinux.lds 生成linux内核源码根目录下的vmlinux,这个vmlinux属于未压缩,带调试信息、符号表的最初的内核,大小约23MB; arm-linux-gnu-ld -EL -p --no-undefined -X -o vmlinux -T arch/arm/kernel/vmlinux.lds arch/arm/kern转载 2013-12-30 11:22:50 · 635 阅读 · 0 评论 -
ELF 文件数据分析: 全局变量
先编译一个简单的 C 程序。#include char* s = "Hello, World!";char* x;int i = 0x1234;int main(int argc, char* argv[]){ x = "Ubuntu"; printf("%s/n", s); return 0;}编译后,使用 objdump 输出 ELF转载 2013-12-02 17:30:57 · 4143 阅读 · 0 评论 -
ARM汇编实战2:内核模块函数
死机堆栈Exception Class: Kernel (KE)Current Executing Process: [tx_thread, 12001][kthreadd, 2]Backtrace: [] emmc_ipanic+0x4c/0x46c[] notifier_call_chain+0x64/0xdc[] __atomic_notifier_call_ch原创 2013-11-27 17:15:07 · 2896 阅读 · 0 评论 -
ARM汇编与C语言对照
汇编语言的结构:① 开头声明② 数据初始化④函数(入栈、操作、出栈)③ 被初始化的数据的地址(文字池)注意:②和③联系比较大,但为了让③处在不会被执行的地方,所以将③放在④之后。下面的例子是一个算术运算的汇编与C的对照,首先是C语言/*文件名:test.c*//*说明:算术运算*/ int v1 =转载 2013-12-02 13:00:23 · 1871 阅读 · 0 评论 -
ARM汇编实例1
void main(void){ tsk_test5(); .......}void tsk_test5(void){ unsigned int i,j; unsigned char a,b; unsigned long l; i=0xAA55; j=0x55AA; a=0x88; b=0x9转载 2013-10-24 22:40:42 · 992 阅读 · 0 评论 -
浅析arm汇编中指令使用学习
macro restore_user_regs ldr r1,[sp, #S_PSR] ldr lr,[sp, #S_PC]! @ !用来控制基址变址寻址的最终新地址是否进行回写操作, @ 执行ldr之后sp被回写成sp+#S_PC基址变址寻址的新地址 msr spsr,r1 @ 把cpsr的值保存到spsr中转载 2013-12-02 13:08:08 · 958 阅读 · 0 评论 -
ARM汇编基础
void test2(int a,int b,int c){ int k=a,j=b,m=c; }GCC反汇编:00000064 : mov ip, sp //IP=SP;保存SP stmdb sp!, {fp, ip, lr, pc} //先对SP减4,再对fp,ip,lr,pc压栈。--------转载 2013-10-24 20:16:18 · 761 阅读 · 0 评论 -
STMFD和LDMFD指令个人理解分析
LDM/STM指令主要用于现场保护,数据复制,参数传送等。根据ATPCS规则,我们一般使用FD(Full Descending)类型的数据栈(sp指向最后一个压入的值,数据栈由高地址向低地址生长)!所以经常使用的指令就有STMFD和LDMFD。在STM、LDM指令中,寄存器列表与内存单元的对应关系:编号低的寄存器对应于内存中低地址单元;编号高的寄存器对应于内转载 2013-12-02 11:34:15 · 2832 阅读 · 0 评论 -
#define barrier() __volatile__("": : :"memory") 中的memory
gcc内嵌汇编简介在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可, GCC会自动插入代码完成必要的操作。1、简单的内嵌汇编例:__asm__ __volatile__("hlt"); "__asm__"表示后面的代码为内嵌汇编转载 2013-12-18 17:44:32 · 851 阅读 · 0 评论