系统移植导学

news2024/11/26 10:19:55

什么是系统移植?

将操作系统移植到对应的硬件平台

linux系统移植到FS6818开发板

  1. 学习系统移植的目的?

1》浅图:为后面的驱动开发学习搭建一个系统环境

2》钱途:就业、工作的需要(公司新的硬件平台---》移植linux系统到硬件)

3》前途:嵌入式(软+硬)开发离不开操作系统

在众多嵌入式操作系统中,Linux目前发展最快、应用最为广泛。性能优良、源码开放的Linux具有体积小、内核可裁减、网络功能完善、可移植性强等诸多优点,非常适合作为嵌入式操作系统。

根据产品需求-----》软硬件可裁剪

  1. 如何学习系统移植?

在最短的时间内学会最有用的东西

学习移植的流程、思想和解决问题的方法即可

  1. 系统移植过程

Linux系统移植:

  1. 准备Linux内核镜像、SD卡启动盘
  2. 通过拨码开关选择启动方式(SD启动)
  3. 通过SD卡中的引导程序安装系统
  4. 安装Linux驱动程序
  5. 安装Linux应用程序

  1. 开发板启动的过程

  1. 开发板上电后首先运行SoC(6818)内部ROM中固化的代码(BL0),这段代码先对基本的软硬件环境(时钟等...)进行初始化
  2. 然后再检测拨码开关位置获取启动方式,然后再将对应存储器中的uboot搬移到内存,然后跳转到uboot运行
  3. uboot开始运行后首先对开发板上的软硬件环境做进一步初始化
  4. 然后将linux内核、设备树(dtb)、根文件系统(rootfs)从外部存储器(或网络)搬移到内存,然后跳转到linux运行
  5. Linux开始运行后先对系统环境做初始化,当系统启动完成后
  6. Linux再从内存中(或网络)挂载根文件系统
  1. 课程内容
  1. 环境搭建
  2. Uboot移植

uboot(Universal Boot Loader)通用引导加载程序,是一个主要用于嵌入式系统的引导加载程序,可以支持多种不同的计算机系统结构,其主要作用为:引导系统的启动!

最主要的功能有以下几点

1)初始化一些硬件为后续做准备(裸机代码)  

2)引导和加载内核

3)给内核传参

4)执行用户命令

  1. Linux内核移植

内核是硬件与软件之间的一个中间层。向上提供接口,向下可控制硬件

内核就像一个库,提供了一组面向系统的命令。系统调用对于应用程序来说,就像调用普通函数一样。

  1. 根文件系统移植

windows C盘系统相关的,Linux是一颗倒置的树

Uboot概述

Bootloader简介

Bootloader是在操作系统运行之前执行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射表,从而建立适当的系统软硬件环境,为最终调用操作系统内核做好准备。在嵌入式系统中,Bootloader是基于特定硬件平台来实现的,不同的处理器架构都有不同的Bootloader。例如,U-Boot就同时支持PowerPC、ARM、MIPS和X86等体系结构。其本质为一段裸机程序不是操作系统本身

Bootloader基本功能

  •  初始化软硬件环境
  •  引导加载linux内核
  •  给linux内核传参
  •  执行用户命令

注:bootloader是启动引导程序的统称,嵌入式linux常用的bootloader是uboot。

常见的Bootloader

bootloader就相当于类,uboot(Universal Boot Loader)就相当于对象。嵌入式领域常用的bootloader就是uboot

为什么使用Uboot

Uboot是一种开源的引导加载程序,它的作用是在嵌入式系统启动时加载内核并启动系统。使用Uboot的好处在于它可以提供很多功能,例如支持多种文件系统、网络启动、远程更新等。此外,Uboot还可以提供一些调试功能,例如通过串口输出调试信息等。因此,使用Uboot可以使嵌入式系统的开发和调试更加方便和高效。

Uboot的工作方式

  1. Uboot首先被加载到内存中,并开始执行。
  2. 初始化硬件设备,例如CPU、内存、串口等。
  3. 读取存储设备(例如Flash)中的内核镜像,并将其加载到内存中。
  4. 设置内核启动参数,例如根文件系统的位置、内存大小等。
  5. 跳转到内核的入口点,启动内核。
  6. 一旦内核启动成功,Uboot的使命就完成了,它的生命周期也就结束了。

