U-Boot启动过程(2)
2010-12-14 22:58
169 查看
lib_arm/board.c
start_armboot 是U-Boot执行的第一个C语言函数,完成系统初始化工作,进入主循环,处理用户输入的命令
start_armboot 是U-Boot执行的第一个C语言函数,完成系统初始化工作,进入主循环,处理用户输入的命令
void start_armboot(void) { DECLARE_GLOBAL_DATA_PTR; ulong size; init_fnc_t **init_fnc_ptr; char *s; /* Pointer is writable since we allocated a register for it */ gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t)); /* compiler optimization barrier needed for GCC >= 3.4 */ __asm__ __volatile__("" : : : "memory"); memset((void *)gd, 0, sizeof(gd_t)); gd->bd = (bd_t*)((char *)gd - sizeof(bd_t)); memset(gd->bd, 0, sizeof(bd_t)); monitor_flash_len = _bss_start - _armboot_start; /* 顺序执行init_sequence数组中的初始化函数 */ for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) { if ((*init_fnc_ptr)() != 0) hang(); } /* 配置可用的Flash */ size = flash_init(0); display_flash_config(size); /* _armboot_start 在u-boot.lds链接脚本中定义 */ mem_malloc_init(_armboot_start - CFG_MALLOC_LEN); /* 配置环境变量,重新定位 */ env_relocate(); /* 从环境变量中获取IP地址 */ gd->bd->bi_ip_addr = getenv_IPaddr("ipaddr"); /* 以太网接口MAC地址 */ ... devices_init(); /* 获取列表中的设备 */ jumptable_init(); console_init_r(); /* 完整地初始化控制台设备 */ enable_interrupts(); /* 使能例外处理 */ /* 通过环境变量初始化 */ if ((s = getenv("loadaddr")) != NULL) { load_addr = simple_strtoul(s, NULL, 16); } /* main_loop()总是试图自动启动,循环不断执行 */ for (; ;) { main_loop(); /* 主循环函数处理执行用户命令 -- common/main.c */ } /* NOTREACHED - no way out of command loop except booting */ }
相关文章推荐
- U-Boot启动过程
- U-Boot启动过程完全分析
- u_boot启动过程中的具体分析(1)
- U-Boot启动过程完全分析
- Spring Boot启动过程(六):内嵌Tomcat中StandardHost、StandardContext和StandardWrapper的启动
- U-Boot的移植之(二)进阶篇:从源代码看系统启动过程
- U-Boot启动过程完全分析
- mini2440 U-Boot启动过程完全分析
- 嵌入式Linux启动过程分析6-u-boot-2step-word description
- Spring Boot启动过程源码分析(二)事件监听器
- Spring Boot启动过程(五)之Springboot内嵌Tomcat对象的start教程详解
- u-boot启动过程完全分析
- 移植u-boot学习笔记1-----实验及分析启动过程之概述
- u-boot启动过程源码分析之第一阶段(S3C24XX系列)
- 【原】用以太网Boot启动WinCE的过程浅析
- U-Boot启动过程--详细版的完全分析
- 移植u-boot学习笔记3-----分析启动过程之重定位
- [RK3399][Android7.1] Uboot启动过程小结
- U-BOOT启动linux的过程
- U-Boot启动过程完全分析