title: u-boot(三)启动文件

tags: linux

date: 2018-09-24 20:56:05

u-boot(三)启动文件

汇编

cpu/arm920t/start.S

u-boot也是一个牛逼的单片机程序,所以也就需要:

  1. 硬件相关初始化

    1. 看门狗
    2. 时钟
    3. sdram
    4. nand copy程序
  2. 设置sp
  3. 接下去就是读取内核,启动内核等

程序实际的步骤是:

1.set the cpu to SVC32 mode
2.turn off the watchdog
3.mask all IRQs
4.判断是不是从内部ram启动还是仿真直接烧写到链接地址,如果不在正确的加载地址的话,执行cpu_init_crit
cpu_init_crit执行SDRAM初始化
flush v4 I/D caches,
disable MMU stuff and caches,
lowlevel_init 这个会去初始化sdram,这个函数在lowlevel_init.S in your board directory
也就是board\100ask24x0\lowlevel_init.S
5.Set up the stack
6.clock_init board\100ask24x0\boot_init.c
7.relocate 自动识别当前是nor还是nand启动,nand启动时自动cp到内部ram中运行,所以可写
8.bss段清零
9.调用C函数 _start_armboot

堆栈设置如下

0x33F80000 uboot程序
·=-CFG_MALLOC_LEN malloc area
.=-CFG_GBL_DATA_SIZE bdinfo
.=-CONFIG_STACKSIZE_IRQ IRQ 的栈
.=-CONFIG_STACKSIZE_FIQ FRQ的栈
.=-12 leave 3 words for abort-stack
sp的初始位置

内存图:

C:_start_armboot

文件路径:lib_arm\board.c,这里就是u-boot执行C代码的地方了.

  • 分配了一个gd的结构体内存

    gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t));
    
    //在这里,_armboot_start=_start,根据链接脚本,这也就是代码段的起始=0x33F80000
    //也就是指向了内存图128的地方了
  • init_sequence这里执行一些初始化

    • board_init中设置了gd->bd->bi_arch_number = MACH_TYPE_S3C2440;,设置了一个参数gd->bd->bi_boot_params = 0x30000100;这个就是启动内核参数的地址
  • flash/nand 初始化

  • 堆栈初始化

  • 环境变量的设置存储(一种是代码写死,一种在FLASH上保存)

  • 进入主循环main_loop

代码摘要

void start_armboot (void)
{
//-----
/* Pointer is writable since we allocated a register for it */
gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t));
//-----
//函数指针,初始化设备
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
if ((*init_fnc_ptr)() != 0) {
hang ();
}
}
//---- flash初始化,识别
#ifndef CFG_NO_FLASH
/* configure available FLASH banks */
size = flash_init ();
display_flash_config (size);
#endif /* CFG_NO_FLASH */
////---- nand初始化
#if (CONFIG_COMMANDS & CFG_CMD_NAND)
puts ("NAND: ");
nand_init(); /* go init the NAND */
#endif
//------
//分配堆
/* armboot_start is defined in the board-specific linker script */
mem_malloc_init (_armboot_start - CFG_MALLOC_LEN);
//-----
//uboot的环境变量
/* initialize environment */
env_relocate ();
//-----
//经过一系列的初始化
/* main_loop() can return to retry autoboot, if so just run it again. */
for (;;) {
main_loop (); } init_fnc_t *init_sequence[] = {
cpu_init, /* basic cpu dependent setup */
board_init, /* basic board dependent setup */
interrupt_init, /* set up exceptions */
env_init, /* initialize environment */
init_baudrate, /* initialze baudrate settings */
serial_init, /* serial communications setup */
console_init_f, /* stage 1 init of console */
display_banner, /* say that we are here */
#if defined(CONFIG_DISPLAY_CPUINFO)
print_cpuinfo, /* display cpu info (and speed) */
#endif
#if defined(CONFIG_DISPLAY_BOARDINFO)
checkboard, /* display board info */
#endif
dram_init, /* configure available RAM banks */
display_dram_config,
NULL,
}; int board_init (void)
{
---
/* support both of S3C2410 and S3C2440, by www.100ask.net */
if (isS3C2410)
{
/* arch number of SMDK2410-Board */
gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;
}
else
{
/* arch number of SMDK2440-Board */
gd->bd->bi_arch_number = MACH_TYPE_S3C2440;
} /* adress of boot parameters */
gd->bd->bi_boot_params = 0x30000100; }

C:main_loop

common/main.c

内核启动

这里实现了u-boot的倒计时,有打印命令,获取环境变量等,最关键的代码是

s = getenv ("bootcmd");
if(倒计时结束)
{
printf("Booting Linux ...\n");
run_command (s, 0);
}

实际的环境变量是bootcmd=nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0,读取内核,启动内核

菜单处理(自定义实现)

如果倒计时结束前输入了空格,进入命令模式run_command("menu", 0);

命令处理

  1. 死循环
  2. 读取串口输入len = readline (CFG_PROMPT);
  3. 执行命令rc = run_command (lastcommand, flag);

