内核编译及uboot编译常见问题

内核编译及uboot编译常见问题
内核编译及uboot编译常见问题

u-boot编译命令:

make diskclean

make xxxx_s3c44b0_config

make

内核编译常见问题:

一、安装交叉编译环境

44b0没有MMU,不支持虚拟内存,因此在编译所用的头文件及库与普通linux不同,这些都需要uclinux的,使用的交叉编译工具是arm-elf-gcc,因此在编译前要先安装此工具;

1、在linux2.6的版本中安装会出现如下错误

需要输入:vi arm-elf-tools-20040427.sh

修改第39行。

35 rm -rf "/usr/local/arm-elf"

36 rm -rf "/usr/local/lib/gcc-lib/arm-elf"

37 rm -f /usr/local/bin/arm-elf-*

38

39 tail +${SKIP} ${SCRIPT} | gunzip | tar xvf -

40

41 exit 0

tail 后面添加-n即可;

修改后如下:39 tail -n +${SKIP} ${SCRIPT} | gunzip | tar xvf -

这样之后就可以安装此工具了;

二、内核配置

在配置内核是一般都是用方便的图形界面来配置,用命令:make menuconfig 。但

刚装好的linux操作系统没有安装此工具,因此就不支持此make menuconfig。可以

联网安装,

用命令:sudo apt-get install ncurses-dev在线安装。

在线安装的前提条件是linux主机可以上网,在首次使用在线安装时要更新一下

apt-get,

用命令:sudo apt-get update

到此就可以用make menuconfig来配置linux内核了。

内核配置好之后就可以进行编译了

三、内核编译

步骤:

make dep

make clean

make lib_only

make user_only

make romfs

make image

make

在make时一般还会出现一个问题:

bison no such command

用命令:sudo apt-get install -y bison 安装即可;

UBOOT命令详解

常用U-boot命令详解(z) 2010-09-30 15:05:52| 分类:学习心得体会|字号订阅 U-boot发展到现在,他的命令行模式已经非常接近Linux下的shell了,在我编译的 U-boot-2009.11中的命令行模式模式下支持“Tab”键的命令补全和命令的历史记录功能。而且如果你输入的命令的前几个字符和别的命令不重复,那么你就只需要打这几个字符即可,比如我想看这个U-boot的版本号,命令就是“ version”,但是在所有的命令中没有其他任何一个的命令是由“v”开头的,所以只需要输入“v”即可。 [u-boot@MINI2440]# version U-Boot 2009.11 ( 4月04 2010 - 12:09:25) [u-boot@MINI2440]# v U-Boot 2009.11 ( 4月04 2010 - 12:09:25) [u-boot@MINI2440]# base Base Address: 0x00000000 [u-boot@MINI2440]# ba Base Address: 0x00000000 由于U-boot支持的命令实在太多,一个一个细讲不现实,也没有必要。所以下面我挑一些烧写和引导常用命令介绍一下,其他的命令大家就举一反三,或者“help”吧! (1)获取帮助 命令:help 或? 功能:查看当前U-boot版本中支持的所有命令。 [u-boot@MINI2440]#help ?- alias for'help' askenv - get environment variables from stdin base - print or set address offset bdinfo - print Board Info structure bmp - manipulate BMP image data boot - boot default, i.e., run 'bootcmd' bootd - boot default, i.e., run 'bootcmd' bootelf - Boot from an ELF image in memory bootm - boot application image from memory bootp - boot image via network using BOOTP/TFTP protocol

UBoot移植详解

u-boot 移植步骤详解 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的理由: ①开放源码; ②支持多种嵌入式操作系统内核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS; ③支持多个处理器系列,如PowerPC、ARM、x86、MIPS、XScale; ④较高的可靠性和稳定性; ④较高的可靠性和稳定性; ⑤高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等; ⑥丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等; ⑦较为丰富的开发调试文档与强大的网络技术支持; 2 U-Boot主要目录结构 - board 目标板相关文件,主要包含SDRAM、FLASH驱动; - common 独立于处理器体系结构的通用代码,如内存大小探测与故障检测;

