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

news2025/1/14 18:17:26

一、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.coloradmin.cn/o/1331947.html

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

相关文章

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

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

单元测试(超详细整理)

前言 为什么我们需要测试? 让产品可以快速迭代,同时还能保持高质量 对于一些相对稳定的系统级别页面,自动化测试在提高测试的效率的方面起到非常重要的作用。前端的自动化测试主要包括:浏览器测试和单元测试。Vue官方脚手架自带…

Unity中Shader观察空间推导(在Shader中实现)

文章目录 前言一、观察空间矩阵推导1、求观察空间基向量2、求观察空间的基向量在世界空间中的矩阵 的 逆矩阵2、求平移变换矩阵3、相乘得出 观察空间转化矩阵4、得到顶点的世界空间坐标,然后转化到观察空间5、把观察空间坐标转化为齐次裁剪坐标输出到屏幕 二、最终效…

Python入门学习篇(五)——列表字典

1 列表 1.1 定义 ①有序可重复的元素集合 ②可以存放不同类型的数据 ③个人理解:类似于java中的数组1.2 相关方法 1.2.1 获取列表长度 a 语法 len(列表名)b 示例代码 list2 [1, 2, "hello", 4] print(len(list2))c 运行结果 1.2.2 获取列表值 a 语法 列表名…

STM32实现三个小灯亮

led.c #include"led.h"void Led_Init(void) {GPIO_InitTypeDef GPIO_VALUE; //???RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//???GPIO_VALUE.GPIO_ModeGPIO_Mode_Out_PP;//???? ????GPIO_VALUE.GPIO_PinGPIO_Pin_1|GPIO_Pin_2|GPIO_P…

深度学习中的池化

1 深度学习池化概述 1.1 什么是池化 池化层是卷积神经网络中常用的一个组件,池化层经常用在卷积层后边,通过池化来降低卷积层输出的特征向量,避免出现过拟合的情况。池化的基本思想就是对不同位置的特征进行聚合统计。池化层主要是模仿人的…

Openwrt AP 发射 WiFi 信号

问题 想一次把 OpenWrt 路由器 wifi 问题给解决,完全取代路由器。 使用 倍控的 N5105 设备,有 mPCIe 接口,使用了 intel AX200 无线网卡,支持 2.4G 与 5G。 设置步骤 OpenWrt 镜像 第一次使用的镜像不支持 wifi,在…

Docker知识总结

Docker 学习目标: 掌握Docker基础知识,能够理解Docker镜像与容器的概念 完成Docker安装与启动 掌握Docker镜像与容器相关命令 掌握Tomcat Nginx 等软件的常用应用的安装 掌握docker迁移与备份相关命令 能够运用Dockerfile编写创建容器的脚本 能够…

51单片机拆字程序实验

一、实验内容 1.基本要求 熟悉51仿真系统;设计并单步调试,实现将R5中数值(初值为本人学号后两位)拆分成两位独立的数据分别存于R6,R7中; 2.扩展要求 将R6,R7中的被拆出来的一位HEX数据转换为可显示的ASCII编码&…

Python算法例27 对称数

1. 问题描述 对称数是一个旋转180后(倒过来)看起来与原数相同的数,找到所有长度为n的对称数。 2. 问题示例 给出n2,返回["11","69","88&#x…

docker构建镜像及项目部署

文章目录 练习资料下载一、docker基础1. 基本概念2. docker常见命令3. 命令别名4. 数据卷 二、docker自定义镜像1. 了解镜像结构2. 了解Dockerfile3. 构建Dockerfile文件,完成自定义镜像 三、网络1. docker常见网络命令2. docker自带虚拟网络3. 自定义网络 四、dock…

Web前端 ---- 【Vue】vue路由守卫(全局前置路由守卫、全局后置路由守卫、局部路由path守卫、局部路由component守卫)

目录 前言 全局前置路由守卫 全局后置路由守卫 局部路由守卫之path守卫 局部路由守卫之component守卫 前言 本文介绍Vue2最后的知识点,关于vue的路由守卫。也就是鉴权,不是所有的组件任何人都可以访问到的,需要权限,而根据权限…

simulinkveristandlabview联合仿真——模型导入搭建人机界面

目录 1.软件版本 2.搭建simulink仿真模型 编译错误 3.导入veristand并建立工程 4.veristand导入labview labview显示veristand工程数据 labview设置veristand工程数据 运行labview工程 1.软件版本 matlab2020a,veristand2020 R4,labview2020 SP…

第1课 配置FFmpeg+OpenCV开发环境

一、配置开发环境 1.下载FFmpegOpenCV开发所用的SDK压缩包,并解压到E:\SDK下,解压后的路径应为:E:\SDK\ffmpeg-sdk\58\x86\dll及E:\SDK\opencv-sdk\340\x86\dll。 2.新建VC项目,名称为demo1,项目类弄为MFC应用程序&a…

2023年浙大城市学院新生程序设计竞赛(同步赛)G

登录—专业IT笔试面试备考平台_牛客网 题意 思路 首先想法非常单一,一定是去枚举操作点,然后看它染白和不染的价值差值 也就是说,把一个黑色结点染白之后,对哪些结点的价值会影响 不难想象其实就是操作结点的子树和该点连通的…

嵌入式硬件电路原理图之跟随电路

描述 电压跟随电路 电压跟随器是共集电极电路,信号从基极输入,射极输出,故又称射极输出器。基极电压与集电极电压相位相同,即输入电压与输出电压同相。这一电路的主要特点是:高输入电阻、低输出电阻、电压增益近似为…

C/C++ 连接访问 MySQL数据库

前面我们已经讲述了MySQL的基础使用,现在我们来看一下如何使用语言来操作数据库。在实际开发中,语言连接MySQL是为了能够在编程语言中与MySQL数据库进行交互和操作。大部分情况我们都是通过语言连接MySQL,建立与MySQL数据库的连接&#xff0c…

docker笔记2-docker 容器

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

Android UID相关知识

一、UID/PID/GID/GIDS的含义和作用 UID : android中uid用于标识一个应用程序,uid在应用安装时被分配,并且在应用存在于手机上期间,都不会改变。一个应用程序只能有一个uid,多个应用可以使用sharedUserId 方式共享同一个uid&#…

【四】【C语言\动态规划】地下城游戏、按摩师、打家劫舍 II,三道题目深度解析

动态规划 动态规划就像是解决问题的一种策略,它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题,并将每个小问题的解保存起来。这样,当我们需要解决原始问题的时候,我们就可以直接利…