扩展

根据自身情况观看视频

【嵌入式】我提着鞋带拎自己?嵌入式芯片启动过程全解析,彻底理解bootloader【蛋饼嵌入式】我提着鞋带拎自己?嵌入式芯片启动过程全解析,彻底理解bootloader_哔哩哔哩_bilibili

交叉开发环境搭建

安装交叉编译工具链

咱们前面已经安装了,不需要再安装。要知道有这一步,如果忘记了可以看文档     安装交叉编译环境

本地开发和交叉开发

本地开发:PC端编写代码,编译代码,运行代码

交叉开发:PC端编写代码,编译代码,Target(目标板)运行代码

学生疑问:不是已经将系统移植到目标板上了吗?为什么要使用交叉开发,不能直接在目标板上面编写和编译代码嘛?

PC  ——》 X86/64架构 

Target ——》 arm架构

使用交叉编译工具链将源码编译成支持ARM架构的可执行程序,再将可执行程序拷贝到目标板上运行。

PC:gcc

交叉编译工具链:arm-none-linux-gnueabi-gcc 

arm-none-linux-gnueabi-:交叉编译工具链的名字,名字就是一个代号

(在工作中用的不一定是这个,不同的公司做的交叉编译工具链的名字不同)

PC和开发板如何进行硬件连接

串口线的作用

打印各种调试信息到串口工具上

网线的作用

用于下载uboot和内核的镜像(可执行程序)

通过网络去挂载根文件系统

通过网线下载文件---》tftp服务

通过网线挂载根文件系统(板子(路径))---》nfs服务

tftp安装配置

TFTP是一个传输文件的简单协议,它基于UDP协议而实现,此协议设计的时候是进行小文件传输的。因此它不具备通常的FTP的许多功能,它只能从文件服务器上获得或写入文件,不能列出目录,不进行认证,它传输8位数据。

通过网线下载文件---》tftp服务

具体实验步骤可查看实验手册的实验二 系统移植实验手册

1. 检查ubuntu是否安装了tftp服务

dpkg -s tftpd-hpa

打印以下内容表示安装了tftp服务:

Architecture: i386

Source: tftp-hpa

Version: 5.2-7ubuntu3.1

2. 安装tftp服务

(前提:ubuntu必须能连接外网)

sudo apt-get update 更新源

sudo apt-get install -f 更新依赖

sudo apt-get install tftpd-hpa tftp-hpa 

3. 配置tftp服务

1. 在根目录下创建一个tftpboot文件夹

mkdir /tftpboot 

目的:/tftpboot目录下存放的是你要下载到开发板上的可执行文件

2. 修改tftpboot的权限

sudo chmod 777 tftpboot

3. 配置tftp服务的环境变量

打开sudo vi /etc/default/tftpd-hpa 

修改以下内容:

1 # /etc/default/tftpd-hpa
2 
3 TFTP_USERNAME="tftp" 
	tftp用户名,不需要修改
4 TFTP_DIRECTORY="/tftpboot"
	tftp服务下载文件的存放的路径,需要修改
	改成自己的对应的tftpboot的路径	 
5 TFTP_ADDRESS="0.0.0.0:69"
	tftp服务默认使用的69端口号
6 TFTP_OPTIONS="-c -s -l"  
	tftp服务的参数,这个需要修改

4. 重启tftp服务

1. sudo service tftpd-hpa start  启动TFTP服务

2. sudo service tftpd-hpa restart  重启TFTP服务

5. 本地测试tftp服务是否安装成功

(ping 其它机器过程:本机网卡驱动,到内核,内核处理这个驱动,发送ping的包到另一个系统的网卡,处理这个包,把包的内容放到协议站(在内核里面),识别到ping的包,然后通过网卡驱动,到网卡,返回一个包(都会到真正物理硬件))

$ tftp 127.0.0.1
tftp> get 1.txt    # 从tftpboot目录下下载
1.txt文件到当前目录 (本例子就是,
在tftpboot下面touch 1.TXT,然后在家目录下面运行)
tftp 127.0.0.1;然后get 1.txt,就把tftpboot下面的1.TXT下载到家目录下面了)
tftp> put 2.txt   # 把当前目录中的2.txt文件,上传到tftpboot文件夹中
tftp> q   <回车>  退出