UBoot源码分析1

?UBoot源码解析(一)

主要内容 ?分析UBoot是如何引导Linux内核 ?UBoot源码的一阶段解析

BootLoader概念?Boot Loader 就是在操作系统内核运行之前运行 的一段小程序。通过这段小程序,我们可以初始 化硬件设备、建立内存空间的映射图,从而将系 统的软硬件环境带到一个合适的状态,以便为最 终调用操作系统内核准备好正确的环境 ?通常,Boot Loader 是严重地依赖于硬件而实现 的,特别是在嵌入式世界。因此,在嵌入式世界 里建立一个通用的Boot Loader 几乎是不可能的。 尽管如此,我们仍然可以对Boot Loader 归纳出 一些通用的概念来,以指导用户特定的Boot Loader 设计与实现。

UBoot来源?U-Boot 是 Das U-Boot 的简称,其含义是 Universal Boot Loader,是遵循 GPL 条款的开放源码项目。最早德国 DENX 软件工程中心的 Wolfgang Denk 基于 8xxROM 和 FADSROM 的源码创建了 PPCBoot 工程项目,此后不断 添加处理器的支持。而后,Sysgo Gmbh 把 PPCBoot 移 植到 ARM 平台上,创建了 ARMBoot 工程项目。最终, 以 PPCBoot 工程和 ARMBoot 工程为基础,创建了 U- Boot 工程。 ?而今,U-Boot 作为一个主流、通用的 BootLoader,成功地被移植到包括 PowerPC、ARM、X86 、MIPS、NIOS、XScale 等主流体系结构上的百种开发板,成为功能最多、 灵活性最强,并且开发最积极的开源 BootLoader。目前。 U-Boot 仍然由 DENX 的 Wolfgang Denk 维护

uboot环境变量总结

Common目录下面与环境变量有关的文件有以下几个:env_common.c,env_dataflash.c,env_eeprom.c,env_flash.c,env_nand.c,env_nowhere.c,env_nvram.c,environment.c。 env_common.c中包含的是default_environment[]的定义; env_dataflash.c,env_eeprom.c,env_flash.c,env_nand.c, env_nvram.c 中包含的是相应存储器与环境变量有关的函数:env_init(void),saveenv(void),env_relocate_spec (void),env_relocate_spec (void),use_default()。至于env_nowhere.c,因为我们没有定义CFG_ENV_IS_NOWHERE,所以这个文件实际上没有用。 environment.c这个文件时是我真正理解环境变量的一个关键。在这个文件里定义了一个完整的环境变量的结构体,即包含了这两个ENV_CRC(用于CRC校验),Flags(标志有没有环境变量的备份,根据CFG_REDUNDAND_ENVIRONMENT这个宏定义判断)。定义这个环境变量结构体的时候还有一个非常重要的关键字: __PPCENV__,而__PPCENV__在该.c文件中好像说是gnu c编译器的属性,如下: # define __PPCENV__ __attribute__ ((section(".text"))) 意思是把这个环境变量表作为代码段,所以在编译完UBOOT后,UBOOT的代码段就会有环境变量表。当然,这要在我们定义了ENV_IS_EMBEDDED之后才行,具体而言,环境变量表会在以下几个地方出现(以nand flash为例): 1、UBOOT中的代码段(定义了ENV_IS_EMBEDDED), 2、UBOOT中的默认环 境变量, 3、紧接UBOOT(0x0 ~ 0x1ffff)后面:0x20000 ~ 0x3ffff 之间,包括备份的环境变量,我们读取,保存也是对这个区域(即参数区)进行的。3、SDRAM中的UBOOT中,包括代码段部分和默认部分,4、SDRAM中的melloc分配的内存空间中。 Environment.c代码如下: env_t environment __PPCENV__ = { ENV_CRC, /* CRC Sum */ #ifdef CFG_REDUNDAND_ENVIRONMENT 1, /* Flags: valid */ #endif { #if defined(CONFIG_BOOTARGS) "bootargs=" CONFIG_BOOTARGS "\0" #endif #if defined(CONFIG_BOOTCOMMAND) "bootcmd=" CONFIG_BOOTCOMMAND "\0" #endif #if defined(CONFIG_RAMBOOTCOMMAND) "ramboot=" CONFIG_RAMBOOTCOMMAND "\0"

