实验五 Linux 内核的安装与加载(三种方式)

【实验目的】

掌握 uboot 的使用方法,能够使用 uboot 安装和加载内核

【实验环境】

  1. ubuntu 14.04 发行版
  2. FS4412 实验平台

【注意事项】

  1. 实验步骤中以“$”开头的命令表示在 ubuntu 环境下执行,以“#”开头的命令表
    示在开发板下执行

【实验步骤】

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

  1. 将资料中“Linux 内核镜像”目录下的“uImage”和“exynos4412-fs4412.dtb”拷贝到ubuntu 中 tftp 工作目录下
    将资料中“根文件系统镜像”目录下的“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
  1. 检查网络设置是否正确,使用网线连接开发板与电脑,然后给开发板重新上电,上电之后观察 uboot 是否能通过 tftp 加载和启动内核,启动时是否能挂载根文件系统(ext2),启动完成后在终端上输入 linux 下的 shell 命令测试是否正常

在这里插入图片描述

二、通过 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

显示如下信息表示安装成功
在这里插入图片描述

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

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

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

  1. 将资料中“根文件系统镜像”目录下的“rootfs.tar”拷贝到 ubuntu 中 nfs 工作目录下
    在这里插入图片描述

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

	$ sudo tar xvf rootfs.tar.xz

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

	$ sudo rm rootfs.tar.xz
  1. 修改 uboot 的启动参数

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

设置完成后保存这些参数

	# saveenv
  1. 重启 nfs 服务器

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

四、将 uboot 安装到 EMMC

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

  1. 将资料中“u-boot 镜像”目录下的“u-boot-fs4412.bin”拷贝到 ubuntu 中 tftp 工作目录
    在这里插入图片描述

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

    # tftp 0x41000000 u-boot-fs4412.bin
    

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

	# emmc open 0# mmc write 0 0x41000000 0x0 0x800# emmc close 0emmc 命令打开引导分区,这样就可以在EMMC中写入u-boot引导程序了,注意写入完毕要关闭引导分区fs4412开发板SD卡启动方式是从第一块内存开始搬移运行程序,EMMC启动方式是从第0块内存开始搬移运行程序

显示如下信息表示安装成功
在这里插入图片描述

  1. 关闭开发板电源,调整拨码开关位置为 EMMC 启动
    在这里插入图片描述

  2. 给开发板重新上电,观察 uboot 是否能正常启动
    在这里插入图片描述

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

一、uboot内核启动命令

bootm

启动指定内存地址上的Linux内核并为内核传递参数
bootm kernel-addr ramdisk-addr dtb-addr
注:kernel-addr:	内核的下载地址  ramdisk-addr:	根文件系统的下载地址  	dtb-addr:		设备树的下载地址若不使用相应的地址,对应的位置写“-”
eg: bootm 0x41000000 - 0x42000000	

二、uboot自启动参数环境变量

bootargs

eg:
setenv bootargs root=/dev/nfs nfsroot=xxx.xxx.xxx.xxx:/opt/4412/rootfs rw console=ttySAC2,115200 init=/linuxrc ip=***.***.***.***
注:
root		根文件系统类型(nfs)
nfsroot		网络文件系统路径(xxx.xxx.xxx.xxx:/opt/4412/rootfs)				(自己服务器ip地址,nfs目录)
rw      	操作网络文件系统的权限(rw)
console		控制台(使用串口2,波特率115200)
init        init进程的位置(/linuxrc)
ip          linux启动后自身的IP(***.***.***.***)uboot中的ipaddr地址

0x42000000 - 0x41000000 = 1000000字节(十进制:16777216)
16777216 / 1024字节 = 16384K
16384K / 1024K = 16M

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/82320.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

亚马逊云科技CEO谈及企业领导力原则的核心:坚持顾客至上

亚马逊云科技首席执行官Adam Selipsky几乎从一开始就在那里:他于2005年加入,在效力亚马逊11年后于2016年离开,转而经营Tableau,并于2021年成为亚马逊云科技首席执行官。当时亚马逊云科技前首席执行官安迪贾西(Andy Jassy)接替杰夫…

