Linux_kernel移植uboot07
一、移植
根据硬件平台的差异,将代码进行少量的修改,修改过后的代码在目标平台上运行起来
移植还需要考虑硬件环境,驱动只需要考虑内核的环境
二、移植内容
1、移植Uboot
uboot属于bootloader的一种,还有其他的bootloader,如:arm-boot、red-boot、uboot、pmon、uefi
bootloader是系统上电之后执行的第一个系统软件,负责初始化硬件,负责加载引导操作系统。
2、移植Linux内核
1)获取Linux内核源码
官网: The Linux Kernel Archives
2)板子上操作系统与不上操作系统的区别
优点:可以更容易的实现较为复杂的业务逻辑
缺点:硬件的成本很高
3)Linux内核的核心功能
【1】进程间通信
管道:命名管道、匿名管道
[a]通信方式
匿名管道:半双工的,同一时刻数据只能使用一种方式流动,用于有亲缘关系的进程间通信
命名管道:支持双向通信,允许非亲缘关系的进程间通信(包括亲缘关系)
[b]通信方式
匿名管道:pipe(2)
命名管道:mkfifo(2)
[c]存在形式
匿名管道:不是文件,是kernel中的一段buffer
命名管道:是文件,在linux文件系统中以p表示
[d]生命周期
匿名管道:当调用pipe(2)时创建,当调用进程结束时,pipe被销毁了
命名管道:当调用mkfifo(2)时创建,当调用进程结束时,fifo文件依然存在
SYS V IPC:消息队列、共享内存、信号量
【2】进程间的管理
给当前进程分配多少个时间片,给当前进程分配多少内存
【3】虚拟文件子系统
【4】网络子系统
【5】内存管理子系统
早期的内核版本:2.6版本(Red Hat4)
开发板中使用的内存版本是3.4版本
企业中使用最多的是4.19、5.10
3、移植根文件系统
1号进程[init]对应的程序就是根文件系统

根文件系统里面包含一些命令,例如
ls、cd、touch、rm。。。
我们可以通过busybox工具制作根文件系统,它已经集成了上述命令。
4、总结
移植三大系统软件,包括:
| 【1】移植uboot | 对应固件工程师(固化到硬件里的软件程序) | 例如:ESP8266WiFi模块,内部集成了TCP/UDP协议栈,是由乐鑫公司固件工程师实现的 |
| 【2】移植Linux内核 | 对应Linux内核工程师 | |
| 【3】移植根文件系统 | 对应系统集成开发工程师 |
5、目标
【1】熟悉uboot的源码,掌握uboot的编译方式
【2】掌握Linux源码的框架结构,掌握Linux内核裁剪方式,掌握Linux内核编译过程
【3】掌握根文件系统镜像的制作
三、开发板烧写
擦除emmc,并对其进行分区
1、实验前准备
【1】uboot
【2】Linux内核
【3】根文件系统的镜像
2、新建一个实验文件夹
mkdir s5p6818
3、将所需文件拷贝至实验文件
cp ubootpak.bin ~/s5p6818/
cp fastboot/uImage ~/s5p6818/
cp fastboot/rootfs_ext4.img ~/s5p6818/

4、查看各文件大小,便于分区
1)查看uboot(引导内核)
du -h ubootbinpak.bin

看到ubootpak.bin只有336K,不到1Mb,可以在emmc开头位置分1Mb的空间给uboot
2)查看uImage(内核)
du -h uImage

看到uImage有5.2Mb,但我们将来需要裁剪,并且还要添加很多的驱动模块,所以给内核分大一些,分64Mb
3)查看rootfs(根文件系统)
du -h rootfs_ext4.img

看到rootfs有100Mb,我们给它分大一些,比如800Mb
5、关于EMMC的分区
三星公司对于第二启动设备(EMMC)的分区有一个指定的命名
第一分区:mmcblk0p1
第二分区:mmcblk0p2
第三分区:mmcblk0p3
注意:
我们在烧录的时候,需要按照扇区进行烧写,1扇区=512byte
因为EMMC是一个硬盘,是一个块设备,需要用字节进行操作,需要按照扇区进行烧录
1】在擦除之前保证下位机可以ping通上位机
2】保证全过程开发板不断电
3】把SD卡拔掉
ps:如果失败,需要把之前的步骤重新来一遍

