linux,uboot

| 数据库系统 |

【www.guakaob.com--数据库系统】

篇一:《Linux Uboot》

基于mips架构的uboot 启动流程

流程分析

***************************************************

1.最开始系统上电后

ENTRY(_start)程序入口点是 _start board/mingddie/u-boot.lds

2._start: cpu/mips/start.S

3. la t9, board_init_f 将函数board_init_f地址赋予t9

j t9 跳转到t9寄存器中保存的地址指向的指令

即跳转到RAM 中执行 C 代码

这里会打印一些信息。

3.1 board_init_f() lib_mips/board.c

初始化外部内存

relocate_code() 回到cpu/mips/start.S中继续执行

4.la t9,board_init_r cpu/mips/start.S

j t9 将函数board_init_r地址赋予t9

跳转到t9寄存器中保存的地址指向的指令

即跳转到RAM 中执行 C 代码

这里会打印一些信息

4.1 board_init_r() 函数 lib_mips/board.c

4.2 main_loop() common/main.c

s=getenv ("bootcmd") 取得环境变量中的启动命令行,如bootcmd=bootm 0xbf020000

run_command (s, 0); //执行这个命令行 ,即bootm

4.3 do_bootm() common/cmd_bootm.c

// printf ("## Booting image at %08lx .../n", addr); //比如

5. bootm 启动内核

5.1 do_bootm_linux() lib_mips/mips_linux.c

函数解析

***************************************************

1.board_init_f()

1.1

[cpp] view plaincopy

1.2

[cpp] view plaincopy

2.board_init_r()linux,uboot

(1)调用一系列的初始化函数。

(2)初始化Flash设备。

(3)初始化系统内存分配函数。

(4)如果目标系统拥有NAND设备,则初始化NAND设备。

(5)如果目标系统有显示设备,则初始化该类设备。

(6)初始化相关网络设备,填写IP、MAC地址等。

(7)进去命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作

[cpp] view plaincopy

4.do_bootm()

int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])

这个函数看着挺长的,其实无非就是将内核解压缩,然后调用do_bootm_linux引导内核

5.do_bootm_linux() lib_mips/mips_linux.c

打印信息Starting kernel ...

[cpp] view plaincopylinux,ubootlinux,uboot

u-boot向内核传递启动参数由一系列在include/configs/.h中的宏控制,启动参数传递的地址在board_init中初始化

于计算机系统来说,从开机上电到操作系统启动需要一个引导过程,这个引导程序就叫作 Bootloader 。

Bootloader 是在操作系统运行之前执行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射表,从而建立适当的系统软硬件环境,为最终调用操作系统内核做好准备。

对于嵌入式系统, Bootloader 是基于特定硬件平台来实现的。因此,几乎不可能为所有的嵌入式系统建立一个通用的 Bootloader ,不同的处理器架构都有不同的 Bootloader 。 Bootloader 不但依赖于 CPU 的体系结构,而且依赖于嵌入式系统板级设备的配置。对于 2 块不同的嵌入式板而言,即使它们使用同一种处理器,要想让运行在一块板子上的 Bootloader 程序也能运行在另一块板子上,一般也都需要修改 Bootloader 的源程序。

反过来,大部分 Bootloader 仍然具有很多共性,某些 Bootloader 也能够支持多种体系结构的嵌入式系统。例如, U-Boot 就同时支持 PowerPC 、 ARM 、 MIPS 和 X86 等体系结构,支持的板子有上百种。通常,它们都能够自动从存储介质上启动,都能够引导操作系统启动,并且大部分都可以支持串口和以太网接口。

二、 U-Boot 工程简介 (ZZ) :

最早, DENX 软件工程中心的 Wolfgang Denk 基于 8xxrom 的源码创建了 PPCBOOT(PowerPC Boot) 工程,并且不断添加处理器的支持。后来, Sysgo Gmbh 把 ppcboot 移植到 ARM 平台上,创建了 ARMboot 工程。然后以 ppcboot 工程和 armboot 工程为基础,创建了 U-Boot 工程。

现在 U-Boot 已经能够支持 PowerPC 、 ARM 、 X86 、 MIPS 体系结构的上百种开发板,已经成为功能最多、灵活性最强并且开发最积极的开放源码 Bootloader 。目前仍然由 DENX 的 Wolfgang Denk 维护。

U-Boot 的源码包可以从 sourceforge 网站下载,还可以订阅该网站活跃的 U-Boot Users 邮件论坛,这个邮件论坛对于 U-Boot 的开发和使用都很有帮助。

U-Boot 软件包下载网站: 。

U-Boot 邮件列表网站: 。

DENX 相关的网站: 。

三、 U-Boot 源码结构 (ZZ) :

从网站上下载得到 U-Boot 源码包,解压就可以得到全部 U-Boot 源程序。在顶层目录下有 18 个子目录,分别存放和管理不同的源程序。

这些目录中所要存放的文件有其规则,可以分为 3 类:

第 1 类目录与处理器体系结构或者开发板硬件直接相关;

第 2 类目录是一些通用的函数或者驱动程序;

篇二:《linux 内核启动过程移植uboot和linux内核》

