LV.13 D6 Linux内核安装及交叉编译 学习笔记

一、tftp加载Linux内核及rootfs

1.1 uboot内核启动命令

bootm    

        启动指定内存地址上的Linux内核并为内核传递参数     

        bootm kernel-addr ramdisk-addr dtb-addr     

        注:         

                kernel-addr:    内核的下载地址           

                ramdisk-addr:    根文件系统的下载地址               

                dtb-addr:        设备树的下载地址         

                若不使用相应的地址,对应的位置写“-”     

        eg:         

                bootm 0x41000000 - 0x42000000    

1.2 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)     

                rw          操作网络文件系统的权限(rw)     

                console        控制台(使用串口2,波特率115200)     

                init            init进程的位置(/linuxrc)     

                ip              linux启动后自身的IP(***.***.***.***)

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

实验内容:

        先把Linux内核、设备树、根文件系统放到tftp服务器上(即上次实验创建的根目录下的/tftpboot)。通过设置自启动环境变量,uboot进入自启动模式后。通过tftp,从ubuntu上把Linux内核、设备树、根文件系统加载到内存,然后运行。

实验步骤:

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个G的内存,所以地址0x40000000-0x80000000这段内存是给内存条用的,所以我们把文件下载到这段空间。0x40000000-0x41000000这段空间预留给uboot给内核传递的参数,所以我们从0x41000000开始用。
4 、 检查网络设置是否正确,使用网线连接开发板与电脑,然后给开发板重新上电,上电之后观察 uboot 是否能通过 tftp 加载和启动内核,启动时是否能挂载根文件系统( ext2 ),启动完成后在终端上输入 linux 下的 shell 命令测试是否正常

二、EMMC加载Linux内核及roofs

        通过上面的方式我们虽然可以加载 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
显示如下信息表示安装成功

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

 

三、tftp加载Linux内核nfs挂载rootfs

3.1 通过tftp加载内核,通过nfs挂载根文件系统

        在后续的课程中我们会经常修改内核和设备数的源码,也会经常向根文件系统中添加一些
驱动或应用程序,这样每次修改之后我们都要重新将内核或根文件系统安装到 EMMC 中,
步骤会比较繁琐,开发效率也比较低,所以在 开发阶段 我们经常使用的方式是通过 tftp
载内核和设备树再通过 nfs 挂载根文件系统(后续课程都是使用这种方式),这样步骤
简单,效率也比较高,待产品定型之后在安装到 EMMC
实验步骤:
1 、 将资料中“根文件系统镜像”目录下的“ rootfs.tar ”拷贝到 ubuntu nfs 工作目录下
解压根文件系统到nfs工作目录
$ sudo tar xvf rootfs.tar.xz
解压完成后删除原有压缩包
$ sudo rm rootfs.tar.xz
2 、 修改 uboot 的启动参数
# setenv bootcmd tftp 0x41000000 uImage\;tftp 0x42000000 exynos4412-fs4412.dtb\;bootm 0x41000000 - 0x42000000
设置完成后保存这些参数
# saveenv
3 nfs 服务器
$ sudo service nfs-kernel-server restart
4 给开发板重新上电,上电之后观察内核是否能通过 tftp 加载和启动内核,启动完成后是
否能挂载根文件系统( nfs ),在终端上输入 linux 下的 shell 命令测试是否正常,若启动正常我们向 nfs 的工作目录中添加了新的文件之后可以在开发板直接看到

 

开发板这些文件是通过ubuntu远程共享给开发板的

 test文件在ubuntu上可以执行,而在开发板上无法执行。因为不同架构的机器码和汇编语言是不同的。

如果使用gcc进行编译,则默认生成的可执行文件是x86的

 如果想在开发板运行。则需用交叉编译器编译

 

开发板挂载根文件系统时,为什么开发板能精确的挂载到这台电脑的这个目录下的文件?

 答:因为在设置bootargs时设置好了。

四、EMMC加载uboot

4.1 将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    //需要先把EMMC打开
# mmc write 0 0x41000000 0x0 0x800
# emmc close 0

之前几次实验,留出了0x0-0x800的这块空间, 就是给uboot留的。

之前给SD卡刷uboot时,是从第1块扇区开始的,因为SD卡的第0块是存储分区表的。这块芯片如果使用SD卡启动,则默认从第1块开始搬移uboot,如果使用EMMC启动,则是默认从第0块开始搬移uboot。

        显示如下信息表示安装成功

3 、 关闭开发板电源,调整拨码开关位置为 EMMC 启动
4 、 给开发板重新上电,观察 uboot 是否能正常启动

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

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【线性代数】决定张成空间的最少向量线性无关吗?

答1: 是的,张成空间的最少向量是线性无关的。 在数学中,张成空间(span space)是一个向量空间,它由一组向量通过线性组合(即每个向量乘以一个标量)生成。如果这组向量是线性无关的&…

HP笔记本电脑进入BIOS的方法主要有两种,它们使用场合不同

BIOS(基本输入输出系统)是一种实用程序,它在你按下电源按钮后启动并加载操作系统。无论是要更新HP笔记本电脑的BIOS系统,还是清除前一个系统中的错误,第一步都是进入BIOS实用程序。 在按键输入BIOS设置并对其进行修改…

react中使用redux最简单最方便的方式,配合rematch简化操作,5分钟学会

react中使用状态管理的方式也很多,比如redux和mobx等,今天这一片就讲一下redux的入门到熟练使用,主要是要理解它redux的组成有哪些,到怎么创建,和组建中怎么使用三个问题。这里先放上官网文档,不理解的地方…

电子病历编辑器源码,提供电子病历在线制作、管理和使用的一体化电子病历解决方案