6、擦除emmc分区
mmc erase 0 0x100000
注释:
0:要擦除的起始块
0x100000:要擦出的字节数
7、对emmc进行分区
fdisk 2 3 0x100000:0x4000000 0x4100000:2f200000 0x33300000:0
注释:
2表示第二个启动设备(EMMC)
3表示分区个数
第一个参数表示每个分区的起始地址
第二个参数表示分区的字节大小
8、烧写uboot
1)上位机把ubootpak.bin拷贝到tftp共享目录
cp ubootpak.bin /tftpboot/
md5sum ubootpak.bin
md5sum /tftpboot/ubootpak.bin
//通过md5sum命令计算校验文件的MD5校验码,来确定是否拷贝成功
2)下位机下载uboot
tftp 0x48000000 ubootpak.bin
注意:
这是将ubootpak.bin通过tftp方式下载到了开发板的内存中,将来需要更新到EMMC中
下载了多少个字节,将来就更新多少个字节
3)下位机更新EMMC
update_mmc 2 2ndboot 0x48000000 0x200 0x53ba8
注释:
update_mmc:更新emmc命令
2:设备号
2ndboot:第二启动设备
0x48000000:从内存的0x48000000位置开始读取
0x200:从emmc的200个字节开始更新
0x53ba8:更新的字节数(下载了多少字节,就更新多少字节)
4)下位机的ip地址
烧写完之后,需要重新更改下位机的ip地址
setenv ipaddr 192.168.1.6
setenv serverip 192.168.1.8
saveenv
9、烧录uImage
1)上位机把uImage拷贝到tftp共享目录
cp uImage /tftpboot/
md5sum uImage
md5sum /tftpboot/uImage
//通过md5sum命令计算校验文件的MD5校验码,来确定是否拷贝成功
2)下位机下载uImage
tftp 0x48000000 uImage
注意:
这是将uImage通过tftp方式下载到了开发板的内存中,将来需要更新到EMMC中
下载了多少个字节,将来就更新多少个字节
3)下位机写emmc
mmc write 0x48000000 0x800 0x3000
注释:
mmc write:往emmc中写数据指令
0x48000000:从内存的0x48000000位置开始读取
0x800:从emmc的0x800个扇区的位置开始写
0x3000:要写的扇区数(可以比实际下载的大小大一些)
4)修改bootcmd环境变量
需要修改环境变量bootcmd,告诉uboot去哪里加载Linux内核
setenv bootcmd mmc read 0x48000000 0x800 0x3000\;bootm 0x48000000
注释:
mmc read:从硬盘读
0x48000000:读到内存的0x48000000地址中
0x800:从硬盘的第0x800扇区读
0x3000:连续读0x3000个扇区
\:连续符
bootm 48000000:自动从48000000位置启动内核
saveenv
a、烧录根文件系统
1)上位机把rootfs_ext4.img拷贝到tftp共享目录
cp rootfs_ext4.img /tftpboot/
md5sum rootfs_ext4.img
md5sum /tftpboot/rootfs_ext4.img
//通过md5sum命令计算校验文件的MD5校验码,来确定是否拷贝成功
2)下位机下载rootfs_ext4.img
tftp 0x48000000 rootfs_ext4.img
注意:
这是将rootfs_ext4.img通过tftp方式下载到了开发板的内存中,将来需要更新到EMMC中
下载了多少个字节,将来就更新多少个字节
3)下位机写emmc
mmc write 0x48000000 0x20800 0x32000
注释:
mmc write:往emmc中写数据指令
0x48000000:从内存的0x48000000位置开始读取
0x20800:从emmc的0x20800个扇区的位置开始写
0x32000:要写的扇区数(可以比实际下载的大小大一些)
4)修改bootargs环境变量
需要修改环境变量bootargs,告诉Linux内核去哪里挂载根文件系统,以什么样的方式挂载根文件系统
setenv bootargs root=/dev/mmcblk0p2 rootfstype=ext4 console=ttySAC0,115200 maxcpus=1 lcd=wy070ml tp=gslx680
注释:
root=/dev/mmcblk0p2:从EMMC的第二个分区找根文件系统
rootfstype=ext4:根文件系统的类型
console=ttySAC0,115200:用来设置控制终端
maxcpus=1:单CPU模式
lcd=wy070ml:指定LCD先视频的型号
tp=gslx680:指定TS触摸屏的型号
saveenv
四、通过nfs的方式挂载根文件系统
nfs的网络服务(Network File System)是由SUN公司研制的UNIX操作系统的表示层协议
| OSI | TCP/IP |
| 应用层 | 应用层 |
| 表示层 | |
| 会话层 | |
| 传输层 | 传输层 |
| 网络层 | |
| 数据链路层 | 数据链路层 |
| 物理层 | 物理层 |
我们不把根文件系统放到开发板的EMMC中,而是将下位机的根文件系统部署在上位机中,这样做的好处:
【1】可以直接在上位机中修改下位机的根文件系统的内容
【2】不需要再重复的往下位机的EMMC中烧录根文件系统,延长EMMC的寿命
1、在PC机中配置nfs服务
sudo apt-get install nfs-kernel-server
sudo mkdir /nfs_share
sudo chmod 777 /nfs_share
tar -xvf rootfs_qt.tar.bz2 -C /nfs_share
/*修改nfs的配置文件*/
/*修改nfs的服务文件*/
2、修改nfs的配置文件
sudo vim /etc/exports
(在exports文件中直接添加内容)
/nfs_share/rootfs *(rw,sync,no_root_squash)
注释:
/nfs_share/rootfs 共享目录的绝对路径
* 所有ping通服务器的用户
rw 用户在访问时可读可写
sync 同步
no_root_squash 不会对于root用户降级
3、 修改nfs的服务文件
sudo vim /etc/default/nfs-kernel-server
(在文件中直接添加内容)
RPCNFSDOPTS="--nfs-version 2,3,4 --debug --syslog"
/*保存退出,重启nfs服务*/
sudo service nfs-kernel-server restart
/*关闭防火墙*/
sudo service ufw stop
4、 修改下位机的bootargs环境变量
setenv bootargs root=/dev/nfs
nfsroot=192.168.1.8:/nfs_share/rootfs ip=192.168.1.6:192.168.1.8:192.168.1.1:255.255.255.0
init=/linuxrc
console=ttySAC0,115200
maxcpus=1
lcd=wy070ml
tp=gslx680-linux
注释:
root=/dev/nfs:说明根文件系统不在本地,在网络上
nfsroot=192.168.1.8:/nfs_share/rootfs:说明根文件系统在nfs服务器上的具体位置
ip=192.168.1.6:192.168.1.8:192.168.1.1:255.255.255.0:设置根文件系统的ip信息
(本地ip,服务器ip,网关,子网掩码)
init=/linuxrc:执行init进程初始化文件
console=ttySAC0,115200:设置控制终端
maxcpus=1:单CPU模式
lcd=wy070ml:指定LCD显示屏的型号
tp=gslx680-linux:指定TS触摸屏的型号
5、总结
用户名:root
密码:123456
由于是挂载的根文件系统,所以PC机在/nfs_share目录中创建的文件,在开发板的根中可以找到;在开发板的根中创建的文件,在PC机的/nfs_share目录中可以找到;在实际的嵌入式开发中,这种方式经常会用到,很方便。
相关文章:
Linux_kernel移植uboot07
一、移植 根据硬件平台的差异,将代码进行少量的修改,修改过后的代码在目标平台上运行起来 移植还需要考虑硬件环境,驱动只需要考虑内核的环境 二、移植内容 1、移植Uboot uboot属于bootloader的一种,还有其他的bootloader&#x…...
Day-04-QFile打开文件的两种方式
一、UI界面设置两个按键,并直接转到槽函数 二、两种代码展示 #include <QFile> #include <QDebug>//此两种方式中调用函数,应包含的头文件void Widget::on_btnReadFile01_clicked()//第一种打开方式 {//1. 打开文件QFile file;file.setFile…...
第三部分:4---进程地址空间
目录 数组的空间分配解析: 物理地址和虚拟地址: 虚拟地址空间: 进程地址空间的本质: 为什么要有进程地址空间? 页表对进程访问内存的检查: 进程地址空间和页表如何关联起来? 进程的独立…...
【Android】程序开发组件—探究Jetpack
引言 Jetpack是一个开发组件工具集,它的主要目的是帮助我们编写出更加简洁的代码,并简化我们的开发过程,在这么多的组件当中,最需要我们关注的其实还是架构组件,接下来就对Jetpack的主要架构组件进行学习!…...
pytorch torch.norm函数介绍
torch.norm 函数用于计算张量的范数(norm),可以理解为张量的“长度”或“大小”。根据范数的不同类型,它可以衡量不同的张量性质。该函数可以计算 向量 和 矩阵 的多种范数,如 L1范数、L2范数、无穷范数 等。 1. 函数…...
【lc_hot100】刷题心得
链表 二叉树 二叉树相关的题目基本都有个基本的框架,基本框架就是二叉树的四种遍历方法:前序遍历、中序遍历、后序遍历、层序遍历 往往常用的是前序遍历和中序遍历 图 图跟二叉树一样都有自己的的基本框架,基本框架就是图的两种遍历方法&am…...
FANUC 数控 A06B-6058-H227 伺服放大器
发那科伺服放大器是一种控制电机的电子装置,属于电机控制系统的一部分,用于将输入信号放大并转换成电动机可以理解的信号,从而实现运动控制和定位。 发那科伺服放大器的主要作用包括: 实现运动控制:通过控制…...
Python将表格文件中某些列的数据整体向上移动一行
本文介绍基于Python语言,针对一个文件夹下大量的Excel表格文件,对其中的每一个文件加以操作——将其中指定的若干列的数据部分都向上移动一行,并将所有操作完毕的Excel表格文件中的数据加以合并,生成一个新的Excel文件的方法。 首…...
基于YOLOv8的PCB缺陷检测算法,加入一种基于内容引导注意力(CGA)的混合融合方案(一)
💡💡💡本文内容:针对基于YOLOv8的PCB缺陷检测算法进行性能提升,加入各个创新点做验证性试验。 1)提出了一种基于内容引导注意力(CGA)的混合融合方案,mAP0.5由原始的0.966提升至0.975 1.PCB缺陷…...
如何在红米手机中恢复已删除的照片?(6 种方式可供选择)
凭借出色的相机和实惠的价格,小米红米系列已成为全球知名品牌。但是,最近有些人抱怨他们在 红米设备上丢失了许多珍贵的图片或视频,并希望弄清楚如何从小米手机恢复已删除的照片。好吧,在小米设备上恢复已删除的视频/照片并不难。…...
嵌入式实时操作系统(RTOS):原理、应用与发展
摘要:本文围绕嵌入式实时操作系统(RTOS)展开。首先介绍嵌入式系统与实时操作系统的概念,阐述嵌入式 RTOS 的体系结构。接着分析其关键特性,包含任务管理(如任务的创建与删除、调度、同步与通信)…...
C#里使用位图容器BitArray
由于经常需要操作一些位表示的数据结构,那么就需要采用位图的管理方式。 在C#里就是使用BitArray来管理位图数据结构,这样就比较方便处理。 这个类可以有多种构造函数,可以满足绝大部分的要求。 比如从网络协议里传送过来的字节流,就可以直接写入到里面,就可以直接获取…...
如何在 Kali Linux 上安装 pip3
如何在 Kali Linux 上安装 pip3 在 Kali Linux 上安装 pip3 的过程非常简单。按照以下步骤,你可以轻松完成安装并开始使用 pip3 管理 Python 软件包。 步骤 1:打开终端 首先,打开你的 Kali Linux 终端。 步骤 2:更新软件包列表…...
5.2 排列与代数余子式
一、求行列式的方法 计算机是利用主元计算行列式的。本节介绍其它两种计算行列式的方法。一是 “大公式”(big formula),它使用了全部 n ! n! n! 个排列计算;二是 “代数余子式公式”(cofactor formula)&…...
java框架第五课(终极版本)SpringBoot
一.关于SpringBoot (1)回忆Spring 传统的Spring由Spring 框架(ioc,aop)加mybatis加Springweb组成,虽然相比原生的java程序Spring框架帮我们大大减少了代码量,减少了冗余,提高了开发效率但是由于Spring框架下的配置和相关的jar包依赖过多&am…...
聚类案例——汽车是否值得购买
对汽车是否值得购买,进行聚类分析: 1、数据指标解释: buying, 购买费用 maint, 维修费用 doors, 车门数量 person, 乘坐人数 lug_boot, 行李箱容量 safety, 安全性 2、对数据进行转换 将字符串转换映射量化为数字 数据加载:…...
网络编程9.10
使用数据库完成工人管理系统: ubuntuubuntu:DB$ ubuntuubuntu:DB$ cat 2.c #include <myhead.h> #include <sqlite3.h> #include <string.h>typedef struct {int id;char name[20];double salary; } Worker;int do_insert(sqlite3 *ppDb) {Worker work;pri…...
如何在SQL Server中恢复多个数据库?
一次性恢复多个 SQL数据库吗可以吗? "是的,可以一次性恢复多个 SQL 数据库。通常情况下,只要备份文件的名称与相应的数据库匹配,且没有附加的日期或时间信息,就可以通过有效的 T-SQL 脚本来完成恢复。如果你希望…...
炸裂!新版 SD WebUI Forge 出图速度更快!支持最新Flux 模型!(保姆级安装教程)
大家是不是经常为SD WebUI卡顿、爆显存而苦恼?一启动SD 电脑就开始发烫, 尤其低显存用户屡屡"中招",不得不一遍遍重启。作为AI绘画的必备工具,WebUI却还有这么多"坑",着实让人不爽!😠 好消息是,…...
laserOdometry.cpp源码注释
本博客用于a-loam源码学习,用于和slam初学者一起学习。 #include <cmath>#include <nav_msgs/Odometry.h>#include <nav_msgs/Path.h> //这两行代码是C中包含头文件的指令,它们用于在ROS(Robot Operating System…...
Lattice FPGA开发实战:Diamond与ModelSim协同仿真环境搭建全攻略
1. 环境准备:软件安装与基础配置 第一次接触Lattice FPGA开发时,最头疼的就是仿真环境的搭建。我清楚地记得去年接手MachXO2项目时,光是让Diamond和ModelSim这两个"老伙计"协同工作就折腾了整整两天。不过别担心,跟着我…...
【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(五)- 动态配置与性能优化实战(vsetvli/vsetivli/vsetvl)
1. 动态向量配置指令的核心作用 RISC-V向量扩展指令集中最精妙的设计之一,就是允许程序运行时动态调整向量处理参数的机制。想象你正在用不同尺寸的螺丝刀组装家具——当遇到大螺丝就换大号刀头,碰到小螺丝立即切换精密刀头,这就是vsetvli/vs…...
计算机毕业设计:汽车数据可视化与后台管理平台 Django框架 requests爬虫 可视化 车辆 数据分析 大数据 机器学习(建议收藏)✅
博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立软件开发工作室,专注于计算机相关专业项目实战6年之久,累计开发项目作品上万套。凭借丰富的经验与专业实力,已帮助成千上万的学生顺利毕业,…...
别死记硬背了!用Python的NumPy库,5分钟搞定线性代数里的矩阵运算(附代码)
用Python的NumPy库轻松玩转线性代数:矩阵运算实战指南 线性代数作为现代科学与工程的基石,在机器学习、计算机图形学、量化金融等领域无处不在。但传统教材中抽象的数学符号和繁琐的手工计算,往往让学习者望而生畏。今天,我们将用…...
python基于微信小程序的家政服务与互助平台
目录技术栈选择功能模块设计数据库设计接口开发小程序前端部署与测试安全与合规项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作技术栈选择 后端采用Python的Django或Flask框架,提供RESTful API接口。数据库使用MyS…...
Zotero文献管理终极指南:从混乱到高效的研究工作流
Zotero文献管理终极指南:从混乱到高效的研究工作流 【免费下载链接】zotero Zotero is a free, easy-to-use tool to help you collect, organize, annotate, cite, and share your research sources. 项目地址: https://gitcode.com/gh_mirrors/zo/zotero Z…...
translategemma-27b-it入门必看:Gemma3轻量化设计如何平衡精度与推理速度
translategemma-27b-it入门必看:Gemma3轻量化设计如何平衡精度与推理速度 本文深度解析基于Gemma 3构建的TranslateGemma-27B-IT模型,通过实际部署演示展示其如何在保持翻译精度的同时实现高效推理,为开发者提供完整的入门指南。 1. 认识Tran…...
突破性解决方案:3步解决Calibre中文路径乱码,实现100%原生中文支持
突破性解决方案:3步解决Calibre中文路径乱码,实现100%原生中文支持 【免费下载链接】calibre-do-not-translate-my-path Switch my calibre library from ascii path to plain Unicode path. 将我的书库从拼音目录切换至非纯英文(中文&#x…...
Hutool CronUtil实战:5分钟搞定Spring Boot定时任务(含动态任务配置)
Hutool CronUtil实战:5分钟搞定Spring Boot定时任务(含动态任务配置) 在Java开发领域,定时任务几乎是每个项目都绕不开的基础需求。传统方案如Spring Scheduler虽然简单易用,但在动态任务管理和细粒度控制方面往往力不…...
SDMatte镜像结构详解:/opt/sdmatte-web目录布局与模型路径规范说明
SDMatte镜像结构详解:/opt/sdmatte-web目录布局与模型路径规范说明 1. 镜像概述 SDMatte 是一款面向高质量图像抠图场景的AI模型,特别适合处理以下任务: 商品图主体分离透明物体提取(如玻璃器皿、薄纱等)复杂边缘精…...