移植UbootLinux整理

由于按照NFS不小心,Ubuntu罢工,不得以,自己重新把移植uboot和linux工作重新做一次,权当复习.

自己移植的是Uboot-1.2.0和 linux-2.6.14.1 到恒丰锐科(hfrk) 2410 的板子.用busybox-1.2.0 和cramfs-1.1 制作camfs.

该板子没有nor,只要64M的nand.

1.==============uboot按照编译器=====================

sudo tar -jxvf arm-linux-gcc-3.3.2.tar.bz2 -C /

//for uboot have hard float .

2.=========uboot1.2.0 移植 =======================

见附件 ubootclay2010Feb05.patch .

以下是移植说明.

修改根目录的Makefile的 cross compiler CROSS_COMPILE ?= /usr/local/arm/3.3.2/bin/arm-linux- 修改 /home/clay/u-boot-1.2.0/cpu/arm920t/config.mk 见7(13) 屏蔽 "-msoft-float" 不要浮点 ,也可以自己编译带软件浮点的编译器. make distclean

//清除上一次的配置

make smdk2410_config //选用2410 默认配置

linux,uboot

make //编译,在去掉浮点后,能编译通过

修改

/home/clay/u-boot-1.2.0/board/smdk2410/lowlevel_in it.S //2410 DDR时序配置

/home/clay/u-boot-1.2.0/cpu/arm920t/start.S // 添加copy uboot到ddr的代码,注意copy的页面数量要比编译出来的uboot.bin大

/home/clay/u-boot-1.2.0/include/configs/smdk2410.h //修改 nand boot的配置,nand命令,uboot启动kernel命令,传递给kernel的参数,串口波特率等等

for nand cmd & load CONFIG_BOOTARGS CONFIG_BOOTCOMMAND

/home/clay/u-boot-1.2.0/include/linux/mtd/nand_ids .h //添加 nand_flash_ids nand flash id

/home/clay/u-boot-1.2.0/lib_arm/board.c //可以添加一些打印信息,可以不添加

/home/clay/u-boot-1.2.0/common/cmd_boot.c //uboot的go 没有带CUP的id参数,所以添加,见7(9)

/home/clay/u-boot-1.2.0/drivers/nand/nand.c //for nand 的操作用到的具体的读写见7(12)

重新编译,可以进入到 uboot的命令界面 3.======================ubuntu tftp ======================= $ sudo apt-get install xinetd tftpd tftp 失败,vsftp也不能tftp访问,见7(11) 以下是成功的方法 sudo apt-get install tftpd-hpa tftp-hpa sudo update-rc.d -f tftpd-hpa remove clay@pan:/home$ sudo mkdir tftp clay@pan:/home$ sudo chmod 777 -R tftp/ clay@pan:/home$ sudo chown -R nobody tftp/ sudo apt-get install xinetd sudo gedit /etc/xinetd.d/tftp 添加以下 server = /usr/sbin/in.tftpd

#server_args = /home/tftp

disable = no

server_args = -s /home/tftpd -p -c -U 077 -u tftpd #//表示tftp操作目录在/home/tftpd上 log_on_success = PID HOST DURATION log_on_failure = HOST }

sudo gedit /etc/inetd.conf 屏蔽以下语句

#tftp dgram udp wait root /usr/sbin/in.tftpd /usr/sbin/in.tftpd -s /var/lib/tftpboot

如果tftp不能工作,执行/etc/init.d/xinetd restart 即可 到这里,在uboot 可以用 tftp 的命令下载zImage等,用go可以执行 4========================kernel=================== ====== 移植linux-2.6.14.1内核,见附件linuxclay2010feb04.patch.

修改

arch/arm/mach-s3c2410/devs.c //添加nand 分区 struct

drivers/mtd/nand/s3c2410.c //禁止nand ecc ,因为uboot和kernel的ecc不一样

linux/arch/arm/mach-s3c2410/mach-smdk2410.c,smdk24 10_devices添加 &s3c_device_nand,让系统开机初始化nand,能从中读取cramfslinux,uboot

参照arch/arm/configs/s3c2410_defconfig 配置内核,也可以用make menuconfig

然后在以下步骤添加

-Boot options :noinitrd root=/dev/mtdblock2 init=/linuxrc devfs=mount console=ttySAC0,115200

same as uboot

-file system - network file system - NFS

-miscellaneous filesystem-cramfs

make (zImage)//可以成功用修改后的go运行,只是找不到rootfs

制作bootm引导的uImage sudo cp ../u-boot-1.2.0/tools/mkimage /usr/local/bin/ gedit arch/arm/boot/Makefile ------------------------------------ quiet_cmd_uimage = UIMAGE $@ cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A arm -O linux -T kernel \ -C none -a $(ZRELADDR) -e 0x30008040 \ #//使用bootm,原因见7(6)的解释 -n 'Linux-$(KERNELRELEASE)' -d $< $@ ----------------------------------------------- make uImage ---- tftp 0x30008000 uImage nand erase 0x00040000 nand write 0x30008000 0x00040000 0x001c0000 5=================cramfs busybox================== 添加zlib,因为ubuntu没带,见7(17) $tar -xvzf zlib-1.2.3.tar.gz $cd zlib-1.2.3.tar.gz $./configure $make

