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…...

STM32时钟配置图详解
一图概述: 左侧输入时钟源 Input Frequency (LSE/LSI/HSI/HSE) LSE (Low-Speed External):外部32.768 kHz晶体振荡器,通常用于RTC(实时时钟)。LSI (Low-Speed Internal):内部低速时钟,频率为…...

Vscode——调试时,修改变量值
第一步:点击变量,鼠标右键 第二步:点击 设置值...

1. 初识LLM API:环境配置与多轮对话演示
其实AI应用并不是一个什么很高大上的东西,你可以将它当作一个文字的“调库”行为,“调库”只需要知道库名就行了,这里实际也是如此。甚至你只需要知道你想问什么,将你的消息作为输入,就能从大模型得到输出。而这个“库…...

【AI编程助手】VsCode插件--通义灵码
目录 摘要 一、插件安装 二、“通义灵码” 使用 三、官网教程 四、总结 五、参考信息 摘要 通义灵码是一款强大的 AI 编程助手。它能够理解编程相关的复杂逻辑,为开发者提供高效、准确的代码生成与优化建议。在编程过程中,它可以辅助处理各种任务&…...

9月10号的学习
//界面1 头文件 signals://界面1的自定义信号void my_signal(); private slots:void on_pushButton_2_clicked();void on_pushButton_clicked(); //界面1 .cpp文件 void Widget::on_pushButton_2_clicked() {QMessageBox msg(QMessageBox::Warning,"警告","是否…...

QtC++截图支持窗口获取
介绍 在截图工具中你会发现,接触到窗口后会自动圈出目标窗口,个别强大一点的还能进行元素识别可以自动圈出元素,那么今天简单分析一下QTc如何获取窗口并圈出当前鼠标下的窗口。 介绍1.如何获取所有窗口2.比较函数3.实现窗口判断 结尾 1.如何获取所有窗口…...

料品档案没有配置主供应商信息
这个问题经常会出现在普通用户的面前。没有合适的工程人员去打理料品档案。信息是缺漏的。用友给出来的提示,也让人摸不着头脑。只能是记下来备用吧。...

springboot属性加载优先级和常见命令行属性
属性加载优先级: 1.SpringApplication:启动的main方法里注入的属性 2.PropertySource:通过注解 加载的数据配置文件 3.Config data file:application.yml/.properties 4.OS environment variable:环境变量 5.Command l…...

Math Reference Notes: 因式定理
文章目录 1. 因式定理的定义2. 因式定理的数学表达:3. 因式定理的推导4. 因式定理的含义5. 因式定理的应用6. 因式定理与余式定理的关系7. 因式定理的应用领域8.因式定理的局限性 因式定理是多项式代数中的一个重要工具,帮助我们通过多项式的根来因式分解…...

Kubernetes------Service
目录 一、属性说明 二、定义和基本配置 1、定义 2、创建Service 2.1、typeClusterIP 2.2、typeNodePort 2.3、固定IP访问 三、Service、EndPoint、Pod之间的关系 四、服务发现 1、基于Service中IP访问外部服务 2、基于Service中域名访问外部服务 五、Ingress的安装和使…...