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…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