Prometheus介绍

Prometheus介绍 1. Prometheus 简介2. Prometheus 的特点3. Prometheus 的架构4. Prometheus 的基本组件5. Prometheus工作流程6. Prometheus和Zabbix对比7. Prometheus的部署模式7.1 基本高可用模式7.2 基本高可用远程存储7.3 基本HA 远程存储 联邦集群方案 8. Prometheus能…

uniapp-滑块验证组件wo-slider

wo-slider是一款支持高度自定义的滑块验证组件,采用uniapp-vue2编写 采用touchstart、touchmove、touchend事件实现的滑块组件,支持H5、微信小程序(其他小程序未试过,可自行尝试) 可到插件市场下载尝试: https://ext.…

目标检测笔记(十一):如何结合特定区域进行目标检测(基于OpenCV的人脸检测实例)

文章目录 背景代码结果 背景 由于我们在做项目的时候可能会涉及到某个指定区域进行目标检测或者人脸识别等任务,所以这篇博客是为了探究如何在传统目标检测的基础上来结合特定区域进行检测,以OpenCV自带的包为例。 一般来说有两种方式实现区域指定&…

CSS3盒模型+flex

1.盒模型 标准盒模型: wwidthpaddingborderhheightpaddingborder 怪异盒模型(ie盒模型) wwidth包含了(paddingborder)hheight包含了(paddingborder) 2.CSS3弹性盒(重点新版弹性盒) 弹性盒: 设置为弹性盒后,父元素为容器,子元素为项目弹性盒中存在两根轴,默认水平为主轴,垂…

PHP“牵手”拼多多商品详情数据获取方法,拼多多API接口批量获取拼多多商品详情数据说明

拼多多商品详情接口 API 是开放平台提供的一种 API 接口,它可以帮助开发者获取拼多多商品的详细信息,包括商品的标题、描述、图片等信息。在拼多多电商平台的开发中,拼多多详情接口 API 是非常常用的 API,因此本文将详细介绍拼多多…

Android studio 2022.3.1 鼠标移动时不显示快速文档

在使用技术工具的过程中,我们时常会遇到各种各样的问题和挑战。最近,我升级了我的Android Studio到2022.3.1版本,但是在使用过程中,我碰到了一个让我颇为困扰的问题:在鼠标移动到类名或字段上时,原本应该显…

基于数据湖的多流拼接方案-HUDI概念篇

目录 一、为什么需要HUDI? 1. 传统技术选型存在哪些问题? 2. Hudi有什么优点? 基于 Hudi Payload 机制的多流拼接方案: 二、HUDI的应用场景 1. 什么场景适合使用hudi? 2. 什么场景不适合使用hudi? …

vue实现表格的动态高度

需求:表格能够根据窗口的大小自动适配页面高度 防抖和节流函数的使用场景是当需要对频繁触发的事件进行限制时,例如: 防抖函数常用于限制用户在短时间内多次触发某一事件,例如搜索框输入并搜索,当用户一直在输入时,我们可以使用防抖函数来避免多次请求搜索结果,减轻服…

c#扩展方法的使用

扩展方法可以向现有类型“添加”方法,无需创建新的派生类型、重新编译或以其他方式修改原始类型,用起来很方便,下面是我写的例子,为string这个常用的类型添加一个showmes方法,以下是扩展方法的代码: public…

Tomcat的安装与介绍

首先我们先了解一下什么是服务器?什么是服务器软件? 什么是服务器?安装了服务器软件的计算机。 什么是服务器软件? 服务器软件是一种运行在服务器操作系统上,用于接收和处理客户端请求,并提供相应服务和资…

自动化测试之Junit

Junit引入注解参数化单参数多参数方法传参 测试用例执行顺序断言测试套件 Junit引入 Junit来编写和组织自动化测试用例,使用Selenium来实际模拟用户与Web应用程序的交互。也就是使用JUnit的测试功能来管理和运行Selenium测试。常见的做法是,使用JUnit作…