嵌入式开发之Linux系统移植4-Linux内核的安装与加载

举报
神龙居市 发表于 2022/03/27 20:07:24 2022/03/27
【摘要】 1、思路我们的目标是把Linux系统刷到EMMC中,开发板上电后从EMMC启动。但是目前我们只有一个带有UBoot的SD卡,什么方式才能刷EMMC呢?我们这里利用SD卡中的uboot,把Ubuntu中的uboot、Linux内心、dtb、rootfs刷到EMMC中,拨码开关指定到EMMC,那么以后启动就是EMMC中的uboot来引导了。下面按照这个思路,分步骤进行。 1.1、资料准备Ubu...

1、思路

我们的目标是把Linux系统刷到EMMC中,开发板上电后从EMMC启动。但是目前我们只有一个带有UBoot的SD卡,什么方式才能刷EMMC呢?
我们这里利用SD卡中的uboot,把Ubuntu中的uboot、Linux内心、dtb、rootfs刷到EMMC中,拨码开关指定到EMMC,那么以后启动就是EMMC中的uboot来引导了。下面按照这个思路,分步骤进行。

1.1、资料准备

  • Ubuntu虚拟机操作系统环境
  • FS442开发板(其他开发板也可以,根据不同点需要修改)
  • uImage 镜像(假设手里已经有了,后续会发如何制作uImage的过程)
  • exynos4412-fs4412.dtb 开发板核心Soc厂商可以提供,根据情况修改

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

2.1、文件准备

  • 准备好的镜像文件拷贝到tftp工作目中
    “uImage”和“exynos4412-fs4412.dtb”拷贝到 ubuntu 中 tftp 工作目录下
    “ramdisk”也拷贝到 ubuntu 中 tftp 工作目录下
    image.png
  • 修改这些文件的权限
$ sudo chmod 777 /tftpboot/*

2.2.重启tftp服务

$ sudo service tftpd-hpa restart

2.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

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

image.png

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

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

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

  • 下载内核镜像到内存中
# tftp 0x41000000 uImage
  • 将内核镜像写入到 EMMC 中指定的扇区
# mmc write 0 0x41000000 0x800 0x2000
  • 显示如下信息表示安装成功
    image.png
  • 下载设备树到内存中
# tftp 0x41000000 exynos4412-fs4412.dtb
  • 将设备树写入到 EMMC 中指定的扇区
# mmc write 0 0x41000000 0x2800 0x800
  • 显示如下信息表示安装成功
    image.png

  • 下载根文件系统镜像到内存中

# tftp 0x41000000 ramdisk.img
  • 将根文件系统镜像写入到 EMMC 中指定的扇区
# mmc write 0 0x41000000 0x3000 0x2000

显示如下信息表示安装成功
image.png

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

image.png

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

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

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

image.png

  • 解压跟文件系统到 nfs 工作目录
$ sudo tar xvf rootfs.tar.xz
  • 解压完成后删除原有压缩包
$ sudo rm rootfs.tar.xz

4.2.修改 uboot 的启动参数

# setenv bootcmd tftp 0x41000000 uImage\;tftp 0x42000000 exynos4412-fs4412.dtb\;bootm 0x41000000 - 0x42000000
  • 设置完成后保存这些参数
# saveenv

4.3.重启 nfs 服务器

$ sudo service nfs-kernel-server restart

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

image.png

5、将 uboot 安装到 EMMC

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

5.1.“u-boot-fs4412.bin”拷贝到 ubuntu 中 tftp 工作目录

image.png

5.2.开始执行

  • 给开发板重新上电,在 uboot 交互模式下,去下载并安装 uboot
# tftp 0x41000000 u-boot-fs4412.bin
  • 将内核镜像安装到 EMMC 中指定的扇区
# emmc open 0 
# mmc write 0 0x41000000 0x0 0x800 
# emmc close 0
  • 显示如下信息表示安装成功
    image.png

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

image.png

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

  • 因为启动的是 EMMC 中的 uboot 所以环境变量还需要重新设置
    image.png
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。