第七章-BootLoader实例剖析

第七章-BootLoader实例剖析
第七章-BootLoader实例剖析

第七章BootLoader实例剖析

7.1 BootLoader概述

BootLoader:引导加载程序,就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。

BootLoader包括固化在固件(firmware)中的boot 代码(可选)和外部的BootLoader 两大部分。大多数BootLoader 都包含两种不同的操作模式:"启动加载"模式和"下载"模式,这种区别仅对于开发人员才有意义。但从最终用户的角度看,Boot Loader 的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。

启动加载(Boot loading)模式:这种模式也称为"自主"(Autonomous)模式。也即Boot Loader 从目标机上的某个固态存储设备上将操作系统加载到RAM 中运行,整个过程并没有用户的介入。这种模式是Boot Loader 的正常工作模式,因此在嵌入式产品发布的时侯,Boot Loader 显然必须工作在这种模式下。

下载(Downloading)模式:在这种模式下,目标机上的BootLoader 将通过串口连接或网络连接等通信手段从主机(Host)下载文件,比如:下载内核映像和根文件系统映像等。从主机下载的文件通常首先被BootLoader 保存到目标机的RAM 中,然后再被Boot Loader 写到目标机上的FLASH 类固态存储设备中。BootLoader 的这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用BootLoader 的这种工作模式。工作于这种模式下的Boot Loader 通常都会向它的终端用户提供一个简单的命令行接口。

7.2 ARM7教学平台BIOS剖析

7.2.1 简介

ARM7教学平台BIOS就是FS44B0Xbios--BIOS FOR FS44B0X,是优龙公司专门为

FS44B0X开发板提供的。作为系统启动的引导模块,FS44B0Xbios只支持三星公司的

S3C44B0X(ARM7)处理器,不支持多种处理器结构,同时功能结构简单。

7.2.2结构功能分析

FS44B0Xbios因为功能简单,而且只针对一种处理器,所以结构也十分简单。源码包里只有相应的*.c、*.s源文件,只有一个文件夹是存放头文件的。没有分层和有关体系等复杂的结构。现就源文件作用说明一下:

39VF160.C 提供对FLASH 39VF160的驱动,包括设备ID、擦除、编程、读等操作。

ARP.C 提供对简单TCP/IP协议中间层的支持。

BOOT.S 中断向量表,S3C44B0X 是不可以remap 的,为了运行有中断的程序,我们要把中断向量表烧写到flash 里的零地址处。

CONSOLE.C 提供对S3C44B0X串口的驱动,包括串口的读写、设置等。

CTEL_SET.C 提供对S3C44B0X上的RTC的驱动,包括RTC的读写、设置等。

ETH.C 提供对RTL8019网卡的驱动。

ICMP.C提供对简单TCP/IP协议中间层的支持。

IP.C 提供对简单TCP/IP协议中间层的支持。

MAC.C提供对RTL8019网卡MAC层的驱动。

MAIN.C 主函数,在此调用各种驱动支持,完成FS44B0Xbios的功能。

SKBUFF.C 对收发缓冲区进行操作,给TCP/IP协议提供服务。

SYSINIT.S 对S3C44B0X进行初始化,完成处理器的相关寄存器的配置工作。

TFTP.C 提供tftp协议通信功能,供TCP/IP使用。

TFTPMAIN.C 由上层应用程序调用,启动tftp通信功能,供下载文件、内核使用。

TFTPPUT.C 提供tftp协议通信功能,供TFTP.C使用。

UDP.C 提供对简单TCP/IP协议中间层的支持。

UTILS.C 提供一些常用函数,如内存拷贝、设置、字符串比较等功能。

VECTOR.S 整个程序的入口模块

根据上面的分析,可以看出FS44B0Xbios的功能十分简单,只提供了串口通信、网口通信、FLASH操作、实时时钟。下面列出FS44B0Xbios提供的命令:

{"help", "show help", Help},

{"?", "= help", Help},

{"date", "show or set current date", GetDate},

{"time", "show or set current time", GetTime},

{"setweek", "set weekday", SetWeek},

{"clock", "show system running clock", SysClock},

{"setmclk", "set system running clock", ChgSysMclk},

{"setbaud", "set baud rate", ChgBaudRate},

{"load", "load file to memory", LoadFile2Mem},

{"comload", "load file from serial port", LoadFromUart},

{"prog", "program flash", ProgFlash},

{"boot", "boot from flash", BootLoader},

{"ap", "auto load image flie and program flash", AutoProgFlash},

{"copy", "copy flash from src to dst address", CopyFlash},

{"ipcfg", "show or set IP address", SetIPAddr},

{"run", "run from ram", RunProgram},

{"move", "move data from flash to ram", MoveFlashToRam},

7.2.3移植

FS44B0Xbios是优龙公司专门为他们的FS44B0X开发板提供的。它只持三星公司的

S3C44B0X(ARM7)处理器,不支持多种处理器结构,因此移植只能在具有相同处理器的开发板上进行。根据开发板上的硬件配置不同,修改相应的硬件驱动程序。

根据上面功能分析,FS44B0Xbios现在只对FLASH 39VF160、RTL8019网卡、S3C44B0X

串口、S3C44B0X上的RTC提供驱动支持,RAM配置为8M的SDRAM。需要修改的地方:(1)如果你的开发板使用其它型号的FLASH ,可根据文件39VF160.C和39VF160.H进行移植,注意要修改MAIN.C里面FLASH 的大小,现大小为#define __ROM_SIZE 0x200000。

(2)如果你的开发板使用不同的RAM,就要修改SYSINIT.S 里的存储器配置参数。此BIOS的运行地址为0XC7C0000,可在ADS 中修改。

7.3 U-Boot移植过程剖析

7.3.1 简介

U-Boot 是Das U-Boot 的简称,它的前身是PPCBOOT,PPCBOOT 自2.0 版本后就改名为U-BOOT,由denx 软件中心依照GPL 发布的公共软件,作为系统启动的引导装载模块,U-Boot 支持多种处理器架构,如:PowerPC(MPC5xx, MPC8xx, MPC82xx, MPC7xx, MPC74xx, 4xx), ARM(ARM7, ARM9, StrongARM, Xscale), MIPS(4Kc,5Kc), x86 等。U-Boot 目前的最高版本是U-Boot-1.1.2,大家可以到上查看

U-Boot 的最新信息和下载。

7.3.2 结构分析

U-Boot的功能非常强大,已经相当于一个小的OS,因此里面的结构比较复杂,由于采用分层结构,它里面的体系结构还是十分清晰的。现在就源码包下面的文件夹作简单的分析,不涉及下一级的文件夹。分析采用的U-Boot-1.1.1 的版本,其结构分析如下:board:包含多种目标系统,主要是和目标系统板相关的代码定义,例如我所用到

的文件board/snds100/smdk4110.c 中有关于处理器的I/O 端口定义等操作,还有文件board/snds100/flash.c,关于目标系统板上FLASH的操作。

common:该目录下主要包含与处理器无关的功能,例如U-Boot 的命令处理,环境

变量的设置等

CPU:与CPU 有关的功能,例如:cpu/s3c44b0/serial.c 是s3c44b0自带串口的驱动,cpu/mpc8260/ether_fcc.c 是FCC 网口的驱动等

disk:主要是磁盘驱动处理的代码

doc:主要是一些readme 文档,用处不是太大

driver:主要是一些设备驱动,如rtl8139.c 是8139 网卡的驱动等

