u-boot学习笔记
c.w.u-boot
关于U-boot的一些理解一.u-boot是什么?u-boot全称Universal Boot Loader,是遵循GPL条款的开放源码项目。
其源码目录、编译形式与Linux内核很相似。
一些u-boot的设备驱动都是由liux内核程序简化而来,支持嵌入式Linux系统的引导。
通过一些文件的阅读,据我个人理解,它的好处可能就是把u-boot改装成某种型号的开发板源码,通过比对目标开发板的配置,设置u-boot里的CPU,SDRAM,FLASH和一些硬件驱动,然后在上面跑c程序或操作系统。
它主要的功能是加载与引导内核映像,是处理器上电复位后最开始需要执行的代码。
为什么选择u-boot移植了?我估计因为它的源码开源,board里含有强大的开发板,cpu里面也都有各式各样的模板。
二.u-boot的架构及文件项的作用(1).u-boot目录下有18个子目录,分别存放管理不同的源程序。
目录中所要存放的文件有其规则,可分为3类:第一类:目录与处理器体系结构或开发板硬件直接相关。
第二类:目录是一些通用的函数或驱动程序。
第三类:目录是u-boot的应用程序,工具和文档。
(2).用结构图表示u-boot的结构,如下:1.board:和一些开发板有关的文件。
列出了u-boot所支持的所有开发板。
2.cpu: 列出了u-boot所支持的所有cpu。
on: 提供一套不同的目标板的共性。
实现了大量的c命令。
4.disk: disk 驱动的分区处理代码。
5.doc: u-boot的说明文档。
6.drivers: 通用的设备驱动。
如cfi flash驱动。
7.dtt: 数字温度测量器或者传感器的驱动。
8.examples:一些独立运行的应用程序的例子。
9.fs: 文件系统的文件,有:ext2,fat,fdos,jffs2,reiserfs,cramfs。
u-boot : 与网络有关的代码。
11.Include: 头文件,对硬件平台的会变文件,系统的配置文件和文件系统文件。
u-boot-1_1_6 start_S代码笔记
u-boot-1.1.6 start.S代码笔记收藏u-boot 1.1.6 start.S 代码学习/*参考了别人的一些笔记,看完了启动代码。
本文档记录在看代码时碰到的困难,将这些曾经困扰的问题记录下来,以备今后之用。
分析时不重要的代码被删除了。
*/.globl _start_start: b resetldr pc, _undefined_instructionldr pc, _software_interruptldr pc, _prefetch_abortldr pc, _data_abortldr pc, _not_usedldr pc, _irqldr pc, _fiq_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/*_start是整个u-boot程序的入口点,即链接后,该处是整个程序的第一条指令。
程序的入口点是由链接脚本所指定,比如对于smdk2410的板子(下面都以smdk241为例),脚本文件位于board\smdk2140\u-boot.ld s。
在该脚本文件中:ENTRY(_start) 即指定程序的入口地址。
globl _start 定义一个外部可以引用的变量,比如说,在其它源代码文档中,就可以直指引用_start这个变量。
如int entry=_start; 那此处en try值将是多少呢?因为_start相当于一个变量,entry的值就是_start处存储的值,即 b reset机器码值。
7.uboot基础知识(1)
在这种模式下,BootLoader将通过串口或网口从主机下载程序到 目标机。例如,下载内核映像,根文件系统映像,应用程序等。
2. u-boot简介
u-boot是由德国DENX小组开发的BootLoader,其全称是Universal Boot Loader。
u-boot的开发目标是支持尽可能多的嵌入式处理器和嵌入式操作系统, 它目前已支持数百种嵌入式开发板和各种CPU,包括ARM, PowerPC, MIPS, X86, Coldfire等,同时还支持Linux,NetBSD,VxWorks等多种嵌入 式操作系统的引导。
进入Ubuntu Linux操作系统的 图形化界面。
打开桌面上的【终端】,进入命令行界面。到/home/cvtech/目录 下,查看u-boot-s5pv210源代码。
在u-boot-s5pv210文件夹中包含的目录说明如下: board:目标板相关文件,主要包含SDRAM、Flash驱动。 common:独立于处理器体系结构的通用代码,如内存大小检测与故障检
除此之外,uboot还有内存操作命令、nand flash操作命令等。 内存操作命令
cmp:内存比较命令。 cp: 内存拷贝命令。 md: 内存显示命令。 mw: 内存填充命令。 mtest:内存测试命令。 Nand flash操作命令 nand info:查看nand flash芯片信息命令。 nand erase:nand flash擦除命令。 nand scrub: nand flash擦除命令,会将坏块信息也擦除掉。 nand read:nand flash读命令。 nand write:将数据从SDRAM写入nand flash。 nand ecc:设置nand flash的ecc校验方法。
U-BOOT介绍以及常用U-bot命令介绍
U-BOOT介绍以及常用U-bot命令介绍一. BootLoader简介在专用的嵌入式板子运行GNU/Linux系统已经变得越来越流行。
一个嵌入式Linux系统从软件的角度看通常可以分为四个层次:1、引导加载程序。
包括固化在固件(firmware)中的boot代码(可选),和BootLoader两大部分。
2、 Linux内核。
特定于嵌入式板子的定制内核以及内核的启动参数。
3、文件系统。
包括根文件系统和建立于Flash内存设备之上文件系统。
通常用ramdisk来作为rootfs。
4、用户应用程序。
特定于用户的应用程序。
有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面。
常用的嵌入式GUI有:MicroWindows和MiniGUI懂。
引导加载程序是系统加电后运行的第一段软件代码。
PC机中的引导加载程序由BIOS(其本质就是一段固件程序)和位于硬盘MBR中的OS BootLoader(比如,LILO和GRUB等)一起组成。
BIOS在完成硬件检测和资源分配后,将硬盘MBR中的BootLoader读到系统的RAM中,然后将控制权交给OS BootLoader。
BootLoader的主要运行任务就是将内核映象从硬盘上读到 RAM 中,然后跳转到内核的入口点去运行,也即开始启动操作系统。
而在嵌入式系统中,通常并没有像BIOS那样的固件程序(注,有的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由BootLoader来完成。
比如在一个基于ARM7TDMI core的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000处开始执行,而在这个地址处安排的通常就是系统的BootLoader程序。
简单地说,BootLoader就是在操作系统内核运行之前运行的一段小程序。
通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
u-boot移植心得
几经艰辛,终于基本完成了u-boot在s3c44b0的移植工作,在些记录一下在移植过程中所碰到的困难和解决方法(一些心得),作为日后参考之用,也希望能够帮到其它有需要的人^_^。
1.来由:在我搞完ucos后(本来我是想学uclinux的,不过在对系统一无所知的情况下,还是先学一下ucos比较实际^_^,从中也可以对系统有个清晰的概念),我意识到要搞系统的话一个功能强大的bootloader是必不可少的,而我的板上自带的是armboot(其实我个人觉得应用在ARM上的话armboot已经足够了,毕竟u-boot也是从armboot中发展过来的,纯属个人意见),如果我的板上自带光盘有已经移植好的armboot源代码供我参考的话,我想我也不会花这么多时间去搞u-boot,可恨的是我的光盘上只有armboot.bin这个二进制文件,而没有源文件,没办法,我下定主意自己搞一个,考虑了一番后我选择了u-boot,毕竟参考资料相对比较多,再我学完u-boot后再回头看armboot,简直是一个炉里出的饼,这是后话。
2.准备:说是容易,做起来却挺难。
因为编译u-boot要在linux环境下,而不能在我们平时所熟悉的ads下那么直观。
首先要建立好交叉编译环境,这个交叉编译环境可以自己来做,不过完全没必要,而且难度也挺大,一般是下载人家编译好的工具。
我刚开始在这里就郁闷了很久,现在会了以后觉得原来就是这么简单,在些我把方法说清楚,希望不会再有人为这个问题郁闷了^_^:1)在网上下载一个u-boot源代码,我用的是1.1.2版本的,最新的应该是1.1.4的吧,其实差不多,那就像我那样下载一个1.1.2版本的吧。
把源文件解压,这个应该不用说了吧,学过linux的人应该会,不会的话我想你继续做下去也困难,那就先装个linux用下吧(我用的是RedHat的,哦对了,编译程序是需要gcc 编译器的,所以安装方式一定要选择工作站哦^_^)。
uboot学习笔记二
U boot学习笔记(二)一、移植环境主机:Ubutu9开发板:qq2440--64MB编译器:arm-linux-gcc-3.4.5.tgzu-boot:u-boot-1.1.6.tar.bz2二、增加NAND FLASH命令#gedit include/configs/qq2440.h//增加NAND FLASH操作命令#define CONFIG_COMMANDS\(CONFIG_CMD_DFL|\CFG_CMD_CACHE|\CFG_CMD_NAND|\//增加NAND FLASH控制宏#define CFG_NAND_BASE0#define NAND_MAX_CHIPS1#define CFG_MAX_NAND_DEVICE1下面需要做的是编写board_nand_init函数(1)针对S3C2410、S3C2440NAND Flash控制器的不同来定义一些数据结构和函数,在include/s3c24x0.h文件中增加S3C2440_NAND数据结构。
/*NAND FLASH*/typedef struct{S3C24X0_REG32NFCONF;S3C24X0_REG32NFCONT;S3C24X0_REG32NFCMD;S3C24X0_REG32NFADDR;S3C24X0_REG32NFDATA;S3C24X0_REG32NFMECCD0;S3C24X0_REG32NFMECCD1;S3C24X0_REG32NFSECCD;S3C24X0_REG32NFSTAT;S3C24X0_REG32NFESTAT0;S3C24X0_REG32NFESTAT1;S3C24X0_REG32NFMECC0;S3C24X0_REG32NFMECC1;S3C24X0_REG32NFSECC;S3C24X0_REG32NFSBLK;S3C24X0_REG32NFEBLK;}/*__attribute__((__packed__))*/S3C2440_NAND;(2)在include/s3c2440.h文件中仿照S3C2410_GetBase_NAND函数定义S3C2440_GetBase_NAND函数。
amlogic烧入
B、创建NFS共享目录(网上下载的rootfs并解压缩),并将其路径加到/etc/exports文件中
例如 /amlogic_source/rootfs *(rw,sync,no-root-squash)
程序烧录 (amlogic open linux)----学习笔记
2010-04-20 11:23 645人阅读 评论(0) 收藏 举报
一、Uboot烧录
1、连接jtag、网线、串口
2、把tftpd32.exe放到uboot烧录的目录里
3、启动tftpd32.exe
4、启动ttermpro.exe
7、 set bootcmd 'nand read 0x82000000 0x40000 0x400000;bootm 82000000' 设置bootcmd
注意:下载之前注意配置正确的ip和服务器
三、加载文件系统
1、bootarg设置 ,设置之后需要save
setenv bootargs root=/dev/nfs nfsroot=192.168.11.6:/amlogic_source/rootfs rw init=/init ip=192.168.11.3:192.168.11.1:192.168.11.1:255.255.255.0 console=ttyS0,115200 osd=1280,720,17,p ----直接指定ip
C、启动NFS server
/etc/init.d/nfs-kernel-server start
问题:
1、网络连接不上。
在u-boot中加载内核
u-boot-2009.08引导内核学习笔记U-Boot移植好后就要考虑如何引导内核了(以下介绍的是bootm方式,开发板是友善之臂的mini2440)。
所用的U-Boot是移植的U-Boot-2009.08 ,内核是mini2440光盘中的kernel-2.6.29。
U-Boot引导内核分三步:内核的编译、启动参数的设置、下载固化。
(一)内核的编译通常,u-boot为kernel提供一些kernel无法知道的信息,比如ramdisk在RAM中的地址。
Kernel也必须为U-boot提供必要的信息,如通过mkimage这个工具(在u-boot代码的tools目录中)可以给zImage添加一个header,也就是使得通常编译的内核zImage添加一个数据头,把添加头后的image通常叫uImage,uImage是可以被U-boot直接引导的内核镜像。
那么如何使用mkimage工具而产生uImage的呢?1. 工具mkimage--------------------------------------------------------------------------------编译U-Boot成功后,在u-boot代码的tools目录中生成一些工具,比如mkimage。
将它们复制到/usr/local/bin 目录下,就可以直接使用了。
现在我们编译内核需要用到mkimage来生成U-Boot格式的内核映像文件uImage 。
复制完成后在终端输入命令" mkimage "并回车,显示关于mkimage的提示信息,表示你现在已经可以使用此命令了: Usage: mkimage -l image-l ==> list image header informationmkimage [-x] -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image -A ==> set architecture to 'arch' //用于指定CPU类型,比如ARM-O ==> set operating system to 'os' //用于指定操作系统,比如Linux-T ==> set image type to 'type' //用于指定image类型,比如Kernel-C ==> set compression type 'comp' //指定压缩类型-a ==> set load address to 'addr' (hex) //指定image的载入地址-e ==> set entry point to 'ep' (hex) //内核的入口地址,一般是:image的载入地址+0x40(信息头的大小)-n ==> set image name to 'name' //image在头结构中的命名-d ==> use image data from 'datafile' //无头信息的image文件名-x ==> set XIP (execute in place) //设置执行位置mkimage [-D dtc_options] -f fit-image.its fit-image2. 编译--------------------------------------------------------------------------------在内核的根目录下执行命令进行编译。
10分钟掌握u-boot移植
一、U-BOOT的目录结构u-boot目录下有18个子目录,分别存放管理不同的源程序。
这些目录中所要存放的文件有其规则,可以分成三类。
第一类目录与处理器体系结构或者开发板硬件直接相关;第二类目录是一些通用的函数或者驱动程序;第三类目录是u-boot的应用程序、工具或者文档。
Board:和一些已有开发板相关的文件,比如Makefile和u-boot.lds等都和具体开发板的硬件和地址分配有关,主要包含SDRAM、FLASH驱动。
Common:与体系结构无关的文件,实现各种命令的C文件。
CPU:CPU相关文件,其中的子目录都是以u-boot所支持的CPU为名,比如有子目录arm926ejs、mips、mpc8260和nios等,每个特定的子目录中都包括cpu.c和interrupt.c 和start.S。
其中cpu.c初始化cpu、设置指令cache和数据cache等;interrupt.c设置系统的各种终端和异常,比如快速中断,开关中断、时钟中断、软件中断、预取中止和未定义指令等;start.S是u-boot启动时执行的第一个文件,他主要是设置系统堆栈和工作方式,为进入C程序奠定基础。
Disk:disk驱动的分区处理代码、Doc:文档。
Drivers:通用设备驱动程序,比如各种网卡、支持CFI的flash、串口和USB总线等。
Dtt:数字温度测量器或者传感器的驱动Examples:一些独立运行的应用程序的例子。
Fs:支持文件系统的文件,u-boot现在支持cramfs、fat、fdos、jffs2、yaffs和registerfs。
Include:头文件,还有对各种硬件平台支持的会变文件,系统的配置文件和对文件系统支持的文件,其configs子目录下与目标板相关的配置头文件是移植过程中经常要修改的文件。
Net:与网络有关的代码,BOOTP协议、TFTP协议RARP协议和NFS文件系统的实现。
Lib_ppc:存放对PowerPC体系结构通用的文件,主要用于实现PowerPC平台通用的函数,与PowerPC体系结构相关的代码。
u-boot学习指南
因为一次 main_loop()可以执行一次 u-boot 命令, 因此我们可以在此处添加如下代码 (这 里的 printf 可以将信息打印至串口,因为这是在开发板上运行的,而不是平时在 linux 中的, 因此控制台变成串口了) :
printf("\r\n############## printf("\r\n ********* Main Menu ##############\r\n "); *********\r\n \r\n "); EmbedRoad Studio
printf("[f] Format the Nand Flash\r\n"); printf("[0] Set the boot parameters\r\n "); printf("[1] Download u-boot to Nand Flash\r\n "); printf("[2] Download FontLibrary to Nand Flash\r\n "); printf("[3] Download LOGO Picture (.bin) to Nand Flash\r\n "); printf("[4] Download Program to SDRAM and Run it\r\n"); printf("[d] Download User Program\r\n n"); printf("[e] Exec User Program\r\n "); printf("[q] Quit from menu\r\n "); printf("\r\n Enter your selection: "); while(!(((keyselect >= '0') && (keyselect <= '4')) || ((keyselect == 'f') || (keyselect == 'F')) || ((keyselect == 'q') || (keyselect == 'Q')) || ((keyselect == 'd') || (keyselect == 'D')) || ((keyselect == 'e') || (keyselect == 'E')) )) { keyselect = serial_getc(); } switch (keyselect) { case '0': break; case '1': break; case '2': break; . . . default:break;
常用u-boot命令详解(全)
常⽤u-boot命令详解(全)U-boot发展到现在,他的命令⾏模式已经⾮常接近Linux下的shell了,命令⾏模式模式下⽀持“Tab”键的命令补全和命令的历史记录功能。
⽽且如果你输⼊的命令的前⼏个字符和别的命令不重复,那么你就只需要打这⼏个字符即可,⽐如我想看这个U-boot的版本号,命令就是“version”,但是在所有的命令中没有其他任何⼀个的命令是由“v”开头的,所以只需要输⼊“v”即可。
[u-boot@MINI2440]# versionU-Boot 2009.11 ( 4⽉ 04 2010 - 12:09:25)[u-boot@MINI2440]# vU-Boot 2009.11 ( 4⽉ 04 2010 - 12:09:25)[u-boot@MINI2440]# baseBase Address: 0x00000000[u-boot@MINI2440]# baBase Address: 0x00000000由于U-boot⽀持的命令实在太多,⼀个⼀个细讲不现实,也没有必要。
所以下⾯我挑⼀些烧写和引导常⽤命令介绍⼀下,其他的命令⼤家就举⼀反三,或者“help”吧!(1)获取帮助命令:help 或 ?功能:查看当前U-boot版本中⽀持的所有命令。
[u-boot@MINI2440]# help- alias for 'help'askenv - get environment variables from stdinbase - print or set address offsetbdinfo - print Board Info structurebmp - manipulate BMP image databoot - boot default, i.e., run 'bootcmd'bootd - boot default, i.e., run 'bootcmd'bootelf - Boot from an ELF image in memorybootm - boot application image from memorybootp - boot image via network using BOOTP/TFTP protocolbootvx - Boot vxWorks from an ELF imagecmp - memory compareconinfo - print console devices and informationcp - memory copycrc32 - checksum calculationdate - get/set/reset date & timedcache - enable or disable data cachedhcp - boot image via network using DHCP/TFTP protocolecho - echo args to consoleeditenv - edit environment variableeeprom - EEPROM sub-systemerase - erase FLASH memoryexit - exit scriptfatinfo - print information about filesystemfatload - load binary file from a dos filesystemfatls - list files in a directory (default /)flinfo - print FLASH memory informationfsinfo - print information about filesystemsfsload - load binary file from a filesystem imagego - start application at address 'addr'help - print online helpi2c - I2C sub-systemicache - enable or disable instruction cacheiminfo - print header information for application imageimls - list all images found in flashimxtract- extract a part of a multi-imageitest - return true/false on integer compareloadb - load binary file over serial line (kermit mode)loads - load S-Record file over serial lineloadx - load binary file over serial line (xmodem mode)loadx - load binary file over serial line (xmodem mode)loady - load binary file over serial line (ymodem mode)loop - infinite loop on address rangels - list files in a directory (default /)md - memory displaymm - memory modify (auto-incrementing address)mmc - MMC sub-systemmtest - simple RAM read/write testmw - memory write (fill)nand - NAND sub-systemnboot - boot from NAND devicenfs - boot image via network using NFS protocolnm - memory modify (constant address)ping - send ICMP ECHO_REQUEST to network hostprintenv- print environment variablesprotect - enable or disable FLASH write protectionrarpboot- boot image via network using RARP/TFTP protocolreginfo - print register informationreset - Perform RESET of the CPUrun - run commands in an environment variablesaveenv - save environment variables to persistent storagesetenv - set environment variablesshowvar - print local hushshell variablessleep - delay execution for some timesource - run script from memorytest - minimal test like /bin/shtftpboot- boot image via network using TFTP protocolunzip - unzip a memory regionusb - USB sub-systemusbboot - boot from USB deviceversion - print monitor version如果你想获取某条命令的更详细的帮助,可以使⽤:help <你想要查的指令>或者 ? <你想要查的指令> ,甚⾄ h <你想要查的指令缩写>。
uboot学习与移植笔记整理
Part1:remap.remap比较简单,和MMU的功能可以看做是等价的,只是一般remap地址估定为0x0 ,网上有个帖子叫<<ARM remap与重定位摘抄>>专门讲了它对remap的理解,对remap的作用是这样讲的: 当ARM处理器上电或者Reset之后,处理器从0x0取指。
因此,必须保证系统上电时,0x0处有指令可以执行。
所以,上电的时候,0x0地址处必定是ROM或者Flash(NOR)。
但是,为了加快启动的速度,也方便可以更改异常向量表,加快中断响应速度,往往把异常向量表映射到更快、更宽(32bit/16bit)的RAM中。
但是异常向量表的开始地址是由ARM架构决定的,必须位于0x0处,因此,必须把RAM映射到0x0。
文中提到了ARM处理器remap的三种情况,如下1)如果处理器有专门的寄存器可以完成Remap。
那么Remap是通过Remap寄存器的相应bit置1完成的。
如Atmel AT91xx2)如果处理器没有专门的寄存器,但是memory的bank控制寄存器可以用来配置bank的起始地址,那么只要把RAM的起始地址编程为0x0,也可以完成remap。
如samsung s3c4510 .3)如果上面两种机制都没有,那么Remap就不要做了。
因为处理器实现决定了SDRAM对应的bank地址是不能改变的。
如Samsung S3c2410.不过我的看法有点稍微不一样,如果上面两种机制都没有,那么Remap就不要做了,它给的典型例子是Samsung S3c2410 ,2410虽然sdram对应的bank地址不能改变,但它有MMU功能, MMU可以起到remap的作用,常用的最典型的应该是例子Samsung S3c44b0,它既没有mmu,又SDRAM对应地址有没办法改变.顺便补充下除了4510可以改变每个bank的地址,还有华邦的w90P740(arm7),呵呵,我现在用的U就是这款U,可以把bank的地址随意的设置.2.relocate .relocate (地址重定位),个人觉得这个是boot里面最麻烦也是最核心的部分,刚开始看boot代码的时候,它简直是我的噩梦,不知道大家分析boot的源码流程是否这样,也可能我大学不是计算机的,没学过编译原理(现在也没看过)对链接和加载一无所知,有两个星期非常痛苦,就是不懂人家boot里面的链接脚本为什么要那样写.网上关于uboot的帖子很多,但对链接加载这块,始终写的不详细,不知道是不是太过于基础了,高手都不愿意讲,最后自己找资料,发现其实一切痛苦的根源都是对链接和加载不太清楚造成的,但个人感觉boot除了初始化以外就是搬运程序,如何搬运?为什么要那样搬运都需要对硬件板的地址分布很清楚?而这些都是链接决定的,所以非弄清楚不可!1.我们为什么需要relocate ? 经济方面,(nandflash和norflash 每兆价格相差悬殊),把boot代码放在norflash里面(为什么不放在nandflash里面,因为nandflash读需要驱动支持,norflash可以直接访问),boot通常很小,只需要占用几十k的空间,所以只需要很小的norflash芯片,这样很便宜,而把应用程序通常很大,所以用价格低廉nandflash来储存,实际应用,通过执行boot程序,把nandflash里面代码和数据搬运到内存中来执行,这样比程序直接放在norflash里执行,可以.另外还有运行速度方面的差别,程序在norflash里执行的速度远远小于在sdram中执行的速度,为了追求更高的速度,也需要relocate,让程序在sdram里面执行.2.关于加载域(VMA)和运行域(LMA)(加载域和运行域,加载域是程序代码在ROM、FLASH中的排列次序及地址安排,运行域是程序运行时代码在SRAM、SDRAM中地址安排;存储代码时按照加载域存放在FLASH中,运行时再从FLASH中取出代码到RAM运行域运行,一段代码的加载域和存储域可以不同),杜春雷在它那本经典的<<arm体系结构与编程>>一书专门有一章来讲加载域和运行域不一致的情况,但我当初接触了它的这些加载域和运行域后,看uboot的lds ,uboot的lds没有设置LMA,只是设置了VMA,为此我疑惑很久.直到耐心的看了那本链接器和加载器的书才豁然明白( /viewthread.php?tid=817770 ),任何一个链接器和加载器的基本工作都非常简单: 将更抽象的名字与更底层的名字绑定起来,好让程序员使用更抽象的名字编写代码,链接器的就是把源文件进行符号解析,把解析出来的符号和地址的进行绑定,把全局变量,函数,标号等等这些符合和地址绑定起来.3.boot上电后开始能够正确执行还有个很重要的原因,是要保证boot在系统加电或复位后最初执行的代码是跟地址无关的,(即在代码搬运前所执行的代码是与地址无关),地址无关即地址无关代码生成的这个映象文件可以被放在内存中的任何一个地址上运行。
uboot知识全知道
uboot知识全知道转载自互联网•1 U-Boot简介•U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。
从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。
其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。
但是U-Boot不仅仅支持嵌入式Linux系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。
其目前要支持的目标操作系统是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS。
这是U-Boot中Universal的一层含义,另外一层含义则是U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。
这两个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。
就目前来看,U-Boot对PowerPC系列处理器支持最为丰富,对Linux的支持最完善。
其它系列的处理器和操作系统基本是在2002年11 月PPCBOOT改名为U-Boot后逐步扩充的。
从PPCBOOT 向U-Boot的顺利过渡,很大程度上归功于U-Boot的维护人德国DENX软件工程中心Wolfgang Denk[以下简称W.D]本人精湛专业水平和持着不懈的努力。
当前,U-Boot项目正在他的领军之下,众多有志于开放源码BOOT LOADER移植工作的嵌入式开发人员正如火如荼地将各个不同系列嵌入式处理器的移植工作不断展开和深入,以支持更多的嵌入式操作系统的装载与引导。
韦东山u-boot移植笔记
一:准备移植1、从下面的官网下载最新的U-boot。
用google英文版搜索最新的u-boot源码ftp://ftp.denx.de/pub/u-boot/2、建立sourceinsight工程a、解压并在E:\colin weidongshan\transplant_u-boot-2012.04.01\u-boot-2012.04.01建立SIb、添加文件到SI工程1、点击"Add All",选中“Include top level sub-directories”和“Recursively add lowersub-directories”点击“OK”2、选中“Board”目录,点击“Remove Tree”,去掉总个目录进入“Board\Samsung\Smdk2410\”,点击"Add All"3、选中“Arch”目录,点击“Remove Tree”,去掉总个目录进入“Arch\Arm\Cpu\Arm920t\”,双击选中“Cpu.c”“Interrupts.c”“start.S”。
进入“Arch\Arm\Cpu\Arm920t\S3c24x0\”,点击"Add All"进入“Arch\Arm\”,选中"Dts"目录,点击"Add Tree"进入“Arch\Arm\Include\Asm\Arch_s3c24x0”,点击"Add All"进入“Arch\Arm\Include\Asm\”,点击"Add All",去掉“Include top level sub-directories”和“Recursively add lower sub-directories”前面的勾,表示只加顶层目录的文件进入“Arch\Arm\Include\Asm\”,单击选中"Proc-armv",点击"Add Tree"进入“Arch\Arm\Lib\”,点击"Add All"4、选中“Include”目录,点击“Remove Tree”,去掉总个目录进入“Include\”,点击"Add All",去掉“Include top level sub-directories”和“Recursively add lower sub-directories”前面的勾,表示只加顶层目录的文件进入“Include\”,单击选中"Andestech",点击"Add Tree"进入“Include\”,单击选中"Asm-generic",点击"Add Tree"进入“Include\”,同上选中除"Configs"目录外的所有目录,点击"Add Tree"。
uboot笔记
u-boot讲课笔记一、概述u-boot是bootloader程序的一种,包含丰富、应用广、源码公开。
主要功能引导操作系统、辅以下载程序等等功能。
源代码的网络资源:官方链接德国DENX 软件工程中心主页 http://www.denx.de/U-boot 官方主页(注意其中的邮件列表链接)http://www.denx.de/wiki/U-Boot/WebHomeU-boot 官方源码FTP 下载 ftp://ftp.denx.de/pub/u-boot/二、编译#make distclean#make mini2440_config#make all把产生的u-boot.bin利用nor flash中的下载程序烧写到nand flash地址为0的地方,方法:把开发板的开关拨向从Nor Flash启动,进入SuperViVi菜单界面,输入“v”,借助DNW,通过USB下载刚编译生成的u-boot.bin;把tools目录下的工具mkimage拷贝到系统环境变量支持的命令目录中如/bin或/usr/bin,或者toolchain的bin目录中。
Mkimage的目的是给内核image文件添加一个uboot需要识别的一个头,具体命令类似Mkimage –A arm –O linux –T kernel –C none –a 0x30008000 –e 0x30008040 –n “Linux Kernel Image”–d /linux-2.6.32.2/arch/arm/boot/zImage uImage参数说明–A 指image文件是用于什么cpu架构,-O 指image文件是什么操作系统,-T指image文件是什么类型,如kernel指的是内核,-C 指image文件的压缩格式,-a 指image文件的加载地址,-e指image文件的执行地址,-n 指image文件的名字,-d指具体的image文件,包括路径。
tiny210u-boot引导内核及文件系统笔记
tiny210u-boot引导内核及文件系统笔记tiny210 u-boot 引导内核及文件系统笔记分类: UBOOT 文件系统 2012-11-18 19:36 268人阅读评论(0) 收藏举报使用u-boot for tiny210 ver3.1 (by liukun321咕唧咕唧)做好了uboot 移植打算用u-boot 来引导内核加载文件系统于是,试着将友善之臂提供的文件系统镜像写到NAND Flash中tftp 0x21000000 xxxx.imgnand erase 0xe00000 0xd20000 (写入前擦除NAND部分空间) nand write.yaffs 0x21000000 0xe00000 0xc75c0c0(将文件系统镜像写入NAND Flash)设置u-boot命令参数:setenv bootcmd nand read 0x30008000 60000 419100\;bootm 30008000 (内核从Flash中读出并加载) 保存环境变量 saveenv重启开发板.....能够成功引导内核,但加载文件系统时出错错误提示:/init:line103:can't open /r/dev/console :no such filekenrnel panic -not syncing :attemped to kill init!目前还没弄清楚错误原因.....试着利用nfs加载文件系统设置启动参数:setenv bootargs root=/dev/nfs console=ttySAC0,115200 init=/linuxrc nfsroot=192.168.1.103:/nfsshare/rootfs_qtopia_qt4/(友善之臂提供的文件系统在nfs下)ip=192.168.1.103(开发板IP):192.168.1.100(主机IP):192.168.1.255(网关):255.255.255.0:name:eth0:on(fbcon=rotate:1)重启开发板OK,能引导内核并加载文件系统...分析原因:1 uboot 烧写yaffs2文件系统出了问题2 内核加载文件系统上面有问题具体原因接着分析中.....。
uboot 详细注释讲解(1)
大多数bootloader都分为stage1和stage2两部分,u-boot也不例外。
依赖于CPU体系结构的代码(如设备初始化代码等)通常都放在stage1且可以用汇编语言来实现,而stage2则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。
1、Stage1 start.S代码结构u-boot的stage1代码通常放在start.S文件中,他用汇编语言写成,其主要代码部分如下:(1)定义入口。
由于一个可执行的Image必须有一个入口点,并且只能有一个全局入口,通常这个入口放在ROM(Flash)的0x0地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接器脚本来完成。
(2)设置异常向量(Exception Vector)。
(3)设置CPU的速度、时钟频率及终端控制寄存器。
(4)初始化内存控制器。
(5)将ROM中的程序复制到RAM中。
(6)初始化堆栈。
(7)转到RAM中执行,该工作可使用指令ldr pc来完成。
2、Stage2 C语言代码部分lib_arm/board.c中的start arm boot是C语言开始的函数也是整个启动代码中C语言的主函数,同时还是整个u-boot(armboot)的主函数,该函数只要完成如下操作:(1)调用一系列的初始化函数。
(2)初始化Flash设备。
(3)初始化系统内存分配函数。
(4)如果目标系统拥有NAND设备,则初始化NAND设备。
(5)如果目标系统有显示设备,则初始化该类设备。
(6)初始化相关网络设备,填写IP、MAC地址等。
(7)进去命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作。
3、U-Boot的启动顺序(示例,其他u-boot版本类似)cpu/arm920t/start.S@文件包含处理#include <config.h>@由顶层的mkconfig生成,其中只包含了一个文件:configs/<顶层makefile中6个参数的第1个参数>.h#include <version.h>#include <status_led.h>/********************************************************** ****************** Jump vector table as in table 3.1 in [1]********************************************************** *****************/注:ARM微处理器支持字节(8位)、半字(16位)、字(32位)3种数据类型@向量跳转表,每条占四个字节(一个字),地址范围为0x0000 0000~@0x0000 0020@ARM体系结构规定在上电复位后的起始位置,必须有8条连续的跳@转指令,通过硬件实现。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2014.4.16 u-boot学习笔记u-boot版本:u-boot-2014.01-rc1作者:charles.lu参考资料:《ARM嵌入式系统开发:软件设计与优化》,《S3C2440手册》,《嵌入式linux应用开发完全手册》韦东山教学视频,《嵌入式bootloader技术内幕》。
目的:1)分析源码; 2)移植到飞凌嵌入式S3C2440开发板首先看第一阶段的u-boot代码。
打开文件arch/arm/cpu/arm920t/start.S.globl _start_start: b start_codeldr pc, _undefined_instructionldr pc, _software_interruptldr pc, _prefetch_abortldr pc, _data_abortldr pc, _not_usedldr pc, _irqldr pc, _fiq代码从_start处开始执行。
b start_code即跳转到start_code(b还有后面常有的bl是ARM9跳转指令,若要学习指令可参考《ARM嵌入式系统开发:软件设计与优化》)。
我们往下走,找到start_code,可知首先是硬件初始化,分别做如下工作:1.设置CPU为SVC32模式2.关看门狗3.禁止所有中断4.设置时钟分频这里,对于具体的硬件初始化细节,可以参考《S3C2440手册》,为什么要这么做就不讲了,可以参考上述的书籍。
#if defined(CONFIG_AT91RM9200DK)||defined(CONFIG_AT91RM9200EK) 在头文件include/configs/smdk2410.h中没有这个宏定义,所以这个#if 和#endif里的代码不用管。
后面又有一个宏定义,区分S3C2440和S3C2410。
#ifndef CONFIG_SKIP_LOWLEVEL_INITbl cpu_init_crit5.跳转到cpu_init_crit,代码在下面。
这里关闭MMU(这东西管理虚拟内存)。
bl lowlevel_init开始各种文件之间跳转了,做好准备……6.跳到board/samsung/smdk2410/lowlevel_init.S中,开头一堆宏定义不用看,找到lowlevel_init,开始初始化内存管理控制器(必须要在第一阶段初始化内存管理,否则内存都没法用)。
lowlevel_init:/*memory control configuration*//*make r0relative the current location so that it*//*reads SMRDATA out of FLASH rather than memory!*//*修改以下代码,以至于使得地址与运行时的位置无关*/ldr r0, =SMRDATAldr r1, =lowlevel_initsub r0, r0, r1 /*偏移地址*/adr r3, lowlevel_init/*位置无关*/add r0, r0, r3/*r0存放的是当前SMRDATA的实际地址*///ldr r1,_TEXT_BASE//sub r0,r0,r1/*r0存放SMRDATA的地址*/ldr r1, =BWSCON/*Bus Width Status Controller*/add r2, r0, #13*40:ldr r3, [r0], #4str r3, [r1], #4cmp r2, r0bne 0b/*everything is fine now*/mov pc, lr.ltorg/*the literal pools origin*/SMRDATA:……这个地方,就是初始化存储器控制器的各个寄存器而已,所有的初始值都在SMRDATA下面。
这里的代码参考大牛的博客文章,改了改,使得代码运行与地址无关。
这里只分析原代码。
Ldr r0,=SMRDATA//r0等于u-boot编译时确定的SMRDATA的地址Ldr r1,_TEXT_BASE//r1等于_TEXT_BASE里CONFIG_SYS_TEXT_BASE的值。
在头文件include/configs/smdk2410.h里找到了它的宏,25行,值为0。
(搜索的技巧:用sourceInsight看代码会更方便,但我用的是原始的vim,在搜索目录下,用grep -rn “你要找的字符串”./ 或者grep -rn “你要找的字符串”smdk24.h 命令)sub r0,r0,r1//r0存放SMRDATA的地址ldr r1, =BWSCON/*Bus Width Status Controller*/add r2, r0, #13*40:ldr r3, [r0], #4str r3, [r1], #4cmp r2, r0bne 0br1=地址0x48000000,r2是SMRDATA的最后一处的地址。
取[r0]处的值到r3,然后r0+4,r3的值存到[r1],即给寄存器初始化了,然后r1+4。
接着就是循环了,有13个寄存器要初始化,具体可以看看手册。
这里要清楚的是,根据连接脚本lds文件可知,代码是从0地址开始的。
BANK0接NorFlash(地址从0x0000 0000开始),BANK6接SDRAM(地址从0x3000 0000开始),而NandFlash不是总线型设备,它直接与S3C2440连接,不受存储器控制器管理。
如果u-boot程序是烧录到NandFlash的,那么,硬件会自动拷贝前4k到芯片内部的4k大小RAM,从0地址开始执行。
你可以选择接着把代码拷贝到外部SDRAM里,大于4K的代码,则需要用NandFlash了,比较复杂;。
如果程序烧录到NorFlash,那么可以直接在NorFlash上运行,这种flash自身的特性决定了这种特质,当然速度会慢。
因此,不管是下载到NorFlash或是NandFlash,都是从0x0000 0000地址执行。
7.执行完,该回到start.S了。
执行bl _main,又要跳转了。
这次跳到arch/arm/lib/crto.S。
找到ENTRY(_main),先初始化C程序执行的环境,即简单设置栈。
ENTRY(_main)/**Set up initial C runtime environment and call board_init_f(0).*/#if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_STACK)//不用管它ldr sp, =(CONFIG_SPL_STACK)#elseldr sp, =(CONFIG_SYS_INIT_SP_ADDR)//通过反汇编可知sp=0x3000 0f600 #endifbic sp, sp, #7/*8-byte alignment for ABI compliance*/sub sp, #GD_SIZE /*allocate one GD above SP ,查看反汇编文件,可知GD_SIZE=0xa0 */bic sp, sp, #7/*8-byte alignment for ABI compliance*/mov r9, sp /*GD is above SP,下文可知r9还是gd指针指向的地址*/mov r0, #0bl board_init_fCONFIG_SYS_INIT_SP_ADDR在smdk2410.h里定义,等于CONFIG_SYS_SDRAM_BASE+0x1000-GENERATED_GBL_DATA_SIZE,CONFIG_SYS_SDRAM_BASE=0x3000 0000,GENERATED_DATA_SIZE实在找不到相关的宏。
算了,反汇编看看sp的值吧。
先编译,生成u-boot和u-boot.bin。
方法是:u-boot根目录下make smdk2410_config,再make。
这里我们没有修改任何代码,如果这个地方失败了,说明代码有问题,或者编译器有问题,或者操作系统有问题。
然后,arm-linux-objdump -D u-boot > u-boot.dis,打开u-boot.dis反汇编文件。
找到SP=3000 0f60。
上面的步骤完成了u-boot第一阶段的工作,下面开始第二阶段……8. bl board_init_f,跳转到arch/arm/lib/board.c,完成板子配置。
bd_t结构体定义在include/asm_generic/u-boot.h,gd_t结构体定义在include/asm_generic/global_data.h,gd_t里存放全局变量。
代码开头有这样一句话:DECLARE_GLOBAL_DATA_PTR,在arch/arm/include/asm/global_data.h里,,50:#define DECLARE_GLOBAL_DATA_PTR register_volatile gd_t *gd asm(“r9”),意思是寄存器r9存储gd_t类型的指针gd。
memset((void*)gd,0,sizeof(gd_t));//上文提到,gd指向的地址与r9相同,是sp-0xa0=0x3000 03c0。
……各种赋值,不管啦……for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) { if ((*init_fnc_ptr)() != 0) {hang ();}}//init_fnc_ptr是函数指针。
init_sequence是函数指针数组,定义在232~264行。
反正这里就是一循环,init_sequence里的所有函数都执行一遍,发生错误就停止。
8.1 board_early_init_f让我们看看init_sequence,里面还是很有意思的。
找到board_early_init_f,这是对板子初始化,它定义在board/samsung/smdk2410/smdk2410.c里,不妨进去看看吧。
设置时钟,设置端口。
8.2timer_inittimer_init,定义在arch/arm/cpu/arm920t/s3c24x0/timer.c里。
8.3分配内存地址addr=CONFIG_SYS_SDRAM_BASE +gd->ram_size;//addr=0x3000 0000 + 64M=0x0400 0000-1=0x33ff ffff……if!(defined(CONFIG_SYS_ICACHE_OFF) && defined(CONFIG_SYS_DCACHE_OFF)) /*reserve TLB table*/gd->arch.tlb_size = 4096 * 4;addr -= gd->arch.tlb_size;/*round down to next64kB limit*/addr &= ~(0x10000 - 1);//addr减掉4K大小,然后64K对齐/**reserve memory for U-Boot code,data&bss*round down to next4kB limit*/addr -= gd->mon_len;addr &= ~(4096 - 1);280行有定义:gd->mon_len = _bss_end_ofsstart.S中有如下定义77:_bss_end_ofs:.word __bss_end - _start这里__bss_end是在链接脚本arch/arm/cpu/u-boot.lds中,从字面意思就可知,是指u-boot代码的最后地址;_start是程序的入口地址。