1. u-boot是什么
Bootloader是硬件启动的引导程序,是运行操作系统的前提;对软硬件进行相应的初始化和设定,为最终运行操作系统准备好环境;加载并执行内核;
Bootloader不但依赖于CPU的体系结构,而且依赖于嵌入式系统板级设备的配置。
u-boot(Universal Boot Loader)是德国DENX小组开发的用于多种嵌入式CPU的bootloader程序。
2. u-boot移植步骤
- 下载源码
- 解压u-boot源码进入
- 指定交叉编译工具链
- 查看u-boot是否支持cpu — arch/arm/cpu/armv7/exynos/
- 导入板级配置文件 — 找一个最类似的 board配置修改, 这里我们参考的是 board/samsung/origen/ — make origen_config
- 编译u-boot 生成的u-boot.bin文件就是可执行的镜像文件。
exynos 需要三星提供的初始引导加密后,u-boot才能被引导运行运行
3. linux内核移植
-
下载linux内核并解压
-
进入源码目录,修改Makefile为交叉编译工具
-
明确三星猎户座芯片 — make exynos_defconfig
-
进入内核配置界面勾选需要的配置 — make menuconfig
-
编译内核:make uImage — u-boot格式的内核镜像文件
-
编译设备树:
make exynos4412-origen.dtb -
拷贝内核和设备树文件到tftp共享目录下,以供开发板远程下载;
4.根文件系统的移植
通过使用busybox工具制作几个重要的文件,和可执行文件目录;从http://www.busybox.net/ 下载busybox源代码。
- 拷贝源码到ubuntu中,并解压,
tar -vxf busybox-1.22.1.tar.bz2 - 进入源码目录,执行make menuconfig进入根文件系统配置菜单
Busybox Settings --->
Build Options --->
[*] Build BusyBox as a static binary (no shared libs) //勾选上
[ ] Force NOMMU build
[ ] Build with Large File Support (for accessing files > 2 GB)
(arm-linux-) Cross Compiler prefix //输入arm-linux-
() Additional CFLAGS
-
配置完成后进行编译
make -
导出文件 — make install
//编程生成的文件默认在_install文件夹 //建议拷贝到主目录,同时更改名字为rootfs cp _install ~/ -r //拷贝到主目录 mv _install rootfs //更改名字
-
添加相应的库与文件
mkdir etc dev tmp mnt proc sys var lib将工具链中的库拷贝到rootfs中的lib目录 sudo cp /home/farsight/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/lib/* ./lib/ -a // 注意修改成 自己的目录 rm ./lib/*.a //删除静态库 arm-linux-strip ./lib/* //拆剪
在etc下添加文件inittab脚本文件,配置init进程,文件内容如下:
#this is run first except when booting in single-user mode.
::sysinit:/etc/init.d/rcS
# /bin/sh invocations on selected ttys
# start an "askfirst" shell on the console (whatever that may be)
::askfirst:-/bin/sh
# stuff to do when restarting the init process
::restart:/sbin/init
# stuff to do before rebootingc
::ctrlaltdel:/sbin/reboot
在etc下添加文件fstab快捷方式文件,文件内容如下:
#device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 c 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
在etc下创建init.d目录,并在init.d下创建rcS文件,rcS文件内容为:
#!/bin/sh
# This is the first script called by init process
/bin/mount -a
echo /sbin/mdev > /proc/sys/kernel/hotplugc
/sbin/mdev -s
chmod +x init.d/rcS //添加执行权限
在etc下添加profile文件,文件内容为:
LD_LIBRARY_PATH=/lib:/usr/lib
export LD_LIBRARY_PAHT
PATH=/bin:/sbin:/usr/bin:/usr:/sbin
export PATHc
export HOSTNAME=fs4412
export USER=root
export HOME=/root
export PS1="[$USER@$HOSTNAME:\W]\# "
-
通过nfs进行挂载测试
a.搭建nfs服务 sudo apt install nfs-kernel-server b.修改配置文件(/etc/exports),将主目录下的rootfs共享出来 /home/yan/rootfs *(rw,sync,no_subtree_check,no_root_squash) c.重启服务 sudo service nfs-kernel-server restart
-
设置uboot环境变量
setenv bootcmd tftp 41000000 uImage\;tftp 42000000 exynos4412-origen.dtb\;bootm 41000000 - 42000000
setenv bootargs root=/dev/nfs nfsroot=192.168.1.105:/home/yan/rootfs,v3 rw console=ttySAC2,115200 init=/linuxrc ip=192.168.1.122 clk_ignore_unused
saveenv
//注意修改ip地址 192.168.1.105 :ubunut地址
//192.168.1.122 : 指定开发板ip地址
8.上电启动,观察能进入控制台则成功。