dtt:针对温度设备的驱动,如ds1621.c 是ds1621温度芯片的驱动等

examples:主要是一些应用例子,如hello_world.c,timer.c 等

fs:文件系统的支持

include:U-Boot 头文件,需要修改的文件如include/configs/Snds100.h 等

lib_generic:公共的库目录,包含CRC 校验,压缩,打印显示等功能

lib_ppc:和PowerPC 系列有关的功能,如lib_ppc/board.c 文件中的初始化功能

lib_arm:和ARM 系列有关的功能,如lib_arm/board.c 文件中的初始化功能

net:U-Boot 对网络协议的支持,主要支持bootp/rarp 和tftp 协议

post:目标系统板上电复位自检功能

rtc:硬件实时时钟的驱动

tools:用来生成U-Boot 镜像的一些工具

7.3.3 功能分析

U-Boot 的功能很强大,除了完成基本的系统启动和下载功能外,还可以完成很多其他的功能,这一点大家可以通过在U-Boot 的命令行中输入“help”或者“?”来得到:

? - alias for 'help'

askenv - get environment variables from stdin

autoscr - run script from memory

base - print or set address offset

bdinfo - print Board Info structure

boot - boot default, i.e., run 'bootcmd'

bootd - boot default, i.e., run 'bootcmd'

bootm - boot application image from memory

bootp - boot image via network using BootP/TFTP protocol

brginfo - print Baud Rate Generator (BRG) registers

carinfo - print Clocks and Reset registers

chpart - change active partition

cmp - memory compare

coninfo - print console devices and informations

cp - memory copy

crc32 - checksum calculation

dcache - enable or disable data cache

dhcp - invoke DHCP client to obtain IP/boot params

dmainfo - print SDMA/IDMA registers

echo - echo args to console

erase - erase FLASH memory

fccinfo - print FCC registers

flinfo - print FLASH memory information

fsinfo - print information about filesystems

fsload - load binary file from a filesystem image

go - start application at address 'addr'

help - print online help

i2cinfo - print I2C registers

icache - enable or disable instruction cache

icinfo - print Interrupt Controller registers

icrc32 - checksum calculation

iloop - infinite loop on address range

imd - i2c memory display

iminfo - print header information for application image

imls - list all images found in flash

imm - i2c memory modify (auto-incrementing)

imw - memory write (fill)

in - read data from an IO port

inm - memory modify (constant address)

iopinfo - print I/O Port registers

iopset - set I/O Port registers

iprobe - probe to discover valid I2C chip addresses

irqinfo - print information about IRQs

isdram - print SDRAM configuration information

loadb - load binary file over serial line (kermit mode)

loads - load S-Record file over serial line

loop - infinite loop on address range

ls - list files in a directory (default /)

mccinfo - print MCC registers

md - memory display

memcinfo- print Memory Controller registers

mii - MII utility commands

mm - memory modify (auto-incrementing)

mtest - simple RAM test

muxinfo - print CPM Multiplexing registers

mw - memory write (fill)

nm - memory modify (constant address)

out - write datum to IO port

ping - send ICMP ECHO_REQUEST to network host

printenv- print environment variables

protect - enable or disable FLASH write protection

rarpboot- boot image via network using RARP/TFTP protocol

reset - Perform RESET of the CPU

run - run commands in an environment variable

saveenv - save environment variables to persistent storage

saves - save S-Record file over serial line

sccinfo - print SCC registers

setenv - set environment variables

siinfo - print Serial Interface (SI) registers

sitinfo - print System Integration Timers (SIT) registers

siuinfo - print System Interface Unit (SIU) registers

sleep - delay execution for some time

smcinfo - print SMC registers

spiinfo - print Serial Peripheral Interface (SPI) registers

tftpboot- boot image via network using TFTP protocol

version - print monitor version

在命令列表里面的这些命令,有一些并没有完成,所以只是提供一个接口,如果用户需要,可以自己编写命令代码来实现它的功能。在这里,我介绍几个常用的功能:printenv:主要用于打印环境变量的值

=> printenv 打印所有环境变量的值

=> printenv name …打印某一个环境变量的值

setenv:设置环境变量的值

=> setenv name value 将环境变量“name”的值设置为“value”

md:用于显示存储器中某段地址的值

=> md 0x06000000 显示我的目标系统中Application Flash 中的值

tftpboot:用于通过TFTP 从主机上下载内核镜像文件

=> tftpboot 0x100000 pImage 从主机下载pImage 文件放到地址0x100000 处

bootm:从某一地址启动应用镜像

=> bootm 0x100000 从0x100000 处开始运行镜像

boot:运行环境变量bootcmd 中的命令

=> printenv bootcmd

=> bootcmd=tftpboot 0x100000 pImage;bootm 可以有多条命令,用分号隔开

=> boot 首先运行“tftpboot 0x100000 pImage”,然后运行“bootm”

help [command …]:显示某一命令的用法

=> help go

go addr [arg ...]

- start application at address 'addr'

passing 'arg' as arguments

7.3.4 移植

7.3.4.1 U-Boot代码移植

前面分析,U-Boot支持多种处理器架构和目标系统板架构,如果你的开发板和处理器在U-Boot里面都有,那么直接使用即可。如果没有完全相同的,U-Boot 里面包含了很多种目标系统板的类型,为了减小移植的工作量,应该选择一种和自己目标板相近的板类型,这里使用优龙提供的基于S3C44B0处理器的开发板作为例子,开发板配置如下:CPU:S3C44b0

NOR FLASH: 8M Bit,AMD Am29LV800BT

SDRAM:16M, 连接在CPU的NGCS6和NGCS7上

RTL8019 (10/100M) 网卡

在U-Boot里面的目标系统板smdk4110也是使用S3C44B0处理器,AMD的Am29LV160BB,所以选择SMDK4110作为移植参考目标板。下面我们根据自己的目标系统板配置修改U-Boot 包中的代码文件,进行U-Boot 的移植。

修改目标系统FLASH驱动文件./board/smdk4110/flash.c

(1)修改flash的初始化

smdk4110使用AMD的Am29LV160BB,我们使用AMD的Am29LV800BT

flash_info[i].flash_id =

(AMD_MANUFACT & FLASH_VENDMASK) |

(AMD_ID_LV160B & FLASH_TYPEMASK);

改为 flash_info[i].flash_id =

(AMD_MANUFACT & FLASH_VENDMASK) |

(AMD_ID_LV800T & FLASH_TYPEMASK);

两个flash的扇区结构不一样

for (j = 0; j < flash_info[i].sector_count; j++)

{

if (j <= 3)

{

/* 1st one is 16 KB */

if (j == 0)

{

flash_info[i].start[j] = flashbase + 0;

}

/* 2nd and 3rd are both 8 KB */

if ((j == 1) || (j == 2))

{

flash_info[i].start[j] = flashbase + 0x4000 + (j-1)*0x2000;

}

/* 4th 32 KB */

if (j == 3)

{

flash_info[i].start[j] = flashbase + 0x8000;

}

}

else

{

flash_info[i].start[j] = flashbase + (j - 3)*MAIN_SECT_SIZE;

}

}

改为

for (j = 0; j < flash_info[i].sector_count; j++)

