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

news2024/9/22 19:30:25

【实验目的】

掌握 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 0
	emmc 命令打开引导分区,这样就可以在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.coloradmin.cn/o/931623.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Consul的简介与安装

1、Consul简介 Consul是一套开源的分布式服务发现和配置管理系统,由HashiCorp公司用Go语言开发,Consul提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服…

python--文件管理系统

文件系统管理项目说明文档 项目说明 基本任务 在内存中开辟一个空间作为文件存储器,在其上实现一个简单的文件系统退出这个文件系统时,需要该文件系统的内容保存到磁盘上,以便下次可以将其回复到内存中来 具体要求 文件存储空间管理可采取链…

WPF基础入门-Class5-WPF命令

WPF基础入门 Class5-WPF命令 1、xaml编写一个button&#xff0c;Command绑定一个命令 <Grid><ButtonWidth"100"Height"40" Command"{Binding ShowCommand}"></Button> </Grid>2、编写一个model.cs namespace WPF_Le…

机械臂手眼标定ZED相机——眼在手外python、matlab

目录 1.眼在手外原理 2.附上眼在手外求得手眼矩阵的python代码 3.眼在手外标定步骤 1&#xff09;打印棋盘格 2&#xff09;得到hand数据 3&#xff09;得到camera数据 4.运行python得到手眼矩阵 1.眼在手外原理 眼在手外所求的手眼矩阵是基坐标到相机的转换矩阵 2.附上…

软件设计师学习笔记6-存储系统

1.层次化存储体系 1.1层次化存储结构 局部性原理是层次化存储结构的支持 时空局部性&#xff1a;刚被访问的内容&#xff0c;立即又被访问(eg: 循环体 ) 空间局部性&#xff1a;刚被访问的内容&#xff0c;临近的空间很快被访问(eg:数组) 1.2层次化存储结构的分类 DRAM&…

基于Tkinter的PanedWindow组件进行窗口布局

在用Tkinter进行可视化界面开发中&#xff0c;界面布局是最需要最先考虑的&#xff0c;哪些组件放在什么地方都需要优先规划&#xff0c;我们可以用place或者pack进行边开发边布局&#xff0c;这需要人为的去对齐&#xff0c;费时费力。在Tkinter中有个组件PanedWindow可以帮助…

手把手教你搭建一个盲盒小程序,轻松掌握开发技巧

在当今社交媒体时代&#xff0c;微信公众号已成为企业、个人传播和推广的重要工具。而微信公众号盲盒小程序则是一个更为创新和互动的方式&#xff0c;能够吸引更多用户的关注和参与。下面&#xff0c;我们将为大家介绍一下微信公众号盲盒小程序的制作完全攻略。 1. 注册登录【…

区分什么是Java内存模型(JMM)和 JVM运行时数据区

文章目录 一、概念区分1、什么是内存模型&#xff1f;什么是&#xff08;内存区域&#xff09;运行时数据区&#xff1f;2、为什么要有Java内存模型&#xff1f;2.1、硬件的效率与一致性2.2、 CPU和缓存的一致性2.2.1、为什么需要CPU cache&#xff1f;2.2.2、三级缓存&#xf…

ASEMI快恢复二极管APT80DQ60BG特点应用

编辑-Z APT80DQ60BG参数描述&#xff1a; 型号&#xff1a;APT80DQ60BG 最大峰值反向电压(VRRM)&#xff1a;600V 最大直流阻断电压VR(DC)&#xff1a;600V 平均整流正向电流(IF)&#xff1a;80A 非重复峰值浪涌电流(IFSM)&#xff1a;600A 工作接点温度和储存温度(TJ, …

基于社会群体算法优化的BP神经网络(预测应用) - 附代码

基于社会群体算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于社会群体算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.社会群体优化BP神经网络2.1 BP神经网络参数设置2.2 社会群体算法应用 4.测试结果&#xff1a;5…

C#_特性反射详解

特性是什么&#xff1f; 为程序元素额外添加声明信息的一种方式。 字面理解&#xff1a;相当于把额外信息写在干胶标签上&#xff0c;然后将其贴在程序集上。 反射是什么&#xff1f; 反射是一种能力&#xff0c;运行时获取程序集中的元数据。 字面理解&#xff1a;程序运行…

入门必看!亚马逊新品上架如何快速提升产品排名?

对于有经验的亚马逊卖家来说&#xff0c;各种套路已经玩的出神入化&#xff0c;但对于新手卖家来说&#xff0c;可能并不清楚亚马逊新品上架时应该去冲产品排名&#xff0c;更不知道怎么提升产品排名。所以今天&#xff0c;大白就为亚马逊新手卖家带来了亚马逊新品上架该如何提…

VR/AR/眼镜投屏充电方案(LDR6020)

VR眼镜即VR头显&#xff0c;也称虚拟现实头戴式显示设备&#xff0c;随着元宇宙概念的传播&#xff0c;VR眼镜的热度一直只增不减&#xff0c;但是头戴设备的续航一直被人诟病&#xff0c;如果增大电池就会让头显变得笨重影响体验&#xff0c;所以目前最佳的解决方案还是使用VR…

富士施乐S1810 放大或缩小复印方法

1、放置原稿 将原稿放置在稿台玻璃上。&#xff08;A3纸横向平铺&#xff09; 2、设置原稿尺寸 按下“原稿尺寸”键&#xff0c;将显示区调整为横向A3&#xff0c;如图&#xff1a; &#xff08;请务必确认是否与外观图的原稿尺寸显示区所显示的原稿尺寸和方向匹配。&#xf…

直播小程序源码有用的协议知识:MQTT协议

MQTT协议分析&#xff1a; MQTT协议中文全称为消息队列遥测传输协议&#xff0c;是一种实时通信协议&#xff0c;适用于物联网场景中。MQTT协议被应用到直播小程序源码平台中&#xff0c;确保了直播小程序源码平台音视频流的传输高效、低延迟&#xff0c;为直播小程序源码平台…

Springboot_Redis

Springboot默认使用lettuce操作redis,底层是netty jdeis并发差些 Redis的Template 分为两种, 一种是StringRedisTemplate&#xff0c;另一种是RedisTemplate 根据不同的数据类型&#xff0c;大致的操作也分为这5种&#xff0c;以StringRedisTemplate为例 stringRedisTempla…

Linux 终端命令之文件目录操作,对比Dos相关命令

目录 前言 基础命令&#xff08;文件目录相关的&#xff09; cd命令 【英文帮助】 【对应Dos命令】 pwd命令 【英文帮助】 【对应Dos命令】 ls命令 【英文帮助】 【对应Dos命令】 tree命令 【英文帮助】 【对应Dos命令】 mkdir命令 【英文帮助】 【对应Dos命令…

Linux下的Shell基础——文本处理工具(五)

前言&#xff1a; Linux Shell是一种基本功&#xff0c;由于怪异的语法加之较差的可读性&#xff0c;通常被Python等脚本代替。既然是基本功&#xff0c;那就需要掌握&#xff0c;毕竟学习Shell脚本的过程中&#xff0c;还是能了解到很多Linux系统的内容。 Linux脚本大师不是…

Android View动画之LayoutAnimation的使用

接前篇 Android View动画整理 &#xff0c;本篇介绍 LayoutAnimation 的使用。 参考《安卓开发艺术探索》。 View 动画作用于 View 。 LayoutAnimation 则作用于 ViewGroup &#xff0c; 为 ViewGoup 指定一个动画&#xff0c;ViewGoup 的子 View 出场时就具体动画效果。 简言…