参考资料:https://blog.csdn.net/suiyuan19840208/article/details/7239949

https://blog.csdn.net/pugu12/article/details/47011159

http://tscsh.blog.163.com/blog/static/200320103201312645149965/

https://blog.csdn.net/winheroii58/article/details/6803327

1、第一阶段功能

* 硬件设备初始化

* 加载u-boot第二段代码到RAM空间

* 设置好栈

* 跳转到第二段代码入口

2、第二段代码的功能

* 初始化本阶段使用的硬件设备

* 检测系统的内存映射

* 将内核从Flash读到RAM中

* 为内核设置启动参数

* 调用内核

3 、u-boot第一阶段代码分析

我们在编译完成之后,观察顶层目录有个u-boot.lds的链接脚本

* 经过编译之后,查看文件u-boot.lds链接脚本,可以看到第一个链接文件是start.S

4、start.S

* 设置异常向量

当一个异常产生时,CPU根据异常号在异常向量表中找到对应的异常向量,然后执行异常向量处的跳转指令,,CPU跳转到对应的异常处理程序执行。

其中复位异常向量的指令“b start_code”决定了启动后将自动跳转到标号"start_code"处执行。

* CPU进入SVC模式

从数据手册上可以看到10011就是设置为管理模式

* 设置控制寄存器的地址

* 关闭看门狗

* 屏蔽中断

*设置时钟

CPU上电几毫秒后,晶振输出稳定,FCLK=Fin(晶振频率),CPU开始执行指令。但实际上,FCLK可以高于Fin,为了提高系统时钟,需要用软件来启用PLL。这就需要设置CLKDIVN,MPLLCON,UPLLCON这3个寄存器。

CLKDIVN寄存器,CLKDIVN寄存器用于设置FCLK,HCLK,PCLK三者间的比例

设置CLKDIVN为5,就将HDIVN设置为二进制的10,由于CAMDIVN[9]没有被改变过,取默认值0,因此HCLK = FCLK/4。

PDIVN被设置为1,因此PCLK= HCLK/2。因此分频比FCLK:HCLK:PCLK = 1:4:8 。

FCLK提供给ARM920T的时钟

HCLK 是提供给用于 ARM920T,存储器控制器,中断控制器,LCD 控制器,DMA 和 USB 主机模块的 AHB总线的时钟

PCLK 是提供给用于外设如WDT,IIS,I2C,PWM 定时器,MMC/SD 接口,ADC,UART,GPIO,RTC 和SPI的 APB 总线的时钟

FCLK与Fin的关系如下面公式:

MPLLCON寄存器用于设置FCLK与Fin的倍数。MPLLCON的位[19:12]称为MDIV,位[9:4]称为PDIV,位[1:0]称为SDIV。

MPLLCON与UPLLCON的值可以根据参考:

MPLLCON=(0x7f<<12) | (0x02<<4) | (0x01) = 0x7f021

UPLLCON=(0x38<<12) | (0x02<<4) | (0x02) = 0x38022

5、关闭 MMU、cache

代码中的c0,c1,c7,c8都是ARM920T的协处理器CP15的寄存器。其中c7是cache控制寄存器,c8是TLB控制寄存器。325~327行代码将0写入c7、c8,使Cache,TLB内容无效。

第332~337行代码关闭了MMU。这是通过修改CP15的c1寄存器来实现的,先看CP15的c1寄存器的格式(仅列出代码中用到的位):

V : 表示异常向量表所在的位置,0:异常向量在0x00000000;1:异常向量在 0xFFFF0000

I : 0 :关闭ICaches;1 :开启ICaches

R、S : 用来与页表中的描述符一起确定内存的访问权限

B : 0 :CPU为小字节序;1 : CPU为大字节序

C : 0:关闭DCaches;1:开启DCaches

A : 0:数据访问时不进行地址对齐检查;1:数据访问时进行地址对齐检查

M : 0:关闭MMU;1:开启MMU

332~337行代码将c1的 M位置零,关闭了MMU。