{

if (j > 15)

{

/* 1st one is 16 KB */

if (j == 16)

{

flash_info[i].start[j] = flashbase + (j-1)*MAIN_SECT_SIZE + 0x8000;

}

/* 2nd and 3rd are both 8 KB */

if (j == 17)

{

flash_info[i].start[j] = flashbase + (j-2)*MAIN_SECT_SIZE + 0xa000;

}

/* 4th 32 KB */

if (j == 18)

{

flash_info[i].start[j] = flashbase + (j-3)*MAIN_SECT_SIZE + 0xc000;

}

}

else

{

flash_info[i].start[j] = flashbase + j*MAIN_SECT_SIZE;

}

}

(2)修改flash信息打印

case (AMD_ID_LV160B & FLASH_TYPEMASK):

printf("1x Amd29LV160BB (16Mbit)\n");

break;

改为

case (AMD_ID_LV800T & FLASH_TYPEMASK):

printf("1x Amd29LV800BT (8Mbit)\n");

break;

修改目标系统存储器配置文件 ./board/smdk4110/memsetup.s

.equ Trc, 0x3 /* 0x1=5clk 0x3=11clk*/

.equ Tchr, 0x0 /* 0x2=3clk 0x0=0clks */

.equ REFCNT, 879

改为

.equ Trc, 0x1 /* 0x1=5clk 0x3=11clk*/

.equ Tchr, 0x2 /* 0x2=3clk 0x0=0clks */

.equ REFCNT, 1113

.long 0x11111900 /* Bank0 = OM[1:0] , Bank1-7 16bit, Bank2=Nowait,UB/LB*/

改为 .long 0x11100101 /* Bank0 = OM[1:0] , Bank1-7 16bit, Bank2=Nowait,UB/LB*/ .word 0x17 /*SCLK power down mode, BANKSIZE 16M/16M*/

改为 .word 0x16 /*SCLK power down mode, BANKSIZE 8M/8M*/

修改目标系统配置文件./include/configs/smdk4110.h

(1) 接下来要运行Flash 中的代码,修改Flash的配置

#define PHYS_FLASH_SIZE0x00100000 /* 1 MB */

#define CFG_MAX_FLASH_SECT19 /* max number of sectors on one chip */

#define CFG_ENV_ADDR(CFG_FLASH_BASE+0x0E0000) /* environment start address */

(2) 增加目标系统环境变量的设置

#define CONFIG_SERVERIP 10.22.9.99

#define CONFIG_GATEWAYIP 10.22.9.99

#define CONFIG_IPADDR 10.22.9.98

#define CONFIG_NETMASK 255.255.255.0

#define CONFIG_ETHADDR 08:00:3e:2d:9d:5b

#define CONFIG_HOSTNAME aubrey

#define CONFIG_ROOTPATH /dev/mtdblock1

(3) 修改启动参数

#define CONFIG_BOOTDELAY 1 /* autoboot after 1 seconds */

#define CONFIG_BOOTCOMMAND "tftpboot 0x100000 pImage;bootm"

#define CONFIG_BOOTARGS "root=/dev/nfs rw nfsroot=10.22.9.99: \

/opt/eldk/ppc_82xx/fs \

ip=10.22.9.98:10.22.9.99:10.22.9.99:255.255.255.0:aubrey:eth1:off"

到目前为止,U-Boot 的移植基本完成了,我们将U-Boot 生成可执行代码烧录进BootRom 进行调试。根据调试的情况再来修改源代码,这样反复修改与调试,直到U-Boot 工作正常为止。

7.3.4.2 U-Boot 运行流程

下面介绍一下U-Boot 的运行流程,了解了U-Boot 的运行流程后,我们就可以顺利的进行源码的修改和移植工作了。

在我的目标系统中,U-Boot 被单独放在FLASH里,该芯片的型号是Am29LV800BT,一共有1M,存放U-Boot 绰绰有余。系统会首先在FLASH里面运行,在进行基本的初始化后,将FLASH中的代码copy 到Ram,然后从Ram 里运行,下面具体介绍:

U-Boot 从./cpu/s3c44b0/start.S 的标识_start: 开始运行,在完成CPU 本身基本的初始化后,主要是初始化CPU 内部寄存器的一些状态

U-Boot 跳至./cpu/ s3c44b0/start.S 中的reset: 开始运行。Reset这段代码都是在flash里面完成的,接下来运行:

(1) ./cpu/ s3c44b0/start.S 中的cpu_init_crit函数,初始化CPU 时钟寄存器,关闭看门狗,确定系统的时钟频率

(2) 接下来调用./board/smdk4110/memsetup.s对CPU的存储寄存器进行初始化

(3) start.S函数运行到relocate:,把FLASH 中以0x00000000 地址开始的内容copy 到内存的0x0C100000 处(这个地址是在./board/smdk4110/config.mk中决定的,是系统SDRAM的地址)(4) start.S函数运行到vector_copy_loop,把FLASH 中以real_vectors(中断向量表)地址开始的内容copy 到内存的0x0C000000 处,这个地址是在./board/smdk4110/config.mk中决定的,是系统SDRAM的地址

(5) start.S函数运行到stack_setup,此处建立堆栈,接着调用./lib_arm/board.c中的

start_armboot函数,这个函数也完成一些初始化工作,如内存分配的初始化,环境变量的初始化,中断的初始化,以及以太网口的初始化等。最后它会执行到main_loop 函数里,接受命令并进行命令处理。

7.3.5 编译

首先我们要编译生成U-Boot 的可执行文件,然后才能做移植和调试工作。U-Boot 里面包含了很多种目标系统板的类型,我们应该选择一种和自己目标板相近的板类型,在U-Boot 目录下执行如下操作:

删除先前配置

$ make distclean (或者make mrproper)

选择处理器和板类型生成依赖文件

$ make smdk4110_config

生成目标代码

$ make

这样,在U-Boot 目录下面生成了u-boot.bin 和u-boot 两个文件,一个是BIN 文件,

另一个是ELF 文件。我们可以将BIN 文件烧录至BootRom 中,用ELF 文件制作反汇编文件进行调试。

基于AT89C51控制的0.01℃数显温度计的设计

万方数据

万方数据

万方数据

基于AT89C51控制的0.01℃数显温度计的设计 作者:罗兴垅, 黄隆胜, Lou Xinglong, Huang Longsheng 作者单位:罗兴垅,Lou Xinglong(341000,江西赣州,赣南师范学院物理与电子信息科学系), 黄隆胜,Huang Longsheng(341000,江西赣州,赣南师范学院物理与电子信息科学系;341000,江西赣 州,江西理工大学机电工程学院) 刊名: 微计算机信息 英文刊名:CONTROL & AUTOMATION 年,卷(期):2006,22(14) 被引用次数:12次 参考文献(3条) 1.万永波;张根宝;田泽;杨峰基于ARM的嵌入式系统Bootloader启动流程分析[期刊论文]-微计算机信息 2005(11) 2.谈文心;钱聪;宋云购模拟集成电路原理及应用 1995 3.潘学军0.01℃的数显温度计[期刊论文]-物理实验 2003(05) 引证文献(12条) 1.姚勇哲.张荣.邹志荣.张智日光温室温湿度自动监测预警器的研制[期刊论文]-农机化研究 2010(2) 2.符时民.于震数显测温系统设计与特性的研究[期刊论文]-辽宁石油化工大学学报 2010(2) 3.李铁军.何永洪基于单片机的IC卡系统设计[期刊论文]-微型机与应用 2009(21) 4.任小青.王晓娟基于AT89C51单片机的频率计设计方法的研究[期刊论文]-青海大学学报(自然科学版) 2009(2) 5.关玉明.程琪.肖艳春.姜云峰触摸屏变频器与PLC在调速系统中的设计[期刊论文]-机械设计与制造 2009(3) 6.关玉明.程琪.杨戈.姜云峰基于AT89C51的锌空电池温控系统设计[期刊论文]-微计算机信息 2008(32) 7.高海东.钱江基于HT48R30A-1的自动寻星系统[期刊论文]-微计算机信息 2008(29) 8.李邕数字式热敏电阻温度计设计[期刊论文]-甘肃科技纵横 2008(1) 9.张平川.许兴广基于单片机电热水器模糊控制系统设计[期刊论文]-微计算机信息 2007(32) 10.李宝营.赵永生.祖龙起.牛悦苓基于单片机的等精度频率计设计[期刊论文]-微计算机信息 2007(26) 11.肖艳军.程琪.许波基于AT89C51单片机的自动纠偏仪的设计[期刊论文]-微计算机信息 2007(23) 12.李学聪.万频.邓庆华.李军一种新型温盐深传感器的数据采集与应用[期刊论文]-微计算机信息 2007(10) 本文链接:https://www.360docs.net/doc/f81838525.html,/Periodical_wjsjxx200614026.aspx

