关键词:
1.UBOOT 运行的第一个文件是:cpu/arm920t/start.S(从程序的链接脚本中知道)
1 .globl _start // .globl定义一个全局符号"_start" 2 _start: b reset // 系统复位设置 3 ldr pc, _undefined_instruction //未定义异常 4 ldr pc, _software_interrupt //软件中断异常 5 ldr pc, _prefetch_abort //内存操作异常 6 ldr pc, _data_abort //数据异常 7 ldr pc, _not_used //未使用 8 ldr pc, _irq //中断异常(中断属于异常的一种) 9 ldr pc, _fiq //快速中断异常 10 11 _undefined_instruction: .word undefined_instruction //异常处理函数 12 _software_interrupt: .word software_interrupt 13 _prefetch_abort: .word prefetch_abort 14 _data_abort: .word data_abort 15 _not_used: .word not_used 16 _irq: .word irq 17 _fiq: .word fiq
1 reset: 2 /* 3 * set the cpu to SVC32 mode 将 CPU 设置为 SVC32 管理模式
1 #ifndef CONFIG_SKIP_LOWLEVEL_INIT 2 adr r0, _start /* r0 <- current position of code */ 3 ldr r1, _TEXT_BASE /* test if we run from flash or RAM */ 4 cmp r0, r1 /* don‘t reloc during debug */ 5 blne cpu_init_crit 6 #endif
1 /* turn off the watchdog 关闭 看门狗*/ 2 #if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) 3 ldr r0, =pWTCON 4 mov r1, #0x0 5 str r1, [r0]
1 /* 2 * mask all IRQs by setting all bits in the INTMR - default 屏蔽所有中断 3 */ 4 mov r1, #0xffffffff 5 ldr r0, =INTMSK 6 str r1, [r0] 7 # if defined(CONFIG_S3C2410) 8 ldr r1, =0x3ff 9 ldr r0, =INTSUBMSK 10 str r1, [r0] 11 # endif
/* 判断系统是从nand启动的还是直接将程序下载到SDRAM中运行, 若系统从nand启动,这里得到r0和r1值是不一样的,r1=0x33f80000, 而r0=0x00000000。说明没初始化SDRAM,ne(no equal)标识符为真,所以bl cpu_init_crit执行跳转. */
1 #ifndef CONFIG_SKIP_LOWLEVEL_INIT 2 adr r0, _start /* r0 <- current position of code adr 是读地址指令,当前 _start 这段代码位于哪里 */ 3 ldr r1, _TEXT_BASE /* test if we run from flash or RAM */ 4 cmp r0, r1 /* don‘t reloc during debug */ 5 blne cpu_init_crit 6 #endif
1 #ifndef CONFIG_SKIP_LOWLEVEL_INIT 2 cpu_init_crit: 3 /* 4 * flush v4 I/D caches 先关 flush 清 caches 5 */ 6 mov r0, #0 7 mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */ 8 mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB */ 9 10 /* 11 * disable MMU stuff and caches 关闭MMU 12 */ 13 mrc p15, 0, r0, c1, c0, 0 14 bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS) 15 bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM) 16 orr r0, r0, #0x00000002 @ set bit 2 (A) Align 17 orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache 18 mcr p15, 0, r0, c1, c0, 0 19 20 /* 21 * before relocating, we have to setup RAM timing 22 * because memory timing is board-dependend, you will 23 * find a lowlevel_init.S in your board directory. 24 */ 25 mov ip, lr 26 bl lowlevel_init //进入lowlevel_init初始化13个BANK寄存器来初始化SDRAM 27 mov lr, ip 28 mov pc, lr 29 #endif /* CONFIG_SKIP_LOWLEVEL_INIT */
1 /* Set up the stack 栈的设置 */ 2 stack_setup: 3 ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot */ 4 sub r0, r0, #CFG_MALLOC_LEN /* malloc area */ 5 sub r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo */ 6 7 #ifdef CONFIG_USE_IRQ 8 sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ) 9 #endif 10 sub sp, r0, #12 /* leave 3 words for abort-stack */ 11 12 #ifndef CONFIG_SKIP_LOWLEVEL_INIT 13 bl clock_init //进入 clock_init 函数 14 #endif
1 relocate: /* relocate U-Boot to RAM 重定位代码 拷贝u-boot到SDRAM */ 2 adr r0, _start /* r0 <- current position of code */ 3 ldr r1, _TEXT_BASE /* test if we run from flash or RAM */ 4 cmp r0, r1 /* don‘t reloc during debug */ 5 beq clear_bss 6 7 ldr r2, _armboot_start 8 ldr r3, _bss_start 9 sub r2, r3, r2 /* r2 <- size of armboot */
1 clear_bss: /*清除BSS段*/ 2 ldr r0, _bss_start /* find start of bss segment */ 3 ldr r1, _bss_end /* stop here */ 4 mov r2, #0x00000000 /* clear */
clbss_l:str r2, [r0] /* clear loop... */
add r0, r0, #4
cmp r0, r1
ble clbss_l
1 ldr pc, _start_armboot 2 3 _start_armboot: .word start_armboot /*最后调用 C 函数 start_armboo 用来实现第2阶段硬件相关的初始化*/
u-boot.2012.10——mini2440(启动流程分析)
...an19840208/article/details/72399491、第一阶段功能 *硬件设备初始化 *加载u-boot第二段代码到RAM空间 *设置好栈 *跳转到第二段代码入口2、第二段代码的功能 *初始化本阶段使用的硬件设备 *检测系统的内存映射 ... 查看详情
uboot移植之start_armboot()函数分析
/********************************uboot的第二阶段就是初始化剩下的还没在第一阶段初始化的硬件。主要是SoC外部硬件(譬如iNand网卡芯片.......)uboot本身的一些东西(uboot的命令环境变量等.....)。然后最终初始化完必要的东西后进入到u... 查看详情
u-boot-2016.07移植(第一篇)初步分析
U-BOOT-2016.07移植 (第一篇) 初步分析目录U-BOOT-201607移植 第一篇 初步分析目录编译和移植环境更新交叉编译工具1下载arm-linux-gcc4432安装arm-linux-gcc443安装环境Ubuntu910下载u-boot-201607并解压分析顶层Makefile1找出目标依赖关系2总结... 查看详情
移植最新u-boot之裁剪和修改默认参数
...过链接命令分析组成文件、阅读代码分析启动过程 a.初始化硬件:关看门狗、设置时钟、设置SDRAM、初始化NANDFLASH b.如果b 查看详情
tiny4412u-boot分析u-boot启动流程
...u-boot的启动分成两个阶段,第一个阶段主要的职责是准备初始化的环境,主要有以下几点①设置异常向量表②把CPU的工作模式设置为SVC32模式③关闭中断、MMU和cache④关闭看门狗⑤初始化内存、时钟、串口⑥设置堆栈⑦代码搬移... 查看详情
u-boot启动流程分析--start_armboot函数
第二阶段的功能: 初始化本阶段所需的硬件设备(主要设置系统时钟、初始化串口、Flash、网卡、USB) 检测系统内存映射(memorymap) 将内核映像和根文件系统映象从Flash上读到RAM空间中 为内核设置启动参数 ... 查看详情
成为linux程序员需要学习啥
...器11硬件环境的搭建;arm-linux-gcc与gcc安装配置第四部分:U-Boot:了解U-Boot的作用及工作流程;了解Bootloader的代码结构、编译过程;移植U-Boot;掌握常用的U-Boot命令。 Bootloader介绍u-boot工程介绍u-boot的编译使用u-boot源码分析u-boot... 查看详情
u-boot分析与使用(代码片段)
文章目录一、u-boot介绍二、u-boot源码结构三、u-boot打补丁、编译、烧写四、uboot功能、结构,结合Makefile进行分析五、u-boot分析之源码阶段六、u-boot分析之命令实现七、uboot启动内核一、u-boot介绍u-boot即通用的BootLoader,是... 查看详情
第二章tiny4412u-boot移植二启动分析
本文转载自:http://blog.csdn.net/eshing/article/details/37521481版权声明:本文为博主原创文章,未经博主允许不得转载。一、启动过程说明 讲解启动过程,首先的源头就是打开电源,这个相信没人人不知道。CPU... 查看详情
u-boot之启动第一阶段(代码片段)
基于samsung的Exynos4412从链接脚本u-boot.lds中我们知道u-boot是从start.s这个汇编文件开始的,所以u-boot启动的第一阶段肯定也是从这里开始的,这个文件在cpu/arm_cortexa9/文件夹下,下面我们依照这个文件一步一步分析u-boot启动的第一阶... 查看详情
uboot源码分析1-启动第一阶段
...置的,因为当前整个代码还在SRAM中运行,此时DDR还未被初始化还不能用 10.1lowlevel_init详解(1)先将LR入栈(2)检查复位状态,防止DDR再次初始化; 冷上电时DDR是需要初始化才能用的;而热启动或者低功耗状态下的... 查看详情
linux系统移植:正点原子u-boot移植(代码片段)
...上电以后先运行一段bootloader程序。这段bootloader程序会先初始化DDR等外设,然后将Linux内核从flash(NAND,NORFLASH,SD,MMC等)拷贝到DDR中,最后启动Linux内核;这段bootloader程序有很多种,比如U-Boot、vivi、RedBo... 查看详情
linux下怎么检查串口号
...段:第一阶段主要是进行cpu和体系结构的检查、cpu本身的初始化以及页表的建立等;第二阶段主要是对系统中的一些基础设施进行初始化;最后则是更高层次的初始化,如根设备和外部设备的初始化。LINUX内核支持很多的硬件体... 查看详情
u-boot代码分析--第一节(代码片段)
u-boot代码分析--第一节编者:weirdo时间:2020-5-12QQ:2651293248标题:u-boot代码分析第一节1.u-boot.lds文件?? 这里指的是顶层目录下面的u-boot.lds,这里需要注意的是这个文件是根据arch/arm/cpu/armvx/对应的u-boot.lds模板生成的,在不严格的... 查看详情
u-boot移植---修改前工作:代码流程分析3---代码重定位
...链接时候的地址就会生成,然后存储在段里面,如下段(u-boot.lds): 查看详情
s5pv210-uboot源码分析-第一阶段
...1-启动第一阶段1、starts.S是我们uboot源码的第一阶段:从u-boot.lds链接脚本中也可以看出start.S是我们整个程序的入口处,怎么看出的呢,因为在链接脚本中有个ENTRY(_start)声明了_start是程序的入口。所以_start符号所在的文件,就是... 查看详情
10th.u-boot——代码结构分析
简介 U-Boot(UniversalBootLoader),通用BootLoader,一是可以引导多种操作系统,二是支持多种架构CPU。 教程中是在sourcefoge网站上下载的U-boot-1.1.6源码,进行分析与移植。 结构分析 U-boot-1.1.6有26个子目录... 查看详情
u-boot-2014-07代码流程分析
前言以前接触到的u-boot启动方式只有Flash和NandFlash这两种方式,最近接触是SD卡启动方式,SoC是S5P4418,启动方式也第一次接触到,根据S5P4418用户手册可以找到系统使用SD卡启动时,片内iROM内固化的代码会自动映射到0x00地址,也... 查看详情