概述: 电子病历是指医务人员在医疗活动过程中,使用医疗机构信息系统生成的文字、符号、图表、图形、数据、影像等数字化信息,并能实现存储、管理、传输和重现的医疗记录,是病历的一种记录形式。 医院通过电子病历以电子化方式记录患者就诊的信息,包括&…

Pytest测试中的临时目录与文件管理!

在Pytest测试框架中,使用临时目录与文件是一种有效的测试管理方式,它能够确保测试的独立性和可重复性。在本文中,我们将深入探讨如何在Pytest中利用临时目录与文件进行测试,并通过案例演示实际应用。 为什么需要临时目录与文件&am…

蓝牙物联网室内定位系统解决方案

目前国内外室内定位技术较多,常见的有无线局域网(Wireless Fidelity,WiFi)、射频识别(Radio FrequencyIdentification,RFID)、蓝牙低功耗(Bletooth Low EnergyBLE)、超宽带(Ultra Wide BandUWB)技术等。近几年智能设备的迅速发展和蓝牙设备的生产制造成本越来越低&a…

Hadoop入门学习笔记——六、连接到Hive

视频课程地址:https://www.bilibili.com/video/BV1WY4y197g7 课程资料链接:https://pan.baidu.com/s/15KpnWeKpvExpKmOC8xjmtQ?pwd5ay8 Hadoop入门学习笔记(汇总) 目录 六、连接到Hive6.1. 使用Hive的Shell客户端6.2. 使用Beel…

ABC334 A-F

打的很懒的一场B卡了D看不懂题卡了F没看完题目理解错题意了,状态好差XD UNIQUE VISION Programming Contest 2023 Christmas (AtCoder Beginner Contest 334) - AtCoder A - Christmas Present 题意: 给出两个数B, G问哪个大 题解: 凑数…

nodejs微信小程序+python+PHP计算机网络在线考试系统-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…

【数据结构入门精讲 | 第九篇】考研408排序算法专项练习(一)

前面几篇文章介绍的是排序算法,现在让我们开始排序算法的专项练习。 目录 判断题选择题填空题1.插入排序2.另类选择排序3.冒泡排序4.快速查找第K大元 判断题 1.希尔排序是稳定的算法。(错) 解析:稳定性是指如果两个元素在排序前后…

A Philosophy of Software Design 学习笔记

前言 高耦合,低内聚,降低复杂度:在软件迭代中,不关注软件系统结构,导致软件复杂度累加,软件缺乏系统设计,模块混乱,一旦需求增加、修改或者优化,改变的代价无法评估&…

LangChain 30 ChatGPT LLM将字符串作为输入并返回字符串Chat Model将消息列表作为输入并返回消息

LangChain系列文章 LangChain 实现给动物取名字,LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储,读取YouTube的视频文本搜索I…

docker笔记2-docker 容器

docker 容器的运行 docker run 镜像名:版本标签: 创建 启动容器 docker run 镜像名 ,如果镜像不存在,则会在线下载镜像。 注意事项: 容器内的进程必须处于前台运行状态,不能后台(守护进程运行…

单片机的RTC获取网络时间

理解网络同步校准RTC的原理需要考虑NTP、SNTP、RTC这三个关键组件的作用和交互。下面详细解释这个过程: 1. NTP(Network Time Protocol): 协议目的:NTP是用于同步计算机和设备时钟的协议。它通过在网络上与时间服务器通…

小白入门之安装Navicat

重生之我在大四学JAVA 第四章 安装Navicat (mysql可视化工具) 这里Navicat是15版本,不是最新版,有新版强迫症的自行百度 傻瓜式安装一直下一步就行 完成后切记不要打开,不要打开,不要打开 可以打开刚刚安装的navicat了 切…

【XML】TinyXML 详解(二):接口详解

【C】郭老二博文之&#xff1a;C目录 1、XML测试文件&#xff08;laoer.xml&#xff09; <?xml version"1.0" standalone"no" ?> <!-- Hello World !--> <root><child name"childName" id"1"><c_child…

Unity手机移动设备重力感应

Unity手机移动设备重力感应 一、引入二、介绍三、测试成果X Y轴Z轴横屏的手机&#xff0c;如下图竖屏的手机&#xff0c;如下图 一、引入 大家对重力感应应该都不陌生&#xff0c;之前玩过的王者荣耀的资源更新界面就是使用了重力感应的概念&#xff0c;根据手机的晃动来给实体…

无需改动现有网络,企业高速远程访问内网Linux服务器

某企业为数据治理工具盒厂商&#xff0c;帮助客户摆脱数据问题困扰、轻松使用数据&#xff0c;使得客户可以把更多精力投入至数据应用及业务赋能&#xff0c;让数据充分发挥其作为生产要素的作用。 目前&#xff0c;该企业在北京、南京、西安、武汉等地均设有产研中心&#xff…

体验一下 CodeGPT 插件

体验一下 CodeGPT 插件 0. 背景1. CodeGPT 插件安装2. CodeGPT 插件基本配置3. (可选)CodeGPT 插件预制提示词原始配置(英文)4. CodeGPT 插件预制提示词配置(中文)5. 简单验证一下 0. 背景 看到B站Up主 “wwwzhouhui” 一个关于 CodeGPT 的视频&#xff0c;感觉挺有意思&#…

DQL-基本查询

概念&#xff1a; 1&#xff0c;数据库管理系统一个重要功能就是数据查询&#xff0c;数据查询不应只是简单返回数据库中存储的数据&#xff0c;还应该根据需要对数据进行筛选以及确定数据以什么样的格式显示 2&#xff0c;MySQL提供了功能强大、灵活的语句来实现这些操作 3…