系统首先是从head.S文件开始,ARM是从0X00000000地址开始的,可以看系统文件MEM.LDS发现
SECTIONS {
. = 000000;
.myhead ALIGN(0): {*(.text.FirstSector)}
.text ALIGN(512): { *(.text) }
.bss ALIGN(4) : { *(.bss*) *(COMMON) }
.data ALIGN(4) : { *(.data*) *(.rodata*) }
}
head.o放在0X0000000的地址,ALIGN(4),表明BSS,和data段的对其方式,是以4字节对其
BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。
数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。
代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
从0X00开始的应该是异常向量表
0X00指向的是reset函数
b Reset是跳转指令,跳转到Reset异常处理函数,(ARM汇编 B 跳转指令)
最后系统跳转到MAIN.C函数中
bl Main
跳转到主函数中
void Main(void)
{
MMU_EnableICache();
MMU_EnableDCache();
Port_Init();
NandInit();
if (g_page_type == PAGE_UNKNOWN) {
Uart_SendString("/r/nunsupport NAND/r/n");
for(;;);
}
GetParameters();
Uart_SendString("load Image of Linux.../n/r");
ReadImageFromNand(); //loader.....
}
通过ARM汇编来控制协处理器,对CACHE处理
static inline void MMU_EnableICache(void)
{
asm (
"mrc p15,0,r0,c1,c0,0/n"
"orr r0,r0,#(1<<12)/n"
"mcr p15,0,r0,c1,c0,0/n"
);
}
MRC 从协处理器移到ARM7寄存器(L=1)
MCR 从ARM7寄存器移到协处理器(L=0)