【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,uboot。linux,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 默认配置
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吧?上一篇:为什么玩游戏会弹出
下一篇:为什么连上网了,却不能上网