【实验五】Linux 内核的安装与加载

【实验目的】
掌握uboot 的使用方法,能够使用uboot 安装和加载内核

【实验环境】
1、ubuntu 14.04 发行版
2、FS4412 实验平台

【注意事项】
1、实验步骤中以“$”开头的命令表示在ubuntu 环境下执行,以“#”开头的命令表
示在开发板下执行

【实验步骤】

一、通过tftp 加载内核和根文件系统

1、将资料中“Linux 内核镜像”目录下的“uImage”和“exynos4412-fs4412.dtb”拷贝到
ubuntu 中tftp 工作目录下

内核加载netem_系统架构


将资料中“根文件系统镜像”目录下的“ramdisk”也拷贝到ubuntu 中tftp 工作目录下

修改这些文件的权限

$ sudo chmod 777 /tftpboot/*

2、重启tftp 服务器

$ sudo service tftpd-hpa restart

3、连接开发板与电脑,在uboot 交互模式下,设置uboot 的启动参数

# setenv ipaddr ***.***.***.***
# setenv serverip xxx.xxx.xxx.xxx
# setenv bootcmd tftp 0x41000000 uImage\;tftp 0x42000000 exynos4412-fs4412.dtb\;tftp
0x43000000 ramdisk.img\;bootm 0x41000000 0x43000000 0x42000000
# setenv bootargs root=/dev/nfs nfsroot=xxx.xxx.xxx.xxx:/opt/4412/rootfs/ rw
console=ttySAC2,115200 init=/linuxrc ip=***.***.***.***

注1:xxx.xxx.xxx.xxx 为ubuntu 主机的ip,***.***.***.***为开发板的ip,必须和ubuntu
主机的ip 在同一个网段(根据自己电脑情况进行设置)
注2:以上设置手动输入,命令粘贴可能会有中文符号
设置完成后保存这些参数

# saveenv

4、检查网络设置是否正确,使用网线连接开发板与电脑,然后给开发板重新上电,上电之
后观察uboot 是否能通过tftp 加载和启动内核,启动时是否能挂载根文件系统(ext2),
启动完成后在终端上输入linux 下的shell 命令测试是否正常
 

内核加载netem_嵌入式硬件_02

注:由于linux内核、设备树、根文件系统的文件大小,我们也可以这样分配内存存储空间:

内核加载netem_linux_03

内核加载netem_系统架构_04

 


内核加载netem_内核加载netem_05

Linux系统启动过程:

①开发板上电后,第一个程序从零地址开始,运行三星公司固化在iROM里的那小段程序BL0。

②BL0先对开发板软硬件程序做基础的初始化,然后检测拨码开关的状态,当拨码开关到SD卡启动时,BL0会把SD卡第1个扇区中已经下载好的uboot搬到内存中启动。

③uboot启动后先做一些基本的软硬件初始化,并通过串口打印开发板的信息,再倒计时。

④倒计时若没有人为干预,uboot则进入自启动模式,自动执行环境变量bootcmd里预存的命令,启动Linux。(步骤包括下载Linux内核、设备树、根文件系统到开发板,以及执行bootm。)


二、通过EMMC加载内核和根文件系统

通过上述方式我们虽然可以加载Linux 内核和根文件系统并正常运行,但上述方式我们是把
内核镜像、设备树、根文件系统镜像都放到了tftp 服务器上,然后开发板上电之后再通过
tftp 去下载这些文件到开发板的内存中运行;但在实际做一个产品的时候我们不可能每次开
机都通过网络去服务器上下载这些镜像,所以以下步骤我们就将这些镜像安装到开发板上
的EMMC 中,然后从EMMC 启动内核

1、给开发板重新上电,在uboot 交互模式下,去下载并安装这些镜像

下载内核镜像到内存中

# tftp 0x41000000 uImage

将内核镜像写入到EMMC 中指定的扇区

# mmc write 0 0x41000000 0x800 0x2000

显示如下信息表示安装成功
下载设备树到内存中

# tftp 0x41000000 exynos4412-fs4412.dtb

将设备树写入到EMMC 中指定的扇区

# mmc write 0 0x41000000 0x2800 0x800

显示如下信息表示安装成功
下载根文件系统镜像到内存中

# tftp 0x41000000 ramdisk.img

将根文件系统镜像写入到EMMC 中指定的扇区

# mmc write 0 0x41000000 0x3000 0x2000

显示如下信息表示安装成功

内核加载netem_linux_06

2、因为要从EMMC 驱动,所以还要修改uboot 的启动参数

# setenv bootcmd mmc read 0 0x41000000 0x800 0x2000\;mmc read 0 0x42000000 0x2800
0x800\;mmc read 0 0x43000000 0x3000 0x2000\;bootm 0x41000000 0x43000000
0x42000000

若设置无法保存可尝试如下格式

# setenv bootcmd 'mmc read 0 0x41000000 0x800 0x2000;mmc read 0 0x42000000 0x2800
0x800;mmc read 0 0x43000000 0x3000 0x2000;bootm 0x41000000 0x43000000
0x42000000'

设置完成后保存这些参数

# saveenv

3、给开发板重新上电,上电之后观察内核是否能通过EMMC 加载和启动内核,启动完成
后是否能挂载根文件系统(ext2),在终端上输入linux 下的shell 命令测试是否正常
 

内核加载netem_ubuntu_07

三、通过tftp 加载内核通过nfs 挂载根文件系统

在后续中我们会经常修改内核和设备数的源码,也会经常向根文件系统中添加一些驱动或应用程序,这样每次修改之后我们都要重新将内核或根文件系统安装到EMMC 中,步骤会比较繁琐,开发效率也比较低,所以在开发阶段我们经常使用的方式是通过tftp 加载内核和设备树再通过nfs 挂载根文件系统(后续课程都是使用这种方式),这样步骤简单,效率也比较高,待产品定型之后在安装到EMMC 中。

1、将资料中“根文件系统镜像”目录下的“rootfs.tar”拷贝到ubuntu 中nfs 工作目录下

内核加载netem_嵌入式硬件_08

解压跟文件系统到nfs 工作目录

$ sudo tar xvf rootfs.tar.xz

解压完成后删除原有压缩包

$ sudo rm rootfs.tar.xz

2、修改uboot 的启动参数

# setenv bootcmd tftp 0x41000000 uImage\;tftp 0x42000000 exynos4412-fs4412.dtb\;bootm
0x41000000 - 0x42000000

设置完成后保存这些参数

# saveenv

3、重启nfs 服务器

$ sudo service nfs-kernel-server restart

4、给开发板重新上电,上电之后观察内核是否能通过tftp 加载和启动内核,启动完成后是
否能挂载根文件系统(nfs),在终端上输入linux 下的shell 命令测试是否正常,若启
动正常我们向nfs 的工作目录中添加了新的文件之后可以在开发板直接看到

内核加载netem_内核加载netem_09

 

四、将uboot 安装到EMMC

        以上的几种方式中我们既可以通过网络启动内核也可以将内核安装到EMMC 中从本地
启动,但是对于uboot 我们一直使用的是从SD 卡启动,所以我们也可以将uboot 安装到EMMC 中然后从EMMC 启动uboot,这样就可以不使用SD 卡了

1、将资料中“u-boot 镜像”目录下的“u-boot-fs4412.bin”拷贝到ubuntu 中tftp 工作目录

内核加载netem_系统架构_10


2、给开发板重新上电,在uboot 交互模式下,去下载并安装uboot

# tftp 0x41000000 u-boot-fs4412.bin

将内核镜像安装到EMMC 中指定的扇区

# emmc open 0
# mmc write 0 0x41000000 0x0 0x800
# emmc close 0

显示如下信息表示安装成功

内核加载netem_嵌入式硬件_11


3、关闭开发板电源,调整拨码开关位置为EMMC 启动

内核加载netem_linux_12


4、给开发板重新上电,观察uboot 是否能正常启动

因为启动的是EMMC 中的uboot 所以环境变量还需要重新设置 

内核加载netem_内核加载netem_13

 

 

 

 至此,四种Linux内核的安装与加载方式全部学习完毕,但要真正地完全掌握还需要自己不断地练习和积累。

        “无人问津的日子,正是登峰造极的好时机。”                ——人民日报

        与君共勉。