阐述对BootLoader的理解和分析

` 物理与电子工程学院 《嵌入式系统设计》 设计性实验报告 题目阐述对BootLoader的理解和分析 系别 年级专业 班级学号 学生姓名 指导教师 实验时间

目录 课题要求 ................................................................ 错误!未定义书签。 1.本课题的目的.............................. 错误!未定义书签。 2.运行环境.................................. 错误!未定义书签。正文 . (2) 一.BootLoad简介 (2) 二.系统设计 (5) 三.技术实现问题 (7) 四.总结与体会 (8) 设计性实验报告成绩:指导教师签名: (10)

摘要 在嵌入式系统中,由于不具有自举开发的能力,其BootLoader除了引导操作系统之外,还要担负辅助开发的责任,如与主机通信、与用户交互、更新系统等功能。 虽然嵌入式系统不可能实现通用的BootLoader,但是各系统的BootLoader依然具有一定的相同性,因此,嵌入式系统中常用的BootLoader也都具有可移植性,可以在大部分代码不更改的情况下,根据本系统的情况,通过修改具体硬件相关的代码并进行相应的配置来使用。 关键字:概述,作用,操作模式,分类,基本原理。 正文 一.BootLoad简介 1.1 BootLoader的概述 BootLoader是操作系统和硬件的纽带,它负责初始化硬件,引导操作系统内核,检测各种参数给操作系统内核使用。事实上,一个功能完备的大型BootLoader,就相当于一个小型的操作系统。在嵌入式领域中,操作系统移植的关键在于BootLoader的移植以及操作系统内核与硬件相关部分的移植。Bootloader是在操作系统运行之前执行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射表,从而将系统软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。通常,Bootloader是严重依赖于硬件而实现的,特别是在嵌入式世界里,嵌入式产品型号众多,硬件环境复杂,建立一个通用的Bootloader几乎是不可能的。尽管如此,仍然可以对Bootloader归纳出一些通用的概念来,以指导特定的Bootloader设计与实现。因此,正确进行Linux移植的条件是具备一个与Linux配套、易于使用的Bootloader,它能够正确完成硬件系统的初始化和Linux的引导。 Bootloader不但依赖于CPU的体系结构,而且依赖于嵌入式系统板级设备的配置。对于两块不同的嵌入式板而言,即使它们使用同一种处理器,要想让运行在一块板子上的Bootloader程序也能运行在另一块板子上,一般也都需要修改Bootloader的源程序。反过来,大部分Bootloader仍然具有很多共性,某些Bootloader也能够支持多种结构的嵌入式系统。通常它们能够自动从存储介质上启动,都能够引导操作系统启动,并且大部分都可以支持串口和以太网接口。

bootloader

Boot Loader的启动流程和开发经验总结 Windows CE最大程度继承了桌面版Windows的丰富功能,但是Windows CE并不是一个通用的安装版操作系统。在形形色色的嵌入式设备世界里,一款CE系统通常只会针对某一种硬 件平台生成。 一般来说,Windows CE的开发过程可以分为:0AL(OEM Abstraction Layer)、驱动、应用程序开发三个步骤。其中,0AL开发最基本的一步是板级支持包(BSP),而BootLoader 设计则在BSP开发中具有极为关键的地位。 1.什么是BootLoader 嵌入式系统的启动代码一般由两部分构成:引导代码和操作系统执行环境的初始化代码。其中引导代码一般也由两部分构成:第一部分是板级、片级初始化代码,主要功能是通过设置寄存器初始化硬件的工作方式,如设置时钟、中断控制寄存器等,完成内存映射、初始化MMU等。第二部分是装载程序,将操作系统和应用程序的映像从只读存储器装载或者拷贝到系统的RAM中并执行。 (1)什么是板级BSP? BSP(Board Support Package)是板级支持包,是介于主板硬件和操作系统之间的一层,主要是为了支持操作系统,使之能够更好的运行于硬件主板。不同的操作系统对应于不同形式的BSP,例如WinCE的BSP和Linux的BSP相对于某CPU来说尽管实现的功能一样,可是写法和接口定义是完全不同的。所以,BSP一定要按照该系统BSP的定义形式来写,这样才能与上 层OS保持正确的接口,良好的支持上层OS。 (2)什么是Boot Loader

在BSP中有一个重要的组成部分就是BootLoader,它是在操作系统内核运行之前运行的一段小程序。通过这段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,为调用操作系统内核准备好环境。 一般来说,在嵌入式世界里BootLoader 是严重地依赖于硬件的,因此想建立一个通用的 BootLoader 几乎是不可能的。不同的 CPU 体系结构有不同的BootLoader,而且除了依赖于 CPU的体系结构外,BootLoader还依赖于具体的嵌入式板级设备的配置。这也就是说,对于两块不同的嵌入式板而言,即使它们是基于同一种 CPU 结构而构建的,要想让运行在一块板子上的 BootLoader 程序也能运行在另一块板子上,通常也都需要修改 BootLoader 的源程序。 2.BootLoader在PC机与嵌入式的区别比较 (1)引导程序在PC机和嵌入式上的区别 一般来说,在PC的硬件平台上,由于硬件启动根本就不是通过BootLoader(而是通过BIOS),所以BootLoader就不需要对CPU加电后的初始化做任何工作。在桌面系统中,有以下几种设备可以作为启动设备使用:硬盘、USB盘、光盘驱动器、还有网卡的Boot ROM 等。但无论选择了哪一种启动设备,操作系统都会去将该设备起始地址的内容读入内存,BIOS 将控制移交给引导装载程序。如果启动设备是IDE硬盘,这时通常将引导装载程序装入第一个扇区(通常被称做主引导扇区,MBR),然后将内容读入内存再运行。 在嵌入式平台上,引导装载程序是在硬件上执行的第一段代码,通常将引导程序放置在不易丢失的存储器的开始地址或者是系统冷启动时PC寄存器的初始值。在嵌入式系统中,通常并没有像BIOS那样的固件程序,因此整个系统的加载启动任务就完全由BootLoader来完

F BOOTROM引导模式和程序

28335使用串口烧写程序 串口烧写是一种相对较方便的烧写方式,相对于仿真器或是CAN烧写,相对于仿真器或是USB转CAN的设备,串口是一种非常廉价的烧写方式,而且也不需要安装专业的集成开发环境CCS等,但是不能实现在线调试,因此也只适用于程序基本不用再调整或大批量的场合。 F28335的存储器映射图如下:

BOOTROM 是一块8K X 16的只读存储器,位于地址空间0x3FE000~0x3FFFFF,片内BOOTROM在出厂时固化了引导加载程序以及定点和浮点数据表,片上BOOTROM的存储映射如下图所示: 1.内BOOT ROM数学表: 在BOOT ROM中保留了4K X 16位空间,用以存放浮点和IQ数据公式表,这些数据 公式表有助于改善性能和节省SARAM空间。 向量表: CPU向量表位于ROM存储器0x3FE000~0x3FFFFF段内,如下图所示。复位后,当VMAP=1,ENPIE=0(PIE向量表禁止)时,该向量表激活。

在内部BOOT ROM引导区中能够调用的唯一向量就是位于0x3FFFC0的复位向量。复位向量在出厂时被烧录为直接指向存储在BOOT ROM空间中的InitBoot函数,该函数用于开启引导过程。然后通过通用I/O引脚上的检验判断,决定具体引导模式。引导模式与控制引脚之间的关系如下图所示: Bootloader特性: Bootloader是位于片上引导ROM中的在复位后执行的程序,用于在上电复位后,将程序代码从外部源转移到内部存储器。这允许代码暂时存储在掉电不丢失数据的外部存储器内,然后被转移到高速存储器中执行。 引导ROM中的复位向量将程序执行重定向至InitBoot函数。执行器件初始化之后,bootloader将检查GPIO引脚的状态以确定您需要执行哪种引导模式。这些选项包括:跳转至闪存、跳转至SARAM、跳转至OTP或调用其中一个片上引导加载例程。

引导加载程序

1. 引言 在专用的嵌入式板子运行 GNU/Linux 系统已经变得越来越流行。一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次: 1. 引导加载程序。包括固化在固件(firmware)中的 boot 代码(可选),和 Boot Loader 两大部分。 2. Linux 内核。特定于嵌入式板子的定制内核以及内核的启动参数。 3. 文件系统。包括根文件系统和建立于 Flash 内存设备之上文件系统。通常用 ram disk 来作为 root fs。 4. 用户应用程序。特定于用户的应用程序。有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面。常用的嵌入式 GUI 有:MicroWindows 和 MiniGUI 懂。 引导加载程序是系统加电后运行的第一段软件代码。回忆一下 PC 的体系结构我们可以知道,PC 机中的引导加载程序由 BIOS(其本质就是一段固件程序)和位于硬盘 MBR 中的 OS Boot Loader(比如,LILO 和 GRUB 等)一起组成。BIOS 在完成硬件检测和资源分配后,将硬盘 MBR 中的 Boot Loader 读到系统的 RAM 中,然后将控制权交给 OS Boot Loader。Boot Loader 的主要运行任务就是将内核映象从硬盘上读到 RAM 中,然后跳转到内核的入口点去运行,也即开始启动操作系统。 而在嵌入式系统中,通常并没有像 BIOS 那样的固件程序(注,有的嵌入式 CPU 也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由 Boot Loader 来完成。比如在一个基于 ARM7TDMI core 的嵌入式系统中,系统在上电或复位时通常都从地址 0x00000000 处开始执行,而在这个地址处安排的通常就是系统的 Boot Loader 程序。 本文将从 Boot Loader 的概念、Boot Loader 的主要任务、Boot Loader 的框架结构以及Boot Loader 的安装等四个方面来讨论嵌入式系统的 Boot Loader。 2. Boot Loader 的概念 简单地说,Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。 通常,Boot Loader 是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的 Boot Loader 几乎是不可能的。尽管如此,我们仍然可以对 Boot Loader 归纳出一些通用的概念来,以指导用户特定的 Boot Loader 设计与实现。 1. Boot Loader 所支持的 CPU 和嵌入式板 每种不同的 CPU 体系结构都有不同的 Boot Loader。有些 Boot Loader 也支持多种体系结构的 CPU,比如 U-Boot 就同时支持 ARM 体系结构和MIPS 体系结构。除了依赖于 CPU 的体系结构外,Boot Loader 实际上也依赖于具体的嵌入式板级设备的配置。这也就是说,对于两块不同的嵌入式板而言,即使它们是基于同一种 CPU 而构建的,要想让运行在一块板子上的 Boot Loader 程序也能运行在另一块板子上,通常也都需要修改 Boot Loader 的源程序。

STM32的BOOT概述

STM32的BOOT概述 STM32 三种启动模式对应的存储介质均是芯片内置的,它们是:1)用户 闪存= 芯片内置的Flash。2)SRAM = 芯片内置的RAM 区,就是内存啦。3)系统存储器= 芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP 程序。这个区域的内容在芯片出厂后没有人 能够修改或擦除,即它是一个ROM 区。 在每个STM32 的芯片上都有两个管脚BOOT0 和BOOT1,这两个管脚在芯 片复位时的电平状态决定了芯片复位后从哪个区域开始执行程序,见下表:BOOT1=x BOOT0=0 从用户闪存启动,这是正常的工作模式。 BOOT1=0 BOOT0=1 从系统存储器启动,这种模式启动的程序功能由厂家设置。BOOT1=1 BOOT0=1 从内置SRAM 启动,这种模式可以用于调试。 在系统上电的时候,cpu 首先根据这两个脚来确定是哪种模式的启动,然后 就是把相应模式的起始地址映射到0 地址处,并从0 地址处开始执行。在芯片 出厂时,st 烧写了一个bootloader 到rom 中,也就是system memory。这个bootloader 的主要任务就是通过uart1 下载程序到内置flash 中去。工作流程如下:system memory boot 模式,在执行完成它的任务之后是必须要退出的。这个退出方式是通过一次硬件reset 来实现的。在reset 的时候,必须要配置BOOT[1:0]这两个脚以使cpu 在重启之后进入适当的模式。 要注意的是,一般不使用内置SRAM 启动(BOOT1=1 BOOT0=1),因为SRAM 掉电后数据就丢失。多数情况下SRAM 只是在调试时使用,也可以做其他一些用途。如做故障的局部诊断,写一段小程序加载到SRAM 中诊断板上的 其他电路,或用此方法读写板上的Flash 或EEPROM 等。还可以通过这种方法解除内部Flash 的读写保护,当然解除读写保护的同时Flash 的内容也被自动清

Boot_Loader介绍

Boot Loader Windows CE最大程度继承了桌面版Windows的丰富功能,但是Windows CE并不是一个通用的安装版操作系统。在形形色色的嵌入式设备世界里,一款CE系统通常只会针对某一种硬件平台生成。 一般来说,Windows CE的开发过程可以分为:0AL(OEM Abstraction Layer)、驱动、应用程序开发三个步骤。其中,0AL开发最基本的一步是板级支持包(BSP),而BootLoader 设计则在BSP开发中具有极为关键的地位。 1.什么是BootLoader 嵌入式系统的启动代码一般由两部分构成:引导代码和操作系统执行环境的初始化代码。其中引导代码一般也由两部分构成:第一部分是板级、片级初始化代码,主要功能是通过设置寄存器初始化硬件的工作方式,如设置时钟、中断控制寄存器等,完成内存映射、初始化MMU等。第二部分是装载程序,将操作系统和应用程序的映像从只读存储器装载或者拷贝到系统的RAM中并执行。 (1)什么是板级BSP? BSP(Board Support Package)是板级支持包,是介于主板硬件和操作系统之间的一层,主要是为了支持操作系统,使之能够更好的运行于硬件主板。不同的操作系统对应于不同形式的BSP,例如WinCE的BSP和Linux的BSP相对于某CPU来说尽管实现的功能一样,可是写法和接口定义是完全不同的。所以,BSP一定要按照该系统BSP的定义形式来写,这样才能与上层OS保持正确的接口,良好的支持上层OS。 (2)什么是Boot Loader 在BSP中有一个重要的组成部分就是BootLoader,它是在操作系统内核运行之前运行的一段小程序。通过这段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,为调用操作系统内核准备好环境。

嵌入式linux学习心得(精选多篇)

嵌入式linux学习心得(精选多篇) 第一篇:嵌入式linux学习内容 知识结构 1嵌入式处理器与裸机程序开发2linux系统管理3linux 应用程序开发4linux驱动程序开发5linux内核开发与系统移植 一、处理器 1arm处理器工作模式2arm系统寄存器3arm寻址方式4arm汇编指令集5arm环境c语言编程6arm中断与异常7ads 集成开发环境 8裸机程序开发(串口、lcd、时钟、led、按键……) 二、系统管理 1linux定制安装2linux命令详解 3samba、nfs、tftp、wireshark使用4shell编程 三、应用程序开发 1gcc、gdb、makefile2文件、时间编程

3多进程、多线程程序设计4进程间通讯5网络编程 6qt图形化应用程序开发7android图形化应用程序开发 四、内核开发 1linux内核配置与裁剪2linux内核模块开发3根文件系统制作4进程子系统5内存子系统6proc文件系统7系统调用8内核定时器9内核异常分析 五、驱动程序开发 1字符设备驱动程序2总线、设备、驱动模型3硬件访问技术4中断处理5input设备驱动6platform驱动程序7pci、usb 驱动程序8网卡驱动程序9触摸屏驱动程序xx串口驱动程序 学习顺序 1嵌入式处理器与裸机程序开发2linux系统管理3linux 应用程序开发4linux内核开发基础5嵌入式linux环境搭建6linux驱动程序开发7深入学习linux内核 第二篇:嵌入式linux学习步骤 嵌入式linux学习步骤 作者:phantom时间:xxxx-8-6文章来源:来自网络

AN945 EFM8 Factory Bootloader用户指南中文版

AN945:EFM8 Factory Bootloader用户指南 本文档介绍了工厂编程的引导加载程序可用于EFM8设备。除了描述引导程序的功能,本文档还详细介绍了如何使用引导加载程序并更新Bootloader固件源代码或python主机软件,如果需要定制。 关键点 EFM8工厂编程的引导加载程序提供基本的生产编程或现场更新支持。?主机端都提供源代码python工具和bootloader 件来启用自定义。

1介绍 EFM8设备在工厂中使用引导加载程序进行编程。此引导程序启用: 1. 生产编程- 可以在生产环境中对设备进行编程,而无需使用调试接口需要PCB上的接入点和调试适配器。 2. 2.现场更新- 可以在现场的设备上发布更新,无需最终用户访问调试引脚或使用调试适配器硬件。 引导加载程序主要用于具有最小功能集的生产编程,但也可用于现场更新。因为几个EFM8变体可以有2 KB的闪存,引导程序的设计尽可能小。例如,UART和SMBus版本消耗单个512闪存页面,USB版本消耗1.5 KB闪存。另外,bootloader通常位于代码安全页面中,以使引导程序能够写入和擦除锁定的应用程序空间。更多信息在每个设备上的引导加载程序放置位置可以在设备数据手册或参考手册中找到。 22. USB或UART引导加载程序入门 这些步骤假定使用入门套件。使用自定义硬件时,步骤相同。 这些步骤还假设应用笔记zip文件已经下载到PC,或者使用Simplicity访问文件 工作室。应用程序zip文件可以在Silicon Labs网站(https://www.360docs.net/doc/f81838525.html,/8bit-appnotes)上找到。 ?将Bootloader下载到设备 如果引导加载程序尚未在设备上,请使用Simplicity Studio将Bootloader下载到设备,并按以下步骤操作。 日期代码在设备勘误表中列出的日期之后的顶部标记的设备可以支持引导加载程序并可能具有 bootloader预装。在此之前的日期代码的设备将不能与引导程序一起使用。 ?打开Simplicity Studio。 ?将入门工具包连接到PC。 ?将套件开关移动到[AEM]位置。 ?单击Simplicity Studio左窗格中的[Refresh detected hardware]按钮。该套件应显示在[Detected Hardware] 区。 ?单击工具包,然后单击Simplicity Studio的[tool]区域中的[Flash Programmer]图块。 ?单击[Erase]按钮。 ?单击[Browse]按钮,导航到套件设备的预编译引导加载程序十六进制文件,单击[Open],然后单击[Program]。

U-Boot从NAND Flash启动的实现

U -Boot 从NAND Flash 启动的实现 王磊 (太原理工大学信息工程学院,山西太原030024) 摘要:U -Boot 不能从NAND Flash 启动给应用带来些不便,因此修改U -Boot 使其支持从NAND Flash 启动。分析了 U -Boot 启动流程的两个阶段及实现从NAND Flash 启动的原理和思路,并根据NAND Flash 的物理结构和存储特 点,增加U -Boot 对NAND Flash 的操作支持,从而完成把存储在NAND Flash 上的U -Boot 代码复制到SDRAM 中执行,实现从NAND Flash 的启动。修改过后的U -Boot 可以直接从NAND Flash 启动,给应用带来便利。关键词:U -Boot ;NAND Flash ;Bootloader ;S3C2440;移植中图分类号:TP316 文献标识码:A 文章编号:1674-6236(2010)05-0098-03 Realization of U -Boot booting through NAND Flash WANG Lei (Department of Information Engineering ,Taiyuan University of Technology ,Taiyuan 030024,China ) Abstract:It is not convenient that U -Boot can ’t boot through NAND Flash.In this paper ,the codes of U -Boot is modified to support that.This paper analyzes two steps of U -Boot and the method of supporting that the U -Boot boots from NAND Flash.Based on the memory characteristics and the physical structure of NAND Flash ,this paper adds the codes of NAND Flash in order to carry the codes to SDRAM that stored in the NAND Flash ,thus realizes U -Boot boots from NAND Flash.The modified U -Boot runs through NAND Flash straightly ,it is a great convenience to the application of U -Boot.Key words:U -Boot ;NAND Flash ;Bootloader ;S3C2440;porting 电子设计工程 Electronic Design Engineering 第18卷 Vol.18 第5期No.52010年5月May.2010 收稿日期:2009-10-11 稿件编号:200910032 作者简介:王磊(1985—),男,山西河津人,硕士研究生。研究方向:嵌入式系统、DCS 、自动控制。 Bootloader 引导装载程序是系统上电后运行的第一段程 序,其作用是完成基本的硬件初始化工作,所以引导装载程序跟硬件有着紧密的联系。因此必须根据开发板的硬件配置对引导装载程序进行修改才可以使其运行起来。随着嵌入式系统的复杂化,大容量数据存储的NAND Flash 的应用会越来越广泛,同时U -Boot 是功能最丰富的Bootloader ,但遗憾的是U -Boot 不支持从NAND Flash 启动。所以如果能实现 U -Boot 从NAND Flash 启动的话将会给应用带来很大的方 便。本文讨论修改U -Boot 使其支持从NAND Flash 启动,采用基于S3C2440的开发板。 1U -Boot 简介及流程分析 U -Boot ,全称universal boot loader ,是遵循GPL 条款的开 放源代码项目。可以引导多种操作系统,支持多种架构的 CPU 。它支持如下操作系统:Linux 、NetBSD 、VxWorks 等,支持 如下架构的CPU :PowerPC 、MIPS 、X86、ARM 、NIOS 、XScale 等,同时支持NFS 挂载,是一个功能丰富的BootLoader 。它的整个程序框架清晰,易于移植,许多设计人员将自己的移植代码上传到网站(http ://https://www.360docs.net/doc/f81838525.html,/projects/u-boot/)上,更新速度很快。目前的版本是1.1.6,本论文正是采用此版本进行说明,U -Boot 的目录结构参见U -Boot 源代码。要进行U -Boot 的修改移植必须了解U -Boot 的程序运行流程,这是必要的一步。U -Boot 属于两阶段的BootLoader ,其启动流程如图1所示。第一阶段的文件为cpu/arm920t/start.S 和board/smdk2410/lowlevel_init.S ,用ARM 汇编语言编写,前者是平台相关的,后者是开发板相关的[1]。第一阶段主要是关于基本硬件的初始化,包括关闭MMU 、CACHE 、设置PLL 时钟比例、关闭看门狗;初始化SDRAM ,为复制第二阶段代码做准备,最后复制第二阶段代码到SDRAM 中,然后跳到 图1 U -Boot 启动流程 -98-

bootloader分析

Bootloader分析

?熟悉BootLoader的实现原理?认识Bootloader的主要任务?熟悉BootLoader的结构框架?U-boot使用

引言本章详细地介绍了基于嵌入式系统中的OS启动加载程序――Boot Loader的概念、软件设计的主要任务以及结构框架等内容。 一个嵌入式Linux系统从软件的角度看通常可以分为四个层次: ?1.引导加载程序。包括固化在固件(firmware)中的boot代码(可 选),和Boot Loader两大部分。 ?2.Linux内核。特定于嵌入式板子的定制内核以及内核的启动参数。 ?3.文件系统。包括根文件系统和建立于Flash内存设备之上文件 系统。通常用ram disk来作为root fs。 ?4.用户应用程序。特定于用户的应用程序。有时在用户应用程序和 内核层之间可能还会包括一个嵌入式图形用户界面。常用的嵌入式GUI有:MicroWindows和MiniGUI。

?引导加载程序是系统加电后运行的第一段软件代码。回忆一下PC 的体系结构我们可以知道,PC机中的引导加载程序由BIOS(其本质就是一段固件程序)和位于硬盘MBR中的OS Boot Loader(比如,LILO和GRUB等)一起组成。 ?BIOS在完成硬件检测和资源分配后,将硬盘MBR中的Boot Loader读到系统的RAM中,然后将控制权交给OS Boot Loader。 Boot Loader的主要运行任务就是将内核映象从硬盘上读到RAM 中,然后跳转到内核的入口点去运行,也即开始启动操作系统。 而在嵌入式系统中,通常并没有像BIOS那样的固件程序(注,有的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由Boot Loader来完成。 ?比如在一个基于ARM7TDMI core的嵌入式系统中,系统在上电 或复位时通常都从地址0x00000000处开始执行,而在这个地址 处安排的通常就是系统的Boot Loader程序。

BootLoader—vivi注释

s3c2410 bootloader vivi完全注释 四.Bootloader vivi 为了将linux移植到ARM上,碰到的第一个程序就是bootloader,我选用韩国mizi公司的vivi。您可以在以下地址下载: https://www.360docs.net/doc/f81838525.html,/developer/s3c2410x/download/vivi.html 如果您对bootloader没有什么概念,在学习VIVI的代码之前,建议您阅读一篇文章《嵌入式系统 Boot Loader 技术内幕》(詹荣开著)。链接地址如下:https://www.360docs.net/doc/f81838525.html,/developerworks/cn/linux/l-btloader/ 当您阅读了上述文章后,我再企图在理论上罗嗦什么就不合适了(这篇文章实在太好了)。vivi也可以分为2个阶段,阶段1的代码在 arch/s3c2410/head.S 中,阶段2的代码从init/main.c的main函数开始。您可以跳到实验部分先感受一下vivi。 (1)阶段1:arch/s3c2410/head.S 沿着代码执行的顺序,head.S完成如下几件事情: 1、关WATCH DOG:上电后,WATCH DOG默认是开着的 2、禁止所有中断:vivi中没用到中断(不过这段代码实在多余,上电后中断默认是关闭的) 3、初始化系统时钟:启动MPLL,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz,“CPU bus mode”改为“Asynchronous bus mode”。请参考实验十一:CLOCK 4、初始化内存控制寄存器:还记得那13个寄存器吗?请复习实验五:MEMORY CONTROLLER 5、检查是否从掉电模式唤醒,若是,则调用WakeupStart函数进行处理——这是一段没用上的代码,vivi不可能进入掉电模式 6、点亮所有LED 7、初始化UART0: a.设置GPIO,选择UART0使用的引脚 b.初始化UART0,设置工作方式(不使用FIFO)、波特率115200 8N1、无流控等,请参考实验七:UART 8、将vivi所有代码(包括阶段1和阶段2)从nand flash复制到SDRAM中:a.设置nand flash控制寄存器 b.设置堆栈指针——调用C函数时必须先设置堆栈 c.设置即将调用的函数nand_read_ll的参数:r0=目的地址(SDRAM的地址),r1=源地址(nand flash的地址),r2=复制的长度(以字节为单位) d.调用nand_read_ll进行复制 e.进行一些检查工作:上电后nand flash最开始的4K代码被自动复制到一个称为“Steppingstone”的内部RAM中(地址为0x00000000-0x00001000);在执行nand_read_ll之后,这4K代码同样被复制到SDRAM中(地址为 0x33f00000-0x33f01000)。比较这两处的4K代码,如果不同则表示出错 9、跳到bootloader的阶段2运行——就是调用init/main.c中的main函数:a.重新设置堆栈 b.设置main函数的参数 c.调用main函数

S3C2410 bootloader ----VIVI阅读笔记

S3C2410 bootloader ----VIVI阅读笔记 建议读一读《嵌入式系统BootLoader技术内幕》(詹荣开著),google一下就会找到一片。什么是Bootloader就不再这里废话了,看看上面的文章就明了了。Bootloader有非常多种,如本文将要阅读的vivi,除此之外更有uboot,redboot,lilo等等。Vivi 是韩国mizi公司专门为三星s3c2410芯片设计的Bootloader。 先来看看vivi的源码树: vivi-+-arch-+-s3c2410 |-Documentation |-drivers-+-serial | …-mtd-+-maps | |-nor | …-nand |-include-+-platform | |-mtd | …-proc |-init |-lib-+-priv_data |-scripts-+-lxdialog |-test |-util 能google一下,搜到源码vivi.tar.gz。 前面提到的文件已系统的分析了bootloader的,这里就按原始码来具体说事。vivi也能分为2个阶段,阶段1的代码在arch/s3c2410/head.S中,阶段2的代码从init/main.c的main函数开始。 1.阶段1 阶段1从程式arch/s3c2410/head.S开始,按照head.S的代码执行顺序,一次完成了下面几个任务: u 1、关WA TCH DOG (disable watch dog timer) 上电后,WATCH DOG默认是开着的 u 2、禁止所有中断(disable all interrupts) vivi中不会用到中断,中断是系统的事,bootloader可不能去干这事的(不过这段代码实在多余,上电后中断默认是关闭的) u 3、初始化系统时钟(initialise system clocks) 启动MPLL,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz,“CPU bus mode”改为“Asynchronous bus mode”。 u 4、初始化内存控制寄存器(memsetup) S3c2410共有15个寄存器,在此开始初始化13个寄存器。 u

嵌入式BootLoader技术内幕

嵌入式BootLoader技术内幕 作者:詹荣开(zhanrk@https://www.360docs.net/doc/f81838525.html,) 2005-01-13 10:48:18 来自:IBM DW 2003年12月30日嵌入式BootLoader技术内幕(一) 本文详细地介绍了基于嵌入式系统中的OS 启动加载程序――Boot Loader 的概念、软件设计的主要任务以及结构框架等内容。 一、引言 在专用的嵌入式板子运行GNU/Linux 系统已经变得越来越流行。一个嵌入式Linux 系统从软件的角度看通常可以分为四个层次: 1. 引导加载程序。包括固化在固件(firmware)中的boot 代码(可选),和Boot Loader 两大部分。 2. Linux 内核。特定于嵌入式板子的定制内核以及内核的启动参数。 3. 文件系统。包括根文件系统和建立于Flash 内存设备之上文件系统。通常用ram dis k 来作为root fs。 4. 用户应用程序。特定于用户的应用程序。有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面。常用的嵌入式GUI 有:MicroWindows 和MiniGUI 懂。 引导加载程序是系统加电后运行的第一段软件代码。回忆一下PC 的体系结构我们可以知道,PC 机中的引导加载程序由BIOS(其本质就是一段固件程序)和位于硬盘MBR 中的OS Boot Loader(比如,LILO 和GRUB 等)一起组成。BIOS 在完成硬件检测和资源分配后,将硬盘MBR 中的Boot Loader 读到系统的RAM 中,然后将控制权交给OS Boot Load er。Boot Loader 的主要运行任务就是将内核映象从硬盘上读到RAM 中,然后跳转到内核的入口点去运行,也即开始启动操作系统。 而在嵌入式系统中,通常并没有像BIOS 那样的固件程序(注,有的嵌入式CPU 也会内嵌 一段短小的启动程序),因此整个系统的加载启动任务就完全由Boot Loader 来完成。比 如在一个基于ARM7TDMI core 的嵌入式系统中,系统在上电或复位时通常都从地址0x00 000000 处开始执行,而在这个地址处安排的通常就是系统的Boot Loader 程序。 本文将从Boot Loader 的概念、Boot Loader 的主要任务、Boot Loader 的框架结构以及Boot Loader 的安装等四个方面来讨论嵌入式系统的Boot Loader。 二、Boot Loader 的概念

ARM7的Bootloader和分散加载文件笔记

Boot Loader概述 简单地说,在操作系统内核运行之前,通过一小程序,可以初始化硬件设备、建立内存空间的映射图等,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核配置好相应的环境,也可以下载文件到系统板上的SDRAM,对Flash进行擦除与编程,这个小程序一般称为Boot Loader。可以说,一个功能完善的Boot Loader已经相当于一个微型的操作系统了。 Boot Loader作为系统复位或上电后首先运行的代码,一般应写入Flash存储器并从起始物理地址0x0开始。Boot Loader是非常依赖于硬件而实现的,而且根据实现的功能不同,其复杂程度也各不相同。一个简单的Boot Loader可以只完成USB口的初始化,而功能完善的Boot Loader可以支持比较复杂的命令集,对系统的软硬件资源进行合理的配置与管理。因此,建立一个通用的Boot Loader 几乎是不可能的。 系统初始化代码直接对ARM微处理器内核及硬件控制器编程,多采用汇编语言编程,初始化代码一般应包括如下典型任务: 1.定义程序入口点; 2.设置异常和中断向量表; 3.初始化存储设备; 4.初始化堆栈指针寄存器; 5.初始化用户执行环境; 6.呼叫主应用程序。 1.1 定义程序入口 初始化代码必须定义整个程序的入口点。通过伪指令Entry指定编译器保留该段代码,同时配合链接器的设置,确定整个程序的入口点。 1.2 设置异常和中断向量表 1.3初始化存储设备 1. 存储器类型和时序的配置 2.存储器的地址分配与地址重映射 一种典型的存储器地址重映射过程描述如下:当系统上电或复位以后,PC指针指向0x0,程序从0x0地址开始执行,因此,为了能正确读取代码,要求此时Flash (或其它类型的ROM)的起始地址为0x0。但Flash(或其它类型的ROM)的访问速度大大低于RAM,每次产生异常后,都要从Flash(或其它类型的ROM)的异常向量表调转到相应的处理程序,会影响异常的响应速度,因此,系统便提供一种灵活的地址重映射方法,在系统完成必要地初始化以后,将RAM安排到0x0 地址处,而将原来位于0x0处的Flash(或其它类型的ROM)安排到其他的地方上去,加快异常的响应速度。

bootloader技术内幕

bootloader:嵌入式BootLoader技术内幕疯狂代码 https://www.360docs.net/doc/f81838525.html,/ ?: http:/https://www.360docs.net/doc/f81838525.html,/NetworkProgramming/Article33523.html 、引言 ; 在专用嵌入式板子运行 ;GNU/Linux ;系统已经变得越来越流行个嵌入式 ;Linux ;系统 从软件角度看通常可以分为四个层次: ; 1. ;引导加载包括固化在固件(firmware)中 ;boot ;代码(可选)和 ;Boot ;Loader ; 两大部分 ; 2. ;Linux ;内核特定于嵌入式板子定制内核以及内核启动参数 ; 3. ;文件系统包括根文件系统和建立于 ;Flash ;内存设备之上文件系统通常用 ;ram ;dis k ;来作为 ;root ;fs ; 4. ;用户应用特定于用户应用有时在用户应用和内核层之间可能还会包 括个嵌入式图形用户界面常用嵌入式 ;GUI ;有:MicroWindows ;和 ;MiniGUI ;懂 ; 引导加载是系统加电后运行第段软件代码回忆下 ;PC ;体系结构我们可以知 道PC ;机中引导加载由 ;BIOS(其本质就是段固件)和位于硬盘 ;MBR ;中 ;OS Boot ;Loader(比如LILO ;和 ;GRUB ;等)起组成BIOS ;在完成硬件检测和资源分配后 将硬盘 ;MBR ;中 ;Boot ;Loader ;读到系统 ;RAM ;中然后将控制权交给 ;OS ;Boot ;Load erBoot ;Loader ;主要运行任务就是将内核映象从硬盘上读到 ;RAM ;中然后跳转到内核 入口点去运行也即开始启动操作系统 ; 而在嵌入式系统中通常并没有像 ;BIOS ;那样固件(注有嵌入式 ;CPU ;也会内嵌 段短小启动)因此整个系统加载启动任务就完全由 ;Boot ;Loader ;来完成比 如在个基于 ;ARM7TDMI ;core ;嵌入式系统中系统在上电或复位时通常都从地址 ;0x00 000000 ;处开始执行而在这个地址处安排通常就是系统 ;Boot ;Loader ; ; 本文将从 ;Boot ;Loader ;概念、Boot ;Loader ;主要任务、Boot ;Loader ;框架结构以及 Boot ;Loader ;安装等四个方面来讨论嵌入式系统 ;Boot ;Loader ;

相关文档
最新文档