6 、初始化 RAM 控制寄存器

其中的lowlevel_init就完成了内存初始化的工作,由于内存初始化是依赖于开发板的,

因此lowlevel_init的代码一般放在board下面相应的目录中。

对于mini2440,lowlevel_init在board/samsung/mini2440/lowlevel_init.S中定义如下:

7、初始化堆栈、复制U-Boot第二阶段代码到RAM

* 设置栈,跳转到board_init_f

* board_init_f

* 设置gd结构体

* 初始化函数

*   board_early_init_f函数在board/samsung/smdk2410目录下的smdk2410.c文件内

*  timer_init函数在arch/arm/cpu/arm920t/s3c24x0目录下的timer.c文件内

*  env_init函数在common目录下的env_flash.c文件内

*  init_baudrate函数在arch/arm/lib目录下的board.c文件内

*  serial_init函数在drivers/serial目录下的serial_s3c24x0.c文件内,在include/configs/smdk2410.h中CONFIG_S3C24X0_SERIAL

*  console_init_f函数在common目录下的console.c文件内

*  display_banner函数在arch/arm/lib目录下的board.c文件内

*  dram_init函数在board/samsung/smdk2410目录下的smdk2410.c文件内

env_init最后关联到这个数组,用于设置环境变量

'\0'表示未进行设置

board_init_f 先是把RAM的地方给大家分好,设置各个模块的地址,例如堆栈、第二段代码的链接地址,

最后复制地位段代码到RAM上去。

8、跳转到第二阶段执行

2、board_init_r:各种初始化

enable_caches();

board_init(); /* Setup chipselects 、初始化启动参数的位置*/

set_cpu_clk_info();

serial_initialize();

nand_init(); /* go init the NAND */

env_relocate();/* initialize environment */

stdio_init(); /* get the devices list going. */

console_init_r(); /* fully init console as a device */

2、开始执行 main_loop():执行各种命令

main_loop()函数做的都是与具体平台无关的工作,主要包括初始化启动次数限制机制、设置软件版本号、打印启动信息、解析命令等。

参考资料:https://blog.csdn.net/winheroii58/article/details/6803327

bootcmd 、 bootargs这两个环境变量比较重要,下面我们介绍这两个环境变量

bootcmd

#define CONFIG_BOOTARGS "console=ttySAC0 root=/dev/mtdblock3"

#define CONFIG_BOOTCOMMAND "nand read 30000000 kernel;bootm 30000000"

参考资料:https://blog.csdn.net/g_salamander/article/details/8463854

https://blog.csdn.net/liangkaiming/article/details/5986680

* 一些小知识点

bootm

1.设置传递给内核的参数

2.启动

代码中执行获取执行bootcmd

s = getenv ("bootcmd");//获取环境变量

run_command_list(s, -1, 0);//执行环境变量

