ARM 寄存器(综述)

    ARM有R0-R15共16个通用寄存器和一个程序状态寄存器CPSR。在ARM处理器的不同模式下,这些寄存器对于用户来讲是有着不同的视图的,详见下图:

图1-1

    Banked Register的意思是“备份寄存器”,也就是说当处理器由User mode切换到FIQ mode时,R0-R7需要入栈保存,而R8-R14则不需要。因为在FIQ mode,R8-R14使用的是物理上不同的寄存器,标记为R8_fiq。这种设计是为了提高处理器在不同模式间切换的效率,从图中可以看到有那些寄存器有Banked Register的存在。

    R0-R15 General-purpose Register “通用寄存器”也不尽然是“通用”,从硬件和软件的约定上,不同的寄存器有不同的作用。

    从硬件上看,R15作为为Program Counter(pc)使用。因为ARM为流水线设计,PC所指向的指令并不是当前处理器正在执行的,据ARMv6手册讲,PC指向当前正在执行指令的后第二条指令。R14作为Link Register(lr)使用,它在跳转指令执行后会保存跳转指令的下一条指令的地址。主要用于子程序的调用和从异常中返回。这里讲的硬件约定,是指此两个寄存器中的数值是在处理器运行的过程中根据执行不同指令自动写入的。而下面讲到的软件约定则是软件上一种约定俗成的用法,大家都如此使用最终也就形成一种规范1

    R13作为Stack Pointer(sp)使用,在系统初始化时会将堆栈地址存入R13。

    CPSR(Current Program Status Register)中各字段的意义如下:

图1-2

    bit[4:0]显示处理器当前的模式:

    User     (usr)    0b10000    

    FIQ      (fiq)    0b10001    

    IRQ      (irq)    0b10010    

    Superisor(svc)    0b10011    

    Abort    (abt)    0b10111    

    Udefined (und)    0b11011    

    System   (sys)    0b11111    

    通常,将出User之外的模式称之为特权模式(Privileged Mode),而除User和System之外的模式又称之为异常模式(Exception Mode)。System模式是设计为运行操作系统任务的。User模式不能自主的进行模式的切换,除非异常条件的产生促使处理器进入异常模式。而特权模式可以自由的切换到另一种模式中。

    I位指示IRQ的状态,当写入1时禁止IRQ。F位指示FIQ的状态,当写入1时禁止FIQ。T位指示当前处理器当前为执行Thumb指令集还是ARM指令集。ARM处理器使能够执行32位和16位两种指令集的,当然Thumb和ARM指令集是相似的。

 

1. 参考《Procedure Call Standard for the ARM Architechitecture》

Posted by jc 2011年8月21日 04:09


S3C6410的iROM启动方式

  看过Samsun的手册后知道,在S3C6410从SD卡启动的时候,Bootloader的代码是由iROM里面的“Device Copy Function"来拷贝到Stepping Stone(8kb)的。

而默认的,此函数会将SD卡的倒数第三个块的8KB数据拷贝。所以,如果一个SD卡的块数为S(扇区大小为512byte),那么这8KB的Bootloader应该放到

(S-16)块处。而SDHC卡则跳过最后的1024个块。

例如:我有一个boot.bin,我的SD卡的设备文件为/dev/sdb,那么

# dd if=/dev/zero of=./temp bs=8k count=1

# cat temp >> boot.bin

# split -b 8k led.bin

# mv xaa led.bin

烧录到SD卡:

# fdisk /dev/sdb

 

Disk /dev/sdb: 2002 MB, 2002780160 bytes
11 heads, 10 sectors/track, 35560 cylinders
Units = cylinders of 110 * 512 = 56320 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
 
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               2       35561     1955775+   b  W95 FAT32
 
由以上信息可知:
Blocks = 2002780160 / 512 = 3911680
那么boot.bin烧录的位置为 3911680 - 18 = 391162
 
# dd if=./boot.bin of=/dev/sdb bs=8k seek=391172
 
假如是SDHC卡,那么烧录的位置为 3911680 - (18 + 1024)。

Posted by jc 2011年3月10日 05:19