u-boot(三)启动文件的更多相关文章

  1. 第三百三十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—Scrapy启动文件的配置—xpath表达式

    第三百三十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—Scrapy启动文件的配置—xpath表达式 我们自定义一个main.py来作为启动文件 main.py #!/usr/bin/en ...

  2. 启动bash shell的三种方式下,检查的启动文件

    启动bash shell的三种方式 1.登录时当做默认登录shell 2.作为非登录shell的交互式shell 3.作为运行脚本的非交互shell 一.登录shell 登录Linux系统时,bash ...

  3. Oracle启动中,spfile.ora、init<SID>.ora、spfile<SID>.ora 这三个文件正确的先后顺序是什么?

    Oracle启动中,spfile.ora.init<SID>.ora.spfile<SID>.ora 这三个文件正确的先后顺序是什么? 解答:启动数据库,使用startup命令 ...

  4. Spring Boot(三):Spring Boot中的事件的使用 与Spring Boot启动流程(Event 事件 和 Listeners监听器)

    前言:在讲述内容之前 希望大家对设计模式有所了解 即使你学会了本片的内容 也不知道什么时候去使用 或者为什么要这样去用 观察者模式: 观察者模式是一种对象行为模式.它定义对象间的一种一对多的依赖关系, ...

  5. spring boot容器启动详解

    目录 一.前言 二.容器启动 三.总结 =======正文分割线====== 一.前言 spring cloud大行其道的当下,如果不了解基本原理那么是很纠结的(看见的都是约定大于配置,但是原理呢?为 ...

  6. 让Spring Boot项目启动时可以根据自定义配置决定初始化哪些Bean

    让Spring Boot项目启动时可以根据自定义配置决定初始化哪些Bean 问题描述 实现思路 思路一 [不符合要求] 思路二[满足要求] 思路三[未试验] 问题描述 目前我工作环境下,后端主要的框架 ...

  7. 2.STM32启动文件

    一.概念声明 中断向量:由硬件产生的中断标识码,一般用于存放中断服务程序的跳转指令.根据硬件产生的中断号查找中断向量表来确定对应的中断向量.CM3内核有15个异常  和240个中断源.    程序的内 ...

  8. Spring Boot(十七):使用Spring Boot上传文件

    Spring Boot(十七):使用Spring Boot上传文件 环境:Spring Boot最新版本1.5.9.jdk使用1.8.tomcat8.0 一.pom包配置 <parent> ...

  9. Spring Boot 设置启动时banner

    Spring Boot项目再启动的时候默认会在控制台输出一个字符banner图案,如下图: 我们可以通过下面的方法关闭启动时显示字符banner图案: 关闭banner方法一: public stat ...

随机推荐

  1. mysql中count的注意事项

    1.count()函数是用来统计表中记录的一个函数,返回匹配条件的行数. 2.count()语法: (1)count(*)---包括所有列,返回表中的记录数,相当于统计表的行数,在统计结果的时候,不会 ...

  2. [WC2018]州区划分——FWT+DP+FST

    题目链接: [WC2018]州区划分 题目大意:给n个点的一个无向图,点有点权,要求将这n个点划分成若干个部分,每部分合法当且仅当这部分中所有点之间的边不能构成欧拉回路.对于一种划分方案,第i个部分的 ...

  3. CodeForces615B-Longtail Hedgehog-dp/图

    记忆化数组记录从这个点的最长下降序列,然后乘以这个点的度,就是ans,维护即可. #include <cstdio> #include <cstring> #include & ...

  4. Basic remains POJ - 2305 同余模 高精度处理

    题意 给出B(10以内大于0)进制下 p (1000位以内)和m(9位以内) 求 p%m 在b进制下等于什么 思路: 可以计算   1e9不会溢出Int所以m在int值以内  先求m  要处理p  每 ...

  5. bzoj 3626 : [LNOI2014]LCA (树链剖分+线段树)

    Description 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1.设dep[i]表示点i的深度,LCA(i,j)表示i与j的最近公共祖先.有q ...

  6. django-pure-pagination 组件使用

    django-pure-pagination 组件 用于在 django 中自动创建分页 官方详见 github : 这里 安装 pip install django-pure-pagination ...

  7. MT【294】函数定义的理解

    已知函数$f(x)$的定义域为$D,\pi\in D$.若$f(x)$的图像绕坐标原点逆时针旋转$\dfrac{\pi}{3}$后与原图像重合,则$f(\pi)$不可能是(    )A$\dfrac{ ...

  8. 用webpack2.0构建vue2.0单文件组件超级详细精简实例

    npm init -y 初始化项目  //-y 为自动生成package.json,如果需要自行配置,去掉-y即可 安装各种依赖项 npm install --save vue 安装vue2.0 np ...

  9. 自学zabbix集锦

    zabbix概念集锦 01 Zabbix采集数据方式 02 开源监控软件Cacti.nagios 03 Zabbix常用的术语 04 Zabbix核心概念回顾 05 Zabbix triggers-- ...

  10. [SCOI2015]国旗计划[Wf2014]Surveillance

    [SCOI2015]国旗计划 A国正在开展一项伟大的计划——国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这 项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了N名 ...