mini2440 u-boot linux 内核启动,u-boot.2012.10——mini2440(二、启动流程分析)相关推荐

  1. linux内核led驱动开发,从Linux内核LED驱动来理解字符设备驱动开发流程

    目录 博客说明 开发环境 1. Linux字符设备驱动的组成 1.1 字符设备驱动模块加载与卸载函数 1.2 字符设备驱动的file_operations 结构体中的成员函数 2. 字符设备驱动--设 ...

  2. linux内核包转发过程(三)NIC帧接收分析

    [版权声明:转载请保留源:blog.csdn.net/gentleliu.邮箱:shallnew*163.com] 每一个cpu都有队列来处理接收到的帧.都有其数据结构来处理入口和出口流量,因此.不同 ...

  3. Linux内核中无名管道pipe和有名管道fifo的分析

    1.管道(pipe) 管道是进程间通信的主要手段之一.一个管道实际上就是个只存在于内存中的文件,对这个文件的操作要通过两个已经打开文件进行,它们分别代表管道的两端.管道是一种特殊的文件,它不属于某一种 ...

  4. linux 内核 mtd读取,MTD坏块管理(二)-内核获取Nandflash的参数过程

    MTD坏块管理机制中,起着核心作用的数据结构是nand_chip,在此以TCC8900-Linux中MTD的坏块管理为例作一次介绍. MTD在Linux内核中同样以模块的形式被启用,TCC_MTD_I ...

  5. USB总线-Linux内核USB3.0设备控制器复合设备之USB gadget configfs分析(七)

    1.简介 configfs是基于ram的文件系统,与sysfs的功能有所不同.sysfs是基于文件系统的kernel对象视图,虽然某些属性允许用户读写,但对象是在kernel中创建.注册.销毁,由ke ...

  6. Linux内核网络udp数据包发送(二)——UDP协议层分析

    1. 前言 本文分享了Linux内核网络数据包发送在UDP协议层的处理,主要分析了udp_sendmsg和udp_send_skb函数,并分享了UDP层的数据统计和监控以及socket发送队列大小的调 ...

  7. PackageManagerService启动详解(三)之开始初始化阶段流程分析

      PKMS启动详解(三)之BOOT_PROGRESS_PMS_START阶段流程分析 Android PackageManagerService系列博客目录: PKMS启动详解系列博客概要 PKMS ...

  8. Linux内核异常向量表在哪,ARM64的启动过程之(六):异常向量表的设定

    ARM64的启动过程之(六):异常向量表的设定 作者:linuxer 发布于:2015-11-24 18:22 分类:ARMv8A Arch 一.前言 本文主要描述了4.1.10内核初始化过程中如何初 ...

  9. linux 内核参数分析,linux 内核参数VM调优 之 参数调节和场景分析

    总结可知cached中的脏数据满足如下几个条件中一个或者多个的时候就会被pdflush刷新到磁盘: (1)数据存在的时间超过了dirty_expire_centisecs(默认30s)时间 (2)脏数 ...

最新文章

  1. 在SpringBoot启动类上添加ComponentScan出现springbootapplication already applies given @ComponentScan
  2. js如何操作表格(常用属性方法汇总)
  3. DotNet指定文件显示的尺寸
  4. 诗歌rails之 定时任务 rufus-scheduler
  5. tictoc正方形网络模型_Trick | 分类网络Trick大汇总
  6. 创新将会出现在云端,边缘还是其他地方?
  7. 浅谈JavaScript、ES5、ES6
  8. python 怎么查看变量的数据类型
  9. 3层vni vxlan_方便业务迁移,大型企业数据中心VXLAN大二层基础,一分钟了解下
  10. MIP 组件库升级公告
  11. jsp中的四种对象作用域
  12. 如何在sql存储过程中打log_SQL语句优化
  13. cloudare mysql 密码修改_ubuntu18.04安装mysql,开启远程登录,修改默认端口
  14. PAT甲级1017 (模拟排序)
  15. .NET C#获取当前网页地址信息
  16. 支持MYSQL的DNS服务器的搭建
  17. html向上移动图片代码,图片随网页上下移动的代码实例
  18. linux管道通信原理
  19. 如何写好一篇优秀的硕士毕业论文
  20. JavaScript 表单对象 | 看完不会请来捶我

热门文章

  1. 在SSH上传文件出现Permission denied错误
  2. 【解答】一个电动模型,每一组电池能让其行驶8分钟,一个充电器能同时给两组电池充电,一组充满需要15分钟,至少准备(?)组电池,(?)个充电器,可以让模型每次行驶完可以立即换电池行驶不用等待。
  3. 计算机专业迎新标语,迎新 || 标题不要了,只要你
  4. qt 背景和控件布局_Qt控件背景图片设置总结
  5. C++ :跳表数据结构的实现原理
  6. C语言操作符(又称运算符)(2)
  7. python子进程关闭fd_如果创建了multiprocessing.Pool,Python子进程wait()将失败
  8. 已经无法合并还报请合并git_Git不能自动合并怎么解决?
  9. NXP I.MX6ULL 交叉编译工具链下载地址?
  10. 英伟达显卡不同架构_英伟达新款笔记本显卡全阵容曝光:共计六款