Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2984210
  • 博文数量: 401
  • 博客积分: 12926
  • 博客等级: 上将
  • 技术积分: 4588
  • 用 户 组: 普通用户
  • 注册时间: 2009-02-22 14:51
文章分类

全部博文(401)

文章存档

2015年(16)

2014年(4)

2013年(12)

2012年(82)

2011年(98)

2010年(112)

2009年(77)

分类: LINUX

2012-07-28 11:14:28

1,vboot编译时,将.text.FirstSector段链接到0x00000000地址中。
SECTIONS {
  2   . = 000000;
  3   .myhead ALIGN(0): {*(.text.FirstSector)}
  4   .text ALIGN(512): { *(.text) }
  5   .bss ALIGN(4)  : { *(.bss*)  *(COMMON) }
  6   .data ALIGN(4) : { *(.data*) *(.rodata*) }
  7 }
事实上FirstSector保存的就是ARM异常中断向量表。
2, 将链接好的二进制文件,烧写到NandFlash的0x0地址中。
3,上电后ARM根据OM管脚来判断出启动模式,发现是NANDFLASH启动模式,于是加载NandFlash的0x00地址开始的4K数据到内部的sram中。sram的物理地址为0x00000000地址。
4,ARM处理因上电产生的复位异常,跳转到0x00000000地址的异常中断向量表中,找到复位异常项去执行。此项保存的是一个跳转指令。
5,复位异常跳转到复位异常处理函数入口地址开始执行。

ARM系统调用原理
老方式:
1,通过SWI指令来触发一个软中断。一般如下:
   swi #900005
2,这条SWI指令执行的时候,CPU会跳转到异常中断向量表的SWI项执行软中断处理函数。
3,软中断处理函数首先通过lr寄存器减4取得swi #900005指令的地址,通过地址取得swi指令的参数#900005。只取后16位,也就是05,这就是系统调用号。Kernel再通过这个号来调用相应的系统调用处理函数。

新方式:
1, mov r0, 0x05
2, swi #0
SWI处理函数会直接从r0中取得系统调用编号进行相应处理。

阅读(1389) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~