一、tftp加载Linux内核及rootfs
通过ubuntu 将linux/dtb/rootfs从服务器加载到开发板内存并运行
过程:
一、通过 tftp 加载内核和根文件系
1、将Linux内核镜像、设备树、根文件系统下载到tftp的工作目录
2.修改权限,重启tftp(每次用tftp之前都需要重启)
3.使用tftp之前需要保证 ubuntu 桥接模式,硬件连接没问题,开发板与pc网线连接
4.连接开发板与电脑(串口线和网线(直连)均连接),在 uboot 交互模式下,设置 uboot 的启动参数
注 1:xxx.xxx.xxx.xxx 为 ubuntu 主机的 ip,***.***.***.***为开发板的 ip,必须和 ubuntu 主机的 ip 在同一个网段(根据自己电脑情况进行设置)
连接之前确保ubuntn与开发板连接成功 ping 开发板ip
5.设置设置自启动环境变量
将uImage (linux镜像)和dtb(设备树)和根文件系统ramdisk
uImage放在0x4100 0000 ,设备树 0x4200 0000 ,中间空间有100 0000字节(16进制)->16777261字节()10进制/1024/1024=16,之间有16M 的大小;du -mh 查看文件大小,uImage只有2.9M
5.1>. bootm:启动指定内存地址上的linux内核命令(类似go);给内核传参
bootm kernel-addr ramdisk-addr dtb-addr
注: kernel-addr:内核的下载地址
ramdisk-addr:根文件系统的下载地址
dtb-addr:设备树的下载地址
若不使用相应的地址,对应的位置写“-”
eg:
bootm 0x41000000 - 0x42000000
6.设置uboot环境变量自启动参数bootargs
7.重启开发板,自启动会自动下载和运行Linux内核
若开发板交互界面一直显示T T T T T T 超时,从以下方面找原因:
1、检查开发板和Ubuntu的网络是否通畅,相互要都能ping的通哦,才能保证相互都在同一个网络里。
2、tftp服务器是否掉了,需要重启一下。
3、ubuntu里对tftpboot服务器的配置文件的设置是否检查无误了,和创建的服务目录权限及里面的内核、设备树文件是否有访问权限,权限不够就用chmod改。
4、最后提醒下,tftpboot下是放了内核和设备树文件的
8.开发板自启动下载信息
8.1>.开发板信息
8.2进入自启动下载Linux镜像、根文件系统、设备树
8.3下载完校验
8.4启动linux内核,uboot不再运行:(starting)
8.5挂载根文件系统,Linux系统启动
8.6 执行Linux命令
至此,在开发板上运行成功Linux系统
二、EMMC加载Linux内核及rootfs
上一节通过tftp从ubuntn下载linux等相关文件,但是当开发板不联网或者没有网络,系统无法运行
本节是将linux等装入EMMC不同扇区,uboot启动后将linux等从外存加载到内存中运行,可以脱网
2.1EMMC加载Linux内核及rootfs流程
2.1.1-1 下载linux内核镜像到内存
2.1.1-2将内核镜像写入到 EMMC 中指定的扇区
uImage 2.6M,EMMC一块512字节,需要的空间转换成16进制为1734
2.2下载设备树到内存 ,并将设备树写入EMMC中指定的扇区
2.3 下载根文件系统镜像到内存中
EMMC安装情况:
2.4要从 EMMC 驱动,所以还要修改 uboot 的启动参数
2.5 重启开发板
2.5.1 MMC加载内核、根文件系统、设备树到内存
其余与上一节类似
三、tftp加载Linux内核nfs挂载rootfs
开发使用tftp更便捷,使用EMMC加载更适合生产。
本节为tftp+nfs结合的方式:最适合开发的方式
具体方法:用tftp将内核和设备树加载到内存,将根文件系统以网络文件的形式和开发板共享。
我们会经常修改内核和设备数的源码,也会经常向根文件系统中添加一些 驱动或应用程序,这样每次修改之后我们都要重新将内核或根文件系统安装到 EMMC 中, 步骤会比较繁琐,开发效率也比较低,所以在开发阶段我们经常使用的方式是通过 tftp 加 载内核和设备树再通过 nfs 挂载根文件系统,这样步骤 简单,效率也比较高,待产品定型之后在安装到 EMMC
1.将根文件目录放到nfs的工作目录下,并解压
2.修改uboot启动参数
3.重启nfs
4.给开发板重新上电
uboot加载Linux内核和设备树:
5.nfs挂载根目录系统
6.文件实际存在于ununtu中,只是共享到开发板。
7.为什么tftp+nfs的方式对于开发来说最快
之前在ubuntn上编写程序、编译,需要通过loadb 加载到开发板运行,而采取这种方式编译的文件通过nfs可以直接共享到开发板上
但是不能在开发板上直接./test,因为不同架构CPU的机器码汇编语言不同,c语言不区分架构,gcc默认生成的可执行文件是x86的可执行文件,则需要arm下的编译器
交叉编译
8.uboot自启动参数环境变量:bootargs:给linux内核传递参数
eg:setenv bootargs root=/dev/nfs nfsroot=xxx.xxx.xxx.xxx:/opt/4412/rootfsrw console=ttySAC2,115200 init=/linuxrc ip=***.***.***.***
注:root 根文件系统挂在方式(nfs)
nfsroot网络文件系统路径(xxx.xxx.xxx.xxx:/opt/4412/rootfs)
rw 操作网络文件系统的权限(rw)
console 控制台(ttySAC2 :使用串口2,波特率115200)
init 进程的位置(/linuxrc)
ip linux 启动后开发板自身的IP(***.***.***.***)
四、EMMC加载uboot
以上的几种方式中我们既可以通过网络启动内核也可以将内核安装到 EMMC 中从本地 启动,但是对于 uboot 我们一直使用的是从 SD 卡启动,所以我们也可以将 uboot 安 装到 EMMC 中然后从 EMMC 启动 uboot,这样就可以不使用 SD 卡了
1.将uboot放到tftp的工作目录下,并给最高权限。
2.给开发板重新上电,在 uboot 交互模式下,去下载并安装 uboot
3.将内核镜像安装到 EMMC 中指定的扇区
与之前不同的是,需要先将引导分区打开,安装完之后需要将引导分区关闭
4.设置开发板的为EMMC启动
5.上电,启动的是EMMC中的uboot所以环境变量需要重新设置
6.重启nfs和tftp服务器
7.上电 检查是否设置成功
若不成功,检查环境变量是否设置错误,ip地址是否设置错误,是否重启nfs和tftp。