$sudo make install cramfs-1.1/: make make make install 的到制作cramfs的工具的执行程序

编译busybox//最好和内核用一样的编译器,见7(16)

menuconfig

-设置 compiler /usr/local/arm/3.4.1/bin/arm-linux- -install option don't use /usr & set out file path -general CONFIG_FEATURE_SUID=y ??? make 后,在指定的目录的到bin sbin linuxrc,他们都是busybox的链接 6====================rootfs====================== 在编译出来 busybox 目录下 clay@pan:~/rootfs$ mkdir dev etc home lib mnt proc sys tmp var usr //bin sbin no need rm linuxrc//编译出来的这文件不能执行,不合适,所以要修改,见7(17) gedit linuxrc

----------------------------------------------

#!/bin/sh

echo "mount /etc as ramfs"

/bin/mount -f -t cramfs -o remount,ro /dev/bon/2 /

篇三:《嵌入式Linux之我行 史上最牛最详细的uboot移植,不看别后悔》

嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(一) 嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤。一为总结经验,二希望能给想入门嵌入式Linux的朋友提供方便。如有错误之处,谢请指正。

 共享资源,欢迎转载:

一、移植环境

 主 机:VMWare--Fedora 9

 开发板:Mini2440--64MB Nand,

 编译器:

 u-boot:

二、移植步骤

本次移植的功能特点包括:

 支持Nand Flash读写

 支持从Nor/Nand Flash启动

 支持CS8900或者DM9000网卡

 支持Yaffs文件系统

 支持USB下载(还未实现)

1. 了解u-boot主要的目录结构和启动流程,如下图。

u-boot的stage1代码通常放在cpu/xxxx/start.S文件中,他用汇编语言写成;

u-boot的stage2代码通常放在lib_xxxx/board.c文件中,他用C语言写成。

各个部分的流程图如下:

2. 建立自己的开发板项目并测试编译。

目前u-boot对很多CPU直接支持,可以查看board目录的一些子目录,如:board/samsung/目录下就是对三星一些ARM处理器的支持,有smdk2400、smdk2410和smdk6400,但没有2440,所以我们就在这里建立自己的开发板项目。

1)因2440和2410的资源差不多,主频和外设有点差别,所以我们就在board/samsung/下建立自己开发板的项目,取名叫my2440

2)因

2440和2410的资源差不多,所以就以2410项目的代码作为模板,以后再修改

3)修改u-boot跟目录下的Makefile文件。查找到smdk2410_config的地方,在他下面按照smdk2410_config的格式建立my2440_config的编译选项,另外还要指定交叉编译器

4)测试编译新建的my2440开发板项目

到此为止,u-boot对自己的my2440开发板还没有任何用处,以上的移植只是搭建了一个my2440开发板u-boot的框架,要使其功能实现,还要根据my2440开发板的具体资源情况来对u-boot源码进行修改。

3. 根据u-boot启动流程图的步骤来分析或者修改添加u-boot源码,使之适合my2440开发板(注:修改或添加的地方都用红色表示)。

1)my2440开发板u-boot的stage1入口点分析。

一般在嵌入式系统软件开发中,在所有源码文件编译完成之后,链接器要读取一个链接分配文件,在该文件中定义了程序的入口点,代码段、数据段等分配情况等。那么我们的my2440开发板u-boot的这个链接文件就是cpu/arm920t/u-boot.lds,打开该文件部分代码如下:

篇四:《如何在Linux下挂载U盘》

你是在虚拟机上安装的Linux吧?
如果想让linux识别U盘,需要把鼠标先定位在虚拟机的linux里面,然后插入优盘,优盘才会被linux识别,再用fdisk -l 来查看U盘的情况。
/dev/sda1 * 1 6 48163+ 83 Linux
/dev/sda2 7 515 4088542+ 83 Linux
/dev/sda3 516 776 2096482+ 82 Linux swap / Solaris
/dev/sda4 777 2610 14731605 5 Extended
/dev/sda5 777 2610 14731573+ 83 Linux

Disk /dev/sdb: 7985 MB, 7985954816 bytes
231 heads, 28 sectors/track, 2411 cylinders
Units = cylinders of 6468 * 512 = 3311616 bytes

Device Boot Start End Blocks Id System
/dev/sdb1 2 2412 7794688 b W95 FAT32
如果是fat格式的U盘,挂载命令:mount -t vfat /dev/sdb1 /mnt/udisk
如果是ntfs格式的U盘,挂载命令:mount -t ntfs-3g /dev/sdb1 /mnt/udisk
如果没有/mnt/udisk文件夹,可以创建一个
mkdir /mnt/udisk
即可~

但是注意,ntfs格式要挂载的话,需要下载一个ntfs-3g-2011。4。12-5。如何在Linux下挂载U盘。el5。i386。rpm包,安装一下~
百度一下这个包名,去CSDN下载。。。

本文来源:http://www.guakaob.com/jisuanjileikaoshi/307151.html

    热门标签

    HOT