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中取得系统调用编号进行相应处理。
阅读(1350) | 评论(0) | 转发(0) |