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 所以环境变量还需要重新设置

 

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

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

相关文章

postMessage——不同源的网页直接通过localStorage/sessionStorage/Cookies——技能提升

最近遇到一个问题,就是不同源的两个网页之间进行localstorage或者cookie的共享。 上周其实遇到过一次,觉得麻烦就让后端换了种方式处理了,昨天又遇到了同样的问题。 使用场景 比如从网页A通过iframe跳转到网页B,而且这两个网页…

工具系列:PyCaret介绍_Fugue 集成_Spark、Dask分布式训练

文章目录 1、分布式计算场景(1)分类(2)回归(3)时间序列 2、分布式应用技巧(1)一个更实际的案例(2) 在设置中使用lambda而不是dataframe(3) 保持确定性(4) 设置n_jobs(4)设置适当的批量大小(5) 显示进度(6)自…

java旅游攻略管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web旅游攻略管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql…

Unity新动画系统之动画层和动画遮罩

Unity新动画系统之动画层和动画遮罩 一、介绍二、动画骨骼遮罩层使用第一种就是create一个avatar Mask,如下:第二种遮罩,就是直接在动画剪辑的属性上更改,如图一为humanoid类型的动画剪辑属性: 一、介绍 之前分享过FSM动画控制系…

Python算法例25 落单的数Ⅲ

1. 问题描述 给出2n2个非负整数元素的数组,除其中两个数字之外,其他每个数字均出现两次,找到这两个数字。 2. 问题示例 给出[1,2,2,3,4,4,5,3]&#xff0c…

小白也能搞定的Python选择排序

更多Python学习内容:ipengtao.com 大家好,我是彭涛,今天为大家分享 小白也能搞定的Python选择排序。全文3300字,阅读大约10分钟 选择排序(Selection Sort)是一种简单但有效的排序算法,它通过逐步…

掌握函数式组件:迈向现代化前端开发的关键步骤(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

数据孤岛:一场数据的独立战争

在当今数字化的时代,数据已成为企业和组织最宝贵的资产之一。然而,尽管数据的价值被广泛认可,但数据的分散和孤立问题却仍然存在,这就是所谓的数据孤岛。本文将重点分析什么是数据孤岛、数据孤岛的危害以及解决数据孤岛的传统和创…

2024苹果手机iOS管理软软件iMazing2.17永久免费版下载教程

iMazing2024是一款专业的苹果IOS设备管理器,强悍的性能远超苹果的iTunes,iMazing 能让广大果粉能已自己的方式管理苹果设备,无需iTunes即可畅快传输或者保存苹果设备中的音乐、消息、文件以及其他数据。 iMazing2Mac-最新绿色安装包下载如下&…

在使用 npm install的时候提示node-sass command faile 解决方案

在使用npm install的时候错误提示node-sass 相关的。错误信息如下图: 解决方法(PS:凯哥的不适用) 出现这种问题基本是由于node版本与sass版本不匹配导致的 方案1:卸载node,安装对应版本 方案2&#xff1…

2023最新轻松升级、安装和试用Navicat Premium 16.3.3 教程详解

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

Java进阶九—数组问题(集合框架)

Java进阶九—数组问题(集合框架) 一.原生数组带来的问题 原生数组容易造成超出边界,如果非要使用传统的数组,增删改查,就要用到数据结构,非常复杂CRUD是指在做计算处理时的增加(Create)、读取查询(Retrieve)、更新(Update)和删除(…

Mac如何配置Java环境

想必很多小伙伴会遇到配置Java环境的情况,今天就跟大家一起分享下我的安装过程,记录一下也是留给需要的小伙伴学习 一、下载和安装JDK 登录OracleJDK官网:https://www.oracle.com/java/technologies/downloads/,或者OpenJDK官网…

全国(山东、安徽)职业技能大赛--信息安全管理与评估大赛题目+答案讲解

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏…

反网络爬虫的三个阶段

随着网络爬虫的普及和网络攻击的日益复杂,升级网络安全措施成为保护网站和应用程序免受恶意爬虫侵害的必要举措。本文将深入研究反网络爬虫的三个阶段,并详细探讨IP地址过滤的策略,以提升网络的安全性。 第一部分:反网络爬虫的三…

射频芯片CMT2310-DEMO 通信覆盖测试体验

CMT2310是一款超低功耗,高性能的射频收发器,申请一套原厂CMT2310演示demo来验证下Sub-868设备在国内城市环境通信覆盖效果。 城市道路实测情况 测试小结:设备已基于外置天线,且以最佳方位做验证,但测试结果数据不是很理想。

Vue3 性能优化

代码分析 由于我们使用的是vite vite打包是基于rollup 的我们可以使用 rollup 的插件 npm install rollup-plugin-visualizervite.config.ts 配置 记得设置open 不然无效 import { visualizer } from rollup-plugin-visualizer; plugins: [vue(), vueJsx(),visualizer({open:…

【PS】制作 素描 + 遗照

复制一个图层 图像-调整-黑白 图片变成黑白图片(好像遗照啊) 新建一个图层,按住ATLDETELED 填充图层颜色为白色 (设置一下颜色) 设置混合模式为:颜色减淡 设置前景色为黑色。 选择毛笔工具,在…

贝叶斯球快速检验条件独立

贝叶斯球 定义几个术语,描述贝叶斯球在一个结点上的动作: 通过(pass through):从当前结点的父结点方向过来的球,可以访问当前结点的任意子结点(父->子)。从当前节点的子结点方向…

格雷编码(转换与计算)附代码

目录 格雷码对应表 格雷码转换公式 公式1 公式2 代码实现 格雷码对应表 十进制数 4位自然二进制码 4位典型格雷码 0 0000 0000 1 0001 0001 2 0010 0011 3 0011 0010 4 0100 0110 5 0101 0111 6 0110 0101 7 0111 0100 8 1000 1100 9 1001…