UBOOT详细解读

大多数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 @由顶层的mkconfig生成,其中只包含了一个文件:configs/<顶层makefile中6个参数的第1个参数>.h #include #include

uboot调试指南

Uboot调试参考指南 一、调试目的 Uboot的调试旨在通过观察uboot运行时状态来测试硬件问题。 二、调试步骤 1.修改代码 在uboot代码路径下,编辑uboot代码,需要做以下修改; a.修改config.mk文件,添加以下两行内容: AFLAGS += -Wa,-gdwarf2 CFLAGS += -g2 -gdwarf-2 b.修改. /arch/powerpc/lib/board.c文件 debug("Now running in RAM - U-Boot at: %08lx\n", dest_addr); printf("Now running in RAM - U-Boot at: %08lx\n", dest_addr); 将debug改为printf,如上所示。 2.编译uboot 执行make BSC9131RDB_SYSCLK100_NAND,编译uboot 3.将编译好的u-boot-nand.bin(uboot image格式)及u-boot(elf格式文件)文件拷 贝出来 4.烧录uboot 将步骤3中保存的u-boot-nand.bin烧录到目标板中,烧录过程略。 5.建立工程 a.在cw界面,点击file->import, 选择code warrior -> Power architecture ELF executable,如图1所示: 图1 建立elf工程 b.选择步骤3中保存的u-boot(elf格式文件),toolchain选择bareboard application, target OS选择none,工程名字请根据需要设置,比如我的机器上设置为example, 点击next,如图2所示:

Uboot启动流程分析和移植介绍

基于MPC83xx 的U-boot 启动流程分析和移植 董 闯 北京邮电大学信息与通信工程学院,北京(100876) E-mail :donix.dong@https://www.360docs.net/doc/c812503190.html, 摘 要:本文首先引入Bootloader 的概念,接着介绍U-boot 这种引导程序,并以Freescale 32位微处理器MPC83xx 为例,结合代码详细分析了U-boot 的启动的各个阶段及最终引导Linux 内核的过程,最后,建立交叉编译环境,针对TC8313E 目标板,给出U-boot 移植与编译的基本步骤。 关键词:U-boot;MPC83xx;交叉编译;移植;嵌入式系统 中图分类号:TP393.05 1.引言 引导程序(Bootloader)是系统加电后运行的第一段软件代码,类似于PC 机中的引导加载程序BIOS 。虽然引导程序仅在系统启动时运行非常短的时间,但对于嵌入式系统来说,这是一个非常重要的组成部分。通过这段小程序,初始化必要的硬件设备,创建内核需要的一些信息并将这些信息传递给内核,从而将系统的软、硬件环境配置到一个合适的状态,最终调用操作系统内核,真正起到引导和加载内核的作用。 2. U-boot 介绍 目前,嵌入式领域里出现了很多种类的Bootloader ,如Armboot 、Blob 、Redboot 、vivi 和U-boot 等,其中U-boot 是使用最广泛,功能最完善的。 U-boot (Universal Boot Loader)是从PPCBOOT 发展演化而来[1] ,其源码目录、编译形式与Linux 内核很相似,事实上,不少U-boot 源码就是相应的Linux 内核源程序的简化,尤其是一些设备的驱动程序,这从U-boot 源码的注释中就能体现。U-boot 中Universal 有两层含义,一是U-boot 除了支持PowerPC 系列的处理器外,还能支持MIPS 、x86、ARM 、NIOS 、XScale 等诸多常用系列的处理器;另外一层含义则是U-boot 不仅仅支持嵌入式Linux 操作系统的引导,还支持OpenBSD, NetBSD, FreeBSD, SVR4, Solaris, VxWorks, LynxOS, pSOS, lrix, RTEMS, QNX, ARTOS 等操作系统的引导。这两个特点正是U-boot 项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。就目前来看,U-boot 对PowerPC 系列处理器支持最为丰富,对Linux 的支持最完善。 3. U-boot 启动流程分析 大多数Bootloader 都分为阶段1(stage1)和阶段2(stage2)两大部分,U-boot 也不例外。依赖于CPU 体系结构的代码(如CPU 初始化代码等)通常都放在阶段1 中,这些代码一般由汇编语言实现,有些CPU 还会在这个阶段调用部分的C 函数,例如MPC83xx ;U-boot 的阶段2则用于实现复杂的功能,这部分功能通常用C 语言来实现,具有更好的可读性和移植性。下面结合MPC83xx 的启动流程进行分析: 3.1 U-boot 的stage1 https://www.360docs.net/doc/c812503190.html, 中国科技论文在线

