实验五 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.mzph.cn/news/48525.shtml

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

相关文章

计算机视觉 -- 图像分割

文章目录 1. 图像分割2. FCN2.1 语义分割– FCN (Fully Convolutional Networks)2.2 FCN--deconv2.3 Unpool2.4 拓展–DeconvNet 3. 实例分割3.1 实例分割--Mask R-CNN3.2 Mask R-CNN3.3 Faster R-CNN与 Mask R-CNN3.4 Mask R-CNN:Resnet1013…

ES搭建集群

一、创建 elasticsearch-cluster 文件夹 创建 elasticsearch-7.8.0-cluster 文件夹,在内部复制三个 elasticsearch 服务。 然后每个文件目录中每个节点的 config/elasticsearch.yml 配置文件 node-1001 节点 #节点 1 的配置信息: #集群名称&#xff0…

【数据备份、恢复、迁移与容灾】上海道宁与云祺科技为企业用户提供云数据中心容灾备份解决方案

云祺容灾备份系统支持 主流虚拟化环境下的虚拟机备份 提供对云基础设施 云架构平台以及 应用系统的全方位数据保护 云祺容灾备份系统规范功能 增强决策能力 高效恢复数据至可用状态 有效降低恢复成本 更大限度减少业务中断时间 保障业务可访问性 开发商介绍 成都云祺…

LSTM数学计算公式

LSTM(长短期记忆网络)是一种循环神经网络(RNN)的变体,常用于处理时间序列相关的任务。下面将简要介绍LSTM的数学推导和公式模型。 在训练一般神经网络模型时,通常用,其中W为权重,X为输入&#…

算法通关村第九关——中序遍历与搜索树

1 中序遍历和搜索树原理 二叉搜索树按照中序遍历正好是一个递增序列。其比较规范的定义是: 若它的左子树不为空,则左子树上所有节点的值均小于它的根节点的值;若它的右子树不为空,则右子树所有节点的值均大于它的根节点的值&…

【网络层协议】ARP攻击与欺骗常见的手段以及工作原理

个人主页:insist--个人主页​​​​​​ 本文专栏:网络基础——带你走进网络世界 本专栏会持续更新网络基础知识,希望大家多多支持,让我们一起探索这个神奇而广阔的网络世界。 目录 一、ARP攻击的常见手段 第一种:IP…

【健康医疗】Axure用药提醒小程序原型图,健康管理用药助手原型模板

作品概况 页面数量:共 20 页 兼容软件:Axure RP 9/10,不支持低版本 应用领域:健康管理,用药助手 作品申明:页面内容仅用于功能演示,无实际功能 作品特色 本作品为「用药提醒」小程序原型图…

Spring Boot 知识集锦之actuator监控端点详解

文章目录 0.前言1.参考文档2.基础介绍默认支持的端点 3.步骤3.1. 引入依赖3.2. 配置文件3.3. 核心源码 4.示例项目5.总结 0.前言 背景: 一直零散的使用着Spring Boot 的各种组件和特性,从未系统性的学习和总结,本次借着这个机会搞一波。共同学…

Android NDK JNI与Java的相互调用

一、Jni调用Java代码 jni可以调用java中的方法和java中的成员变量,因此JNIEnv定义了一系列的方法来帮助我们调用java的方法和成员变量。 以上就是jni调用java类的大部分方法,如果是静态的成员变量和静态方法,可以使用***GetStaticMethodID、CallStaticObjectMethod等***。就…

『C语言』数据在内存中的存储规则

前言 小羊近期已经将C语言初阶学习内容与铁汁们分享完成,接下来小羊会继续追更C语言进阶相关知识,小伙伴们坐好板凳,拿起笔开始上课啦~ 一、数据类型的介绍 我们目前已经学了基本的内置类型: char //字符数据类型 short …

SpeedBI数据可视化工具:浏览器上做分析

SpeedBI数据分析云是一种在浏览器上进行数据可视化分析的工具,它能够将数据以可视化的形式呈现出来,并支持多种数据源和图表类型。 所有操作,均在浏览器上进行 在浏览器中打开SpeedBI数据分析云官网,点击【免费使用】进入&#…

微服务(多级缓存)

多级缓存 1.什么是多级缓存 传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,如图: 存在下面的问题: 请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈Redis缓存失效时&…

SpringCloud学习笔记(二)_Eureka注册中心

一、Eureka简介 Eureka是一项基于REST(代表性状态转移)的服务,主要在AWS云中用于定位服务,以实现负载均衡和中间层服务器的故障转移。我们称此服务为Eureka Server。Eureka还带有一个基于Java的客户端组件Eureka Client&#xff…

发布 net 项目 到 Docker

背景 因为发布到 centOS8 使用 screen -S 可以,想开机自启 使用 nohup 命令有启动不起来。环境问题不好找,就想尝试用 docker 运行 步骤 在生成的 Dockerfile 文件里增加修改时区指令 因为我们用的都是北京时间所以 创建镜像的时候就调整好 #设置时间…

B站视频码率用户上传视频的视频码率

一般来说,B站用户可以根据自己的视频内容和需求来选择视频的码率,但以下是一些常见的视频码率范围,供用户参考: 标清(SD): 码率范围可能在500 Kbps至1.5 Mbps左右,适用于480p的分辨率…

【JavaEE基础学习打卡05】JDBC之基本入门就可以了

目录 前言一、JDBC学习前说明1.Java SE中JDBC2.JDBC版本 二、JDBC基本概念1.JDBC原理2.JDBC组件 三、JDBC基本编程步骤1.JDBC操作的数据库准备2.JDBC操作数据库表步骤 四、代码优化1.简单优化2.with-resources探讨 总结 前言 📜 本系列教程适用于JavaWeb初学者、爱好…

小程序中的页面配置和网络数据请求

页面配置文件和常用的配置项 1.在msg.json中配置window中的颜色和背景色 "navigationBarBackgroundColor": "#efefef","navigationBarTextStyle": "black" 2.可以看到home中的没有发生变化但是msg的发生变化了,这个和前面的…

【STM32RT-Thread零基础入门】 7. 线程创建应用(多线程运行机制)

硬件:STM32F103ZET6、ST-LINK、usb转串口工具、4个LED灯、1个蜂鸣器、4个1k电阻、2个按键、面包板、杜邦线 文章目录 前言一、RT-Thread相关接口函数1. 获取当前运行的线程2. 设置调度器钩子函数 二、程序设计1. 头文件包含及宏定义2. 线程入口函数定义3. main函数设…

神经网络简单理解:机场登机

目录 神经网络简单理解:机场登机 ​编辑 激活函数:转为非线性问题 ​编辑 激活函数ReLU 通过神经元升维(神经元数量):提升线性转化能力 通过增加隐藏层:增加非线性转化能力​编辑 模型越大,…

【分布式技术专题】「分布式ID系列」百度开源的分布式高性能的唯一ID生成器UidGenerator

UidGenerator是什么 UidGenerator是百度开源的一款分布式高性能的唯一ID生成器,更详细的情况可以查看官网集成文档 uid-generator是基于Twitter开源的snowflake算法实现的一款唯一主键生成器(数据库表的主键要求全局唯一是相当重要的)。要求java8及以上版本。 snow…