Uboot的分析:
1. 针对Uboot的结构分析
版本号的变化
2008年8月及以前,按版本号命名:u-boot-1.3.4.tar.bz2(2008年8月更新)2008年8月以后均按日期命名。目前最新版本:u-boot-2012.10.tar.bz2(更新时间15-Oct-2012 20:39 9.0M)
目录结构变化:u-boot目录结构主要经历过2次变化,u-boot版本第一次从u-boot-1.3.2开始发生变化,主要增加了api的内容;变化最大的是第二次,从2010.6版本开始。
u-boot-2010.03及以前版本的目录结构:
├── api 存放uboot提供的接口函数
├── board 根据不同开发板定制的代码,代码也不少
├── common 通用的代码,涵盖各个方面,已命令行处理为主
├── cpu 与体系结构相关的代码,uboot的重头戏
├── disk 磁盘分区相关代码
├── doc 文档,一堆README开头的文件
├── drivers 驱动,很丰富,每种类型的设备驱动占用一个子目录
├── examples 示例程序
├── fs 文件系统,支持嵌入式开发板常见的文件系统
├── include 头文件,已通用的头文件为主
├── lib_【arch】 与体系结构相关的通用库文件(10个文件,支持10种处理器架构)
├── nand_spl NAND存储器相关代码
├── net 网络相关代码,小型的
协议
离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载
栈
├── onenand_ipl
├── post 加电自检程序
└── tools 辅助程序,用于编译和检查uboot目标文件
从u-boot-2010.06版本开始把体系结构相关的内容合并,原先的cpu与lib_arch内容全部纳入arch中,并且其中增加inlcude文件夹;分离出通用库文件lib。
u-boot-2010.06及以后版本
├── api 存放uboot提供的接口函数
├── arch 与体系结构相关的代码,uboot的重头戏
├── board 根据不同开发板定制的代码,代码也不少
├── common 通用的代码,涵盖各个方面,已命令行处理为主
├── disk 磁盘分区相关代码
├── doc 文档,一堆README开头的文件
├── drivers 驱动,很丰富,每种类型的设备驱动占用一个子目录
├── examples 示例程序
├── fs 文件系统,支持嵌入式开发板常见的文件系统
├── include 头文件,已通用的头文件为主
├── lib 通用库文件
├── nand_spl NAND存储器相关代码
├── net 网络相关代码,小型的协议栈
├── onenand_ipl
├── post 加电自检程序
└── tools 辅助程序,用于编译和检查uboot目标文件
移植工作最主要的是看对应的处理器和开发板代码,2010.06版本以后处理器相关的代码集中在arch、board目录。(以前版本主要在cpu和board目录)
|--arch\
|--arm\
|--cpu\ 子目录对应一种处理器的不同产品型号或者系列;
|--arm720t\
|--arm920t\
|--a320\
|--at91\
|...
|--s3c24x0\
|--interrupts.c
|--speed.c
|--timer.c
|--usb.c
|--usb_ohci.c
|--usb_ohci.h
|--Makefile
|--cpu.c
|--interrupts.c
|--start.S <==整个bootloader入口点
|--u-boot.lds <==链接脚本
|--Makefile
|--config.mk
|--include\ 子目录是处理器用到的头文件;
|--asm\
|--arch-a320\
|...
|--arch_s3c24x0\
|--memory.h
|--s3c2400.h
|--s3c2410.h
|--s3c24x0_cpu.h
|--s3c24x0.h
|...
|--proc-armv\(公用)
|--atomic.h
|--bitops.h
|--byteorder.h
|--cache.h
|--... (等共24个.h公用头文件)
|--lib\ 目录对应用到处理器公用的代码;
|--board.c
|--config.mk
|--... (等共16个文件)
|--board\
|--ppmc7xx\
|...
|--samsung\
|--goni\
|--smdk2400\
|--smdk2410\
|--smdk2410.c
|--flash.c
|--lowlevel_init.S
|--config.mk
|--Makefile
|--nand_read.c
|--nand_read_save.c
|...
drivers/i2c/s3c24x0_i2c.c
/mtd/nand/nand_base.c
/mtd/nand/nand_util.c
/mtd/nand/s3c2410_nand.c
/net/dm9000x.c
/video/cfb_console_2.c
/video/cfb_console.c
/video/Makefile
/video/s3c2410_fb.c
/video/videomodes.c
/video/videomodes.h
/configs/fl2440.h
/linux/mtd/mtd.h
/serial.h
common/cmd_nand.c
/serial.c
board.cfg
Makefile
2.
流程
快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计
分析、
.globl _start是定义uboot的启动入口点。 .global是GNU ARM汇编的一个伪操作,声明一个符号可被其他文档引用,相当于声明了一个全局变量,.globl和.global相同。该部分为处理器的异常处理向量
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
。地址范围为0x0000 0000 ~ 0x0000 0020,刚好8条指令。
中断向量表
.globl _start
_start: b start_code
ldr pc, _undefined_instruction
ldr pc, _software_interrupt
ldr pc, _prefetch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq
针对具体的CPU,首先要了解处理器上电后的第一条指令所放的位置,处理器规定了中断向量表的位置。在lds文件中指定了在链接时的入口和各个程序的位置。
汇编指令b是跳转,中断向量表是一个地址列表,每一个32位即4字节对应一种异常的入口,通过代码向各个入口地址中指定异常处理程序的具体位置。
_undefined_instruction: .word undefined_instruction
_software_interrupt: .word software_interrupt
_prefetch_abort: .word prefetch_abort
_data_abort: .word data_abort
_not_used: .word not_used
_irq: .word irq
_fiq: .word fiq
.balignl 16,0xdeadbeef
_undefined_instruction: .word undefined_instruction是将undefined_instruction赋给_undefined_instruction,是word类型的,占4字节。
关于在复位时使用b进行跳转,和异常的ldr指令。
B是跳转指令,它只执行跳转动作,跳转到指令中目标地址。Ldr是字数据读取指令,该指令用于从内存中将一个32位的字读取到指令中的目标寄存器中。
这两个指令的使用和MMU的关系,
MMU是内存管理单元,在系统复位后MMU是还没有启动的,这时候虚拟地址就等同于物理地址。
3.
文档已经阅读完毕,请返回上一页!