uboot讲义

1嵌入式Linux软件结构与分布 一般情况下嵌入式Linux系统中的软件主要分为以下几部分: 1)引导加载程序:其中包括内部ROM中的固化启动代码和BootLoader两部分。内 部固化ROM是厂家在芯片生产时候固化的,作用基本上是引导BootLoader。 有的芯片比较复杂,比如Omap3在flash中没有代码的时候有许多启动方式: USB、UART或以太网等等。而S3C24x0则很简单,只有Norboot和 Nandboot。 drive e rs。 2)Linux kernel和driv 3)文件系统。包括根文件系统和建立于Flash内存设备之上的文件系统(EXT4、UBI、 CRAMFS等等)。它是提供管理系统的各种配置文件以及系统执行用户应用程序 的良好运行环境及载体。 4)应用程序。用户自定义的应用程序,存放于文件系统之中。 在Flash存储器中,他们的分布一般如下: BootLoader (被挂载到根文件系统或者作为

2在嵌入式Linux中Boot BootL L o a d er的必要性 Linux内核的启动除了内核映像必须在主存的适当位置,CPU还必须具备一定的条件: 1.CPU寄存器的设置:R0=0; R1=Machine ID(即Machine Type Number,定义在linux/arch/arm/tools/mach-types);R2=内核启动参数在RAM中起始基地址; 2.CPU模式:必须禁止中断(IRQs和FIQs); CPU必须SVC模式; 3.Cache和MMU的设置:MMU必须关闭; 指令Cache可以打开也可以关闭;数据Cache必须关闭; 但是在CPU刚上电启动的时候,一般连内存控制器都没有初始化过,根本 无法在主存中运行程序,更不可能处在Linux内核启动环境中。为了初始 化CPU及其他外设,使得Linux内核可以在系统主存中运行,并让系统 符合Linux内核启动的必备条件,必须要有一个先于内核运行的程序, 他就是所谓的引导加载程序(Boot Loader)。 3源码下载地址 U-boot官方主页 (注意其中的邮件列表链接) http://www.denx.de/wiki/U-Boot/WebHome U-boot官方源码FTP下载ftp://ftp.denx.de/pub/u-boot/ 4交叉编译链的介绍与安装 为什么要用交叉编译器?交叉编译通俗地讲就是在一种平台上编译出能运行在 体系结构不同的另一种平台上的程序,比如在PC平台(X86CPU)上编译出能 运行在以ARM为内核的CPU平台上的程序,编译得到的程序在X86CPU平台

uboot 2013 07 makefile条件编译 -y 的原理

makefile条件编译-y 的原理 1、–y的出现 分析Makefile时,看到各种–y ,Makefile 用-y的形式包含需要的文件,例如: ALL-$(CONFIG_NAND_U_BOOT) += $(obj)u-boot-nand.bin,当CONFIG_NAND_U_BOOT为y时,就包括u-boot-nand.bin文件 –y 是如果转换来的呢?直接赋值?no!下面分析其前世今生 2、–y的产生 版本:uboot 2013 07 Board: u-boot-2013.07\board\friendlyarm\mini2440\ 2.1 make mini2440_config 跳到Makefile中的 %_config:: unconfig @$(MKCONFIG) -A $(@:_config=) 主要执行MKCONFIG(顶层mkconfig文件)脚本,此文件在include目录下创建了两个文件:config.h和config.mk 。 (1)Config.h中指明了板子相关的配置头文件(内容不多,但很重要) /* Automatically generated - do not edit */ #define CONFIG_SYS_ARCH "arm" #define CONFIG_SYS_CPU "arm920t" #define CONFIG_SYS_BOARD "mini2440" #define CONFIG_SYS_VENDOR "friendlyarm" #define CONFIG_SYS_SOC "s3c24x0" #define CONFIG_BOARDDIR board/friendlyarm/mini2440 #include #include #include #include #include #include (2)config.mk包含了cpu体系结构和板子名称 2.2 make 跳到Makefile中的all,因为依赖等关系,需要创建autoconfig.mk,于是跳到 $(obj)include/autoconf.mk: $(obj)include/config.h @$(XECHO) Generating $@ ; \ set -e ; \ : Extract the config macros ; \ $(CPP) $(CFLAGS) -DDO_DEPS_ONLY -dM include/common.h | \ sed -n -f tools/scripts/define2mk.sed > $@.tmp && \

UBOOT超详细命令解析

U-boot发展到现在,他的命令行模式已经非常接近Linux下的shell了,命令行模式模式下支持“Tab”键的命令补全和命令的历史记录功能。而且如果你输入的命令的前几个字符和别的命令不重复,那么你就只需要打这几个字符即可,比如我想看这个U-boot的版本号,命令就是“ version”,但是在所有的命令中没有其他任何一个的命令是由“v”开头的,所以只需要输入“v”即可。 [u-boot@MINI2440]# version U-Boot 2009.11 ( 4月 04 2010 - 12:09:25) [u-boot@MINI2440]# v U-Boot 2009.11 ( 4月 04 2010 - 12:09:25) [u-boot@MINI2440]# base Base Address: 0x00000000 [u-boot@MINI2440]# ba Base Address: 0x00000000 由于U-boot支持的命令实在太多,一个一个细讲不现实,也没有必要。所以下面我挑一些烧写和引导常用命令介绍一下,其他的命令大家就举一反三,或者“help”吧! (1)获取帮助 命令:help 或 ? 功能:查看当前U-boot版本中支持的所有命令。 [u-boot@MINI2440]#help ?- alias for'help' askenv - get environment variables from stdin base - print or set address offset bdinfo - print Board Info structure bmp - manipulate BMP image data boot - boot default, i.e., run 'bootcmd' bootd - boot default, i.e., run 'bootcmd' bootelf - Boot from an ELF image in memory bootm - boot application image from memory bootp - boot image via network using BOOTP/TFTP protocol bootvx - Boot vxWorks from an ELF image cmp - memory compare coninfo - print console devices and information cp - memory copy crc32 - checksum calculation date - get/set/reset date &time dcache - enable or disable data cache dhcp - boot image via network using DHCP/TFTP protocol echo - echo args to console editenv - edit environment variable eeprom - EEPROM sub-system

从庖丁解牛说uboot如何编译

很多人拿到uboot,编译不知如何下手! 其实,这个世界上的万事万物,都有一个“纹理”。我读中学的时候劈柴,如果顺着木头的纹理劈下去很轻易的就劈开了,但如果反其道而行之不但劈不开而且斧头还会弹回来伤人!呵呵,城里出生的孩子是没这个体会,即使现在农村的孩子因为家里都烧液化气也没有这个机会体验了。 庖丁解牛之所以游刃有余,是因为他掌握了牛的纹理,顺着这些纹理就应该很容易。 那么我们的uboot的纹理在哪里呢? 很多初学者,拿到这种代码从来没有去看过它的readme或者document!这两个文本文件是非常重要的东西,可惜呀!很多人不去看readme而去请教别人,google,baidu,跑图书馆。其实,有些东西当你问到别人的时候,聪明的人也是去看readme然后给你解答的。 下面我们就去找uboot的纹理! 本文u-boot版本U-Boot 1.1.4 我们按正常人的思维(智商90)来分析。 首先,是要编译,那么编译就要执行命令make,而make实际上就是执行makefile文件。第一次make肯定是不能成功的。听从观音菩萨的教诲“从哪里来就到哪里去”!make 出问题,我们就去makefile里找原因。Makefile里有这样一段话: TOPDIR := $(shell if [ "$$PWD" != "" ]; then echo $$PWD; else pwd; fi) export TOPDIR ifeq (include/config.mk,$(wildcard include/config.mk)) # load ARCH, BOARD, and CPU configuration include include/config.mk export ARCH CPU BOARD VENDOR SOC # load other configuration include $(TOPDIR)/config.mk ifndef CROSS_COMPILE ifeq ($(HOSTARCH),ppc) CROSS_COMPILE = else ifeq ($(ARCH),ppc) CROSS_COMPILE = powerpc-linux- endif ifeq ($(ARCH),arm) CROSS_COMPILE = /usr/local/arm/2.95.3/bin/arm-linux- endif ifeq ($(ARCH),i386) ifeq ($(HOSTARCH),i386)

uboot移植心得

最近跑完裸机之后,便开始跑系统,但想着裸机与系统之间隔着个Bootloader,反正以前也没怎么深入研究,便说花一到两周时间来搞搞U-BOOT。 参考了fzb和赵春江两位大牛的,也研究了2010.06版本的和2011.06版本两个经典版本,也对比了TQ(我买的板是天嵌的)自己写的U-BOOT,学到了不少,也发现了很多东西,以下便记录以下自己的心得吧,以便以后可以自己参考下。 U-BOOT的两个阶段启动过程:(2010.06经典版来说) 第一阶段:start.S的路径位于arch\arm\cpu\arm920t\这段汇编代码一般被称作第一阶段初始化代码。主要作用是初始化运行环境;初始化内存;重新放置UBOOT代码到内存中;跳入到内存中执行第二段初始化代码 1、关闭开门狗,屏蔽所有中断 2、设置分频比 3、bl cpu_init_crit() 关MMU,初始化内存 bl lowlevel_init() 配置内存,修改内存刷新率参数等 4、relocate判断当前代码是在NORFLASH还是RAM copy_loop循环将FLASH代码复制至RAM中 5、stack_setup栈设置 clear_bss_bss_start到_bss_end之间的数据清0 6、ldr pc , start_armboot 跳转到第二阶段 //===================================================================== 第二阶段:board.c的路径位于arch/arm/lib/board.c,这段代码为U-BOOT的第二阶段初始化代码。主要作用是初始化两个重要数据结构,对SDRAM的内存分配设置,对各种需要用到的外设进行初始化,最后循环跳入main_loop()函数 二阶段start_armboot分为board_init_f 和 board_init_r两部分 先执行的board_init_f部分: 1、为gd数据结构分配地址,并清零 2、执行init_fnc_ptr函数指针数组中的各个初始化函数,如下 board_early_init_f ,timer_init ,env_init init_baudrate serial_init console_init_f display_banner dram_init 3、A、分配SDRAM高64KB为TLB,用于U-BOOT B、分配SDRAM下一单元为U-BOOT代码段,数据段,BSS段 (这里插一句,原来BSS段是用来存放未初始化的全局变量与静态变量) C、接着开辟malloc空间,存bd , gd , 3个字大小的异常堆空间 4、将relorate的地址值赋给gd结构体相应变量(2011.06版本的,用于返回start.S) 后执行的board_init_r部分: 1、对gd , bd 数据结构赋值初始化 2、各种外设初始化: 初始化NORFLASH, NANDFLASH,初始化ONENAND FLASH

uboot编译说明

按照readme 所说的 make NAME_config make ------------------------------------------------------------------------- 其中NAME_config在根目录的Makefile中,其中包含了很多 NAME_config,代表各个不同的板子。 如果要新添加一块板子的支持,需要在Makefile中新添加一个NAME_config 比如 ######################################################################### ## HFRK S3C44B0 Systems ######################################################################### hfrks3c44b0_config : unconfig @./mkconfig $(@:_config=) arm s3c44b0 hfrks3c44b0 hfrk 后面的几个参数依次表示ARCH,CPU,BOARD,VENDOR ------------------------------------------------------------------------- 然后跟到mkconfig去看看执行了什么 根据该脚本的注释知道他做了三件事情 1)为变量赋值并输出到./include/config.mk文件的末尾(不要和根目录下面的config.mk搞混) 对于上面的配置项 ARCH = arm CPU = s3c44b0 BOARD = hfrks3c44b0 /* 9G20板子里的 ARCH = arm CPU = arm926ejs BOARD = at91sam9g20ek VENDOR = atmel SOC = at91sam9 */ 2)在./include下面建立了几个链接文件 rm -f asm ln -s asm-$2 asm rm -f asm-$2/arch ln -s arch-$3 asm-$2/arch if [ "$2" = "arm" ] ; then rm -f asm-$2/proc ln -s proc-armv asm-$2/proc

内核编译及uboot编译常见问题

u-boot编译命令: make diskclean make xxxx_s3c44b0_config make 内核编译常见问题: 一、安装交叉编译环境 44b0没有MMU,不支持虚拟内存,因此在编译所用的头文件及库与普通linux不同,这些都需要uclinux的,使用的交叉编译工具是arm-elf-gcc,因此在编译前要先安装此工具; 1、在linux2.6的版本中安装会出现如下错误 需要输入:vi arm-elf-tools-20040427.sh 修改第39行。 35 rm -rf "/usr/local/arm-elf" 36 rm -rf "/usr/local/lib/gcc-lib/arm-elf" 37 rm -f /usr/local/bin/arm-elf-* 38 39 tail +${SKIP} ${SCRIPT} | gunzip | tar xvf - 40 41 exit 0 tail 后面添加-n即可; 修改后如下:39 tail -n +${SKIP} ${SCRIPT} | gunzip | tar xvf - 这样之后就可以安装此工具了; 二、内核配置 在配置内核是一般都是用方便的图形界面来配置,用命令:make menuconfig 。但 刚装好的linux操作系统没有安装此工具,因此就不支持此make menuconfig。可以 联网安装, 用命令:sudo apt-get install ncurses-dev在线安装。 在线安装的前提条件是linux主机可以上网,在首次使用在线安装时要更新一下 apt-get, 用命令:sudo apt-get update 到此就可以用make menuconfig来配置linux内核了。 内核配置好之后就可以进行编译了 三、内核编译 步骤:

AR71XX_UBOOT编译入门

2. 解压代码 这个就随便了,一般解压在主目录。 将下载的mr3420_3220v1.tar.gz 移动到主目录。 注意:这里压缩包扩展名有误,实际上是bzip2 压缩的。 打开终端,此时终端应该默认在主目录下,若不在主目录下,就运行cd ~ 命令进入主目录。 运行命令tar -jxvf mr3420_3220v1.tar.gz 以解压代码。 tar_jxvf_mr3420_3220v1.png (31.25 KB, 下载次数: 0) 3. 编译代码 运行命令cd mr3420_3220v1/build 进入代码编译目录。 运行命令make BOARD_TYPE=ap99 fs_prep 以创建编译过程所需的目录。 运行命令make BOARD_TYPE=ap99 uboot 以开始编译U-Boot。 4. 刷机测试 如果没有意外,那么编译结束后的输出应该是这样的:

生成的u-boot.bin 位于mr3420_3220v1/images/ap99/ 目录下。 此文件未被填充到128K,需要手动填充。 填充后的文件就可以进行刷机测试了。 此文件是未压缩版,因此本身体积很大。此代码也不能生成压缩版的U-Boot。 5. 说明 操作说明请参阅代码根目录下的readme.txt。 入门级的操作就这么简单。 进阶级: 进阶级依然使用TL-MR3420 v1 的代码。 进阶级将分离U-Boot 代码及现成的工具链,搭建基本的交叉编译环境。 1. 分离U-Boot 代码 U-Boot 代码位于mr3420_3220v1/ap99/boot/u-boot 。 将整个u-boot 目录复制到一个地方,如用户主目录。 此u-boot 目录里的代码就是全部所需的代码了。之后的所有操作都在这里面完成。

uboot源代码startS详解

以下内容源于朱友鹏老师《物联网大讲堂》视频的学习整理。如有侵权,请告知删除。 一、基本的概念 ?阶段的定义: 1、第一阶段,即在内部SRAM运行的阶段,简单地理解为汇编阶段,此阶段主要涉及start.S文件,在cpu/s5pc11x/目录下。第一阶段以ldr pc _start_armboot为结束。 2、第二阶段,即在DDR中运行的阶段,简单地理解为C语言阶段,此阶段主要涉及start_armboot函数,在uboot/lib_arm/board.c文件的444~908行。 ?第一阶段主要完成的任务有: 1、异常向量表的实现; 2、设置进入特权模式,即SVC模式; 3、检查恢复状态; 4、IO状态恢复; 5、关看门狗; 6、一些与SRAM、SROM相关的GPIO设置; 7、开发板的供电锁存; 8、时钟的初始化; 9、DDR的初始化; 10、重新设置栈空间; 11、uboot的重定位。 12、转换表的建立; 13、使能MMU。 可见,uboot的第一阶段初始化了SoC内部的一些部件,初始化DDR并且重定位。 一、start.S的引入 1、uboot中整个程序的入口取决于链接脚本中ENTRY声明的地方。因为链接脚本(即 board\samsung\x210\u-boot.lds)中有ENTRY(_start),因此_start符号所在的文件就是起始文件,所处的位置就是起始位置。 2、SI工具的使用:search—>lookup reference. 二、start.S解析1

(1)config.h文件在mkconfig脚本中生成,此文件内容为#include ; (2)version.h文件中的内容是#include "version_autogenerated.h"。version_autogenerated.h文件是在主Makefile中自动生成的。 生成代码为: 生成内容(即version_autogenerated.h文件中内容为): #define U_BOOT_VERSION "U-Boot 1.3.4" (3)由于定义了宏CONFIG_ENABLE_MMU,因此包含asm/proc/domain.h。由于采用了符号链接(为了让uboot 具有可移植性),实际包含include\asm-arm\proc-arm\domain.h文件。 三、start.S解析2 1、启动代码的16字节头部 (1)arm7和arm9(其他的我不清楚)的arm指令集中,一个字类型是32bit。 (2)此段代码用16个字节填充占位(这些数字貌似可以任意?),字节内容需要后续计算重新填充。.word 是arm汇编的伪指令,含义是当前地址的值为XX,XX的内容一般为数值或者地址。 如:.word 0x2000表示当前地址的值为0x2000; .word _start 表示当前地址的值为_start函数 2、构建异常向量表

UBoot移植详细教程

u-boot 移植步骤详解(必会) 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的理由: ①开放源码; ②支持多种嵌入式操作系统内核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS; ③支持多个处理器系列,如PowerPC、ARM、x86、MIPS、XScale; ④较高的可靠性和稳定性; ④较高的可靠性和稳定性; ⑤高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等; ⑥丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等; ⑦较为丰富的开发调试文档与强大的网络技术支持; 2 U-Boot主要目录结构 - board 目标板相关文件,主要包含SDRAM、FLASH驱动; - common 独立于处理器体系结构的通用代码,如内存大小探测与故障检测;

相关主题
相关文档
最新文档