6. 可能出现的问题

下载或上传是,一直卡

原因:

tftp服务安装成功,需要重启tftp服务

tftp服务安装不成功

关闭windows和ubuntu的防火墙(防火墙会阻碍数据传输)

nfs安装配置

NFS是基于UDP/IP协议的应用,其实现主要是采用远程过程调用RPC机制,RPC提供了一组与机器、操作系统以及底层传送协议无关的存取远程文件的操作。

通过网线挂载根文件系统---》nfs服务

详细步骤可参考实验手册中的实验三 系统移植实验手册

1. 检查nfs服务是否安装

dpkg -s nfs-kernel-server

2. 安装nfs服务(前提:可以上网)

sudo apt-get install nfs-kernel-server

3. 配置nfs服务

1》在根目录下创建文件夹

sudo mkdir -p /opt/6818/rootfs

2》设置文件夹的权限最大

sudo chmod -R 777 /opt/*

3》配置nfs服务的环境变量

sudo vi /etc/exports

在文件的最后一行添加以下内容:

****************************************

 /opt/6818/rootfs/ *(rw,sync,no_subtree_check,no_root_squash) 

****************************

解析:

/opt/6818/rootfs/:自己的根文件系统的路径

*:所有的用户,注:*和后边的左括号"("之间不可以出现空格.

rw:可读可写的权限

sync:同步文件

no_subtree_check:不对子目录检查文件的权限

no_root_squash:如果客户端为root用户,那么他对整个文件具有root的权限

注意:这段话前边不要加#,#号是这个文件中的注释符号

 4. 重启nfs服务

1. sudo service nfs-kernel-server start  启动nfs服务

2. sudo service nfs-kernel-server restart  重启nfs服务

5. 本地测试nfs服务是否安装成功

1》回到家目录下

cd ~

2》sudo mount -t nfs localhost:/opt/6818/rootfs  /mnt

(本机IP地址:ubuntu 的IP)

nfs:使用nfs服务,将本机IP地址:/opt/6818/rootfs/

文件挂载到/mnt目录下

3》检查/mnt目录下是否挂载成功

cd /mnt 

ls (此时mnt下面的东西就和rootfs下面一样)

4》卸载挂载的文件

sudo umount /mnt

注意:不可以在/mnt目录下执行卸载的命令

Uboot烧写及使用

SD卡启动盘制作

SD卡的存储以扇区为单位,每个扇区的大小为512Byte, 其中零扇区存储分区表(即分区信息)后续的扇区可自行分区和格式化;若选择SD卡启动,处理器上电后从第一个扇区开始将其中的内容搬移到内存,所以我们把uboot放到从第一个扇区开始之后的空间根据个人需求可进行分区和格式化

具体制作步骤详情看实验手册-》实验四  系统移植实验手册

uboot的使用

uboot模式

自启动模式

uboot启动后若没有用户介入,倒计时结束后会自动执行自启动环境变量bootcmd中设置的命令(一般作加载和启动内核)

交互模式

倒计时结束之前按下任意按键uboot会进入交互模式,交互模式下用户可输入uboot命令

uboot帮助命令

help 查看uboot支持的所有命令

help+命令 查看当前命令的使用方法

uboot环境变量命令

printenv 打印uboot中所有的环境变量

setenv 设置指定的环境变量(保存在RAM中)

setenv 环境变量 环境变量的值 

saveenv 保存所有环境变量到EMMC中

常用环境变量

ipaddr uboot的IP地址

serverip 服务器的IP地址(即ubuntu的IP) 

bootdelay 进入自启动模式之前倒计时的秒数

网络传输命令

loadb 通过Kermit协议下载文件到指定的内存地址( loadb  地址)

tftp 通过tftp协议下载文件到指定的内存地址( tftp  地址  文件名 )

存储器访问命令

mmc read 将EMMC中指定扇区中的内容读取到内存中指定的地址

mmc read  <addr> <blk#> <cnt>

   addr:  内存地址

blk#:  EMMC中的扇区编号

cnt:  读取的扇区的个数

mmc write 将内存中指定地址中的内容写入到EMMC中指定的扇区

mmc write <addr> <blk#> <cnt>

addr:对应着内存的地址

blk#:mmc设备的块号

cnt:mmc设备块的个数

mmc erase 将mmc的起始块号为blk#,cnt块大小的数据,进行擦除

mmc erase <blk#> <cnt>

blk#:mmc设备的块号

cnt:mmc设备块的个数

擦除的时间,受cnt块的个数有影响

自启动环境变量(bootcmd)

该环境变量可以设置成一到多个uboot命令的集合(若有多个使用\;分割),自启动模式下uboot就会按照bootcmd中命令的顺序逐条执行

把printenv命令写进去,开机之后不做干预,倒计时结束就会自动打印环境

例如:

      setenv bootcmd tftp 40008000 interface.bin\;go 40008000

      saveenv

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

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

相关文章

【普中】基于51单片机简易计算器数码管显示设计( proteus仿真+程序+实物演示+讲解视频)

【普中开发板】基于51单片机简易计算器数码管显示设计( proteus仿真程序实物演示讲解视频&#xff09; Proteus 仿真&#xff1a;Proteus 8.16(有低版本) 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;P04 1. 主要功能&#xff1a…

台灯选用什么类型好?精选适合考研党使用的护眼台灯

台灯可以说是我们日常办公、学习必不可少的一盏桌面照明工具&#xff0c;因为他能够给我们带来充足的光线。不过大多数时候&#xff0c;我们只关注到了台灯的亮度是否足够&#xff0c;以为只要光线够亮就不会上眼镜&#xff0c;但实际上我们大多数实力下降的原因就和光线有很大…

大数据技术之 Kettle(PDI)

Kettle 第一章 Kettle概述1.1、ETL简介1.2、Kettle简介1.3、作业 和 转换 概念1.4、核心组件1.5、下载安装 第二章 控件使用2.1、初体验&#xff1a;csv 转换 excel 示例2.2、转换2.2.1、输入控件2.2.1.1、表输入 2.2.2、输出控件2.2.2.1、表输出2.2.2.2、更新&插入/更新2.…

前后端传参:掌握FormData并解决form-data类型传参问题

目录 第一章 解决问题过程 第二章 对form-data的理解 2.1 使用场景 2.2 了解formData对象的创建与使用 2.3 formData常用方法 2.3.1 构造函数 2.3.2 获取数据 2.3.3 添加数据 2.3.4 修改数据 2.3.5 检查是否有该数据 2.3.6 删除数据 2.3.7 遍历formData里的键值对…

极狐GitLab DevSecOps 之容器镜像安全扫描

容器镜像安全 现状 最近某银行遭受供应链攻击的事件传的沸沸扬扬&#xff0c;安全又双叒叕进入了人们的视野。安全确实是一个非常重要&#xff0c;但是又最容易被忽略的话题。但是现在到了一个不得不人人重视安全&#xff0c;人人为安全负责的时代。尤其以现在非常火爆的云原…

Mybatis概述和快速入门

文章目录 Mybatis概述Mybatis概念JDBC 缺点Mybatis 优化 Mybatis快速入门 Mybatis概述 Mybatis概念 &#xff08;1&#xff09;Mybatis是一个半ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;它内部封装了JDBC&#xff0c;开发时只需要关注SQL语句本身&#xff0c…

电脑上怎么录屏?教你3种方法,轻松搞定!

在数字时代&#xff0c;电脑录屏已经成为各行各业的普遍需求&#xff0c;无论是制作教学视频、记录操作步骤&#xff0c;还是制作工作报告。可是很多人不知道电脑上怎么录屏&#xff0c;本文将详细介绍电脑上三种常见的录屏方法&#xff0c;通过这些工具&#xff0c;您可以轻松…

houdini 神经网络

实现个神经网络的3D可视化&#xff0c;美爆了&#xff01;-腾讯云开发者社区-腾讯云 https://vimeo.com/stefsietz GitHub - julrog/nn_vis: A project for processing neural networks and rendering to gain insights on the architecture and parameters of a model throu…

Linux驱动(中断、异步通知):红外对射,并在Qt StatusBus使用指示灯进行显示

本文工作&#xff1a; 1、Linux驱动与应用程序编写&#xff1a;使用了设备树、中断、异步通知知识点&#xff0c;实现了红外对射状态的异步信息提醒。 2、QT程序编写&#xff1a;自定义了一个“文本指示灯”类&#xff0c;并放置在QMainWidget的StatusBus中。 3、C与C混合编程与…

详细教程 - 从零开发 Vue 鸿蒙harmonyOS应用 第五节 (基于uni-app封装鸿蒙接口请求库)

随着鸿蒙系统的兴起,越来越多的app会采用鸿蒙开发。而鸿蒙开发必不可少的就是调用各种接口服务。为了简化接口的调用流程,我们通常会做一层封装。今天就来讲解一下,如何用uni-app封装鸿蒙的接口请求库。 一、新建项目 首先我们要新建一个鸿蒙项目啦&#xff01;当然选择第一个…

音频ncm格式转mp3格式

做个笔记&#xff0c;ncm格式转mp3格式 参考&#xff1a;传送门 import os import json import base64 import struct import logging import binascii from glob import glob from tqdm.auto import tqdm from textwrap import dedent from Crypto.Cipher import AES from mu…

批量移除dom上注册的事件

目录 一、问题 二、解决方法 三、总结 一、问题 1.在window上注册了事件&#xff0c;想要批量移除注册的事件&#xff0c;发现移除不了&#xff08;也不知道什么时候会被自动移除__) 二、解决方法 1.添加事件时增加同一个AbortController生成的 signal标识。使用AbortCon…

物流实时数仓:数仓搭建(DWD)二

系列文章目录 物流实时数仓&#xff1a;采集通道搭建 物流实时数仓&#xff1a;数仓搭建 物流实时数仓&#xff1a;数仓搭建&#xff08;DIM&#xff09; 物流实时数仓&#xff1a;数仓搭建&#xff08;DWD&#xff09;一 物流实时数仓&#xff1a;数仓搭建&#xff08;DWD&am…

【赠书第11期】Unity 3D游戏开发

文章目录 前言 1 Unity 3D简介 2 Unity 3D基本概念 2.1 场景&#xff08;Scene&#xff09; 2.2 游戏对象&#xff08;Game Object&#xff09; 2.3 组件&#xff08;Component&#xff09; 2.4 资源&#xff08;Asset&#xff09; 3 Unity 3D重要组件 3.1 物理引擎 …

基于SSM的图书馆预约座位系统的设计与实现(部署+源码+LW)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于SSM的图书馆预约座位…

如何使用JavaScript 将数据网格绑定到 GraphQL 服务

前言 作为一名前端开发人员&#xff0c;GraphQL对于我们来说是令人难以置信的好用。它可以用来简化数据访问&#xff0c;这让我们的工作变得更加容易。 什么是 GraphQL&#xff1f;它是一个抽象层&#xff0c;位于任意数量的数据源之上&#xff0c;并为您提供一个简单的 API …

【深度学习】注意力机制(三)

本文介绍一些注意力机制的实现&#xff0c;包括EMHSA/SA/SGE/AFT/Outlook Attention。 【深度学习】注意力机制&#xff08;一&#xff09; 【深度学习】注意力机制&#xff08;二&#xff09; 【深度学习】注意力机制&#xff08;四&#xff09; 【深度学习】注意力机制&a…

PCB设计规则中的经验公式_笔记

PCB设计规则中的经验公式 规则1 - 临界长度规则2 - 信号带宽与上升时间规则3- 时钟信号带宽规则4-信号传输速度规则5- 集肤 (效应) 深度规则6 - 50Ω传输线电容规则7 - 50Ω传输线电感规则8 - 回流路径电感规则9 - 地弹噪声规则10- 串行传输比特率与信号带宽规则11- PCB走线直流…

HR人才测评,招聘企业中高层管理的岗位胜任力测评方案

不管是哪一个企业&#xff0c;中高层管理都是企业的核心层&#xff0c;在对这部分人才进行测评方案制定的时候&#xff0c;则要更加细致谨慎一些&#xff0c;避免出现人才录用失误的情况。 中高层管理人员是公司的支柱&#xff0c;需要具备的素质主要偏向于管理能力、综合素质…