228
此前内存初始化好了,sp也设置好了,可以运行C程序
还有
#define SMDK2410_SDRAM_PHYS_BASE
#define SMDK2410_SDRAM_VIRT_BASE
#define SMDK2410_FLASH_PHYS_BASE
#define SMDK2410_FLASH_VIRT_BASE
内存从0x30000000开始的
ttb_base=0x30004000是translation table base,虚拟地址到实地址内存映射表的基地址
第177行,ttb_base要存放在cp15的reg2中
第196行,对section的进入权限控制,存放在cp15的reg3中
148
将空间划分为以section为单位,即1M每个。
开始填充每个descriptor,按照手册上的位图填好就完事。
121
struct ARM_MMU_FIRST_LEVEL_SECTION {
};
为了有个直观的影响,现在把填好的ttb这个表列出来
address |
b_addr:12 |
sbz1:1 |
ap:2 |
sbz0:1 |
domain:4 |
imp:1 |
c:1 |
b:1 |
id:2 |
0x30004000 |
0x300 |
0 |
3 |
0 |
0 |
1 |
1 |
1 |
2 |
… |
… |
0 |
3 |
0 |
0 |
1 |
1 |
1 |
2 |
0x300040fc |
0x33f |
0 |
3 |
0 |
0 |
1 |
1 |
1 |
2 |
|
|
|
|
|
|
|
|
|
|
0x30004c00 |
0x300 |
0 |
3 |
0 |
0 |
1 |
0 |
0 |
2 |
… |
… |
0 |
3 |
0 |
0 |
1 |
0 |
0 |
2 |
0x30004cfc |
0x33f |
0 |
3 |
0 |
0 |
1 |
0 |
0 |
2 |
|
|
|
|
|
|
|
|
|
|
0x30005000 |
0x400 |
0 |
3 |
0 |
0 |
1 |
1 |
1 |
2 |
|
|
|
|
|
|
|
|
|
|
0x30005200 |
0x480 |
0 |
3 |
0 |
0 |
1 |
0 |
0 |
2 |
… |
… |
0 |
3 |
0 |
0 |
1 |
0 |
0 |
2 |
0x300059fc |
0x67f |
0 |
3 |
0 |
0 |
1 |
0 |
0 |
2 |
|
|
|
|
|
|
|
|
|
|
0x30006000 |
0x000 |
0 |
3 |
0 |
0 |
1 |
0 |
0 |
2 |
0x30006004 |
0x001 |
0 |
3 |
0 |
0 |
1 |
0 |
0 |
2 |
|
|
|
|
|
|
|
|
|
|
< hal/arm/arch/v3_0/src/vectors.S >
500 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK
第465行
第70行
第73行
hal_virtual_vector_table[]是个全局的系统调用列表,每个的具体功能如下
// linker script. Both ROM and RAM startup applications will know about
// the location.
#define CYGNUM_CALL_IF_VERSION
#define CYGNUM_CALL_IF_available_1
#define CYGNUM_CALL_IF_available_2
#define CYGNUM_CALL_IF_available_3
#define CYGNUM_CALL_IF_KILL_VECTOR
#define CYGNUM_CALL_IF_CONSOLE_PROCS
#define CYGNUM_CALL_IF_DEBUG_PROCS
#define CYGNUM_CALL_IF_available_7
#define CYGNUM_CALL_IF_available_8
#define CYGNUM_CALL_IF_available_9
#define CYGNUM_CALL_IF_available_10
#define CYGNUM_CALL_IF_available_11
#define CYGNUM_CALL_IF_SET_DEBUG_COMM
#define CYGNUM_CALL_IF_SET_CONSOLE_COMM
#define CYGNUM_CALL_IF_MONITOR_VERSION
#define CYGNUM_CALL_IF_DBG_SYSCALL
#define CYGNUM_CALL_IF_RESET
#define CYGNUM_CALL_IF_CONSOLE_INTERRUPT_FLAG
#define CYGNUM_CALL_IF_DELAY_US
#define CYGNUM_CALL_IF_DBG_DATA
#define CYGNUM_CALL_IF_FLASH_CFG_OP
#define CYGNUM_CALL_IF_MONITOR_RETURN
#define CYGNUM_CALL_IF_FLASH_FIS_OP
#define CYGNUM_CALL_IF_FLASH_FIS_OP2
#define CYGNUM_CALL_IF_LAST_ENTRY
#define CYGNUM_CALL_IF_INSTALL_BPT_FN
#define CYGNUM_CALL_IF_TABLE_SIZE
hal_hardware_init()
è HAL_ICACHE_INVALIDATE_ALL()
è HAL_DCACHE_ENABLE()
è HAL_ICACHE_ENABLE()
cyg_hal_invoke_constructors()
然后,sp指向__startup_stack
跳转到cyg_start()运行
原文见:http://blog.sina.com.cn/s/blog_559f6ffc0100mjlq.html