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操作系统的表示层协议

OSITCP/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目录中可以找到;在实际的嵌入式开发中,这种方式经常会用到,很方便。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt-常用控件(3)-多元素控件、容器类控件和布局管理器

1. 多元素控件 Qt 中提供的多元素控件有: QListWidgetQListViewQTableWidgetQTableViewQTreeWidgetQTreeView xxWidget 和 xxView 之间的区别,以 QTableWidget 和 QTableView 为例. QTableView 是基于 MVC 设计的控件.QTableView 自身不持有数据,使用 QTableView 的…

欧拉系统安装 NVIDIA 显卡驱动

1、安装显卡驱动编译工具 yum install gcc make kernel-devel 2、安装显卡驱动依赖包 yum install vulkan-loader 可选安装项,不安装该系统包时会出现以下警告提示,但不影响安装和使用。 3、安装 NVIDIA GPU 驱动 生产环境建议选择 .run 格式的驱动…

Autoware 定位之初始姿态输入(九)

0. 简介 这一讲按照《Autoware 技术代码解读(三)》梳理的顺序,我们来说一说Autoware中的初始化操作,这个软件包当中完成了ekf_localizer发送初始姿态的包。它接收来自GNSS/用户的粗略估计的初始姿态。将姿态传递给ndt_scan_match…

[数据集][目标检测]石油泄漏检测数据集VOC+YOLO格式6633张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):6633 标注数量(xml文件个数):6633 标注数量(txt文件个数):6633 标注…

解决Django会话中的竞态条件

Django 会话中的竞态条件(race condition)问题通常发生在多个请求几乎同时修改同一个会话数据时,导致数据丢失或数据不一致。这种情况在需要频繁更新会话数据的场景(如实时聊天应用、并发请求处理等)中尤为常见。 1、问…

CentOS 7 docker 部署遇到内网通,外网不通 问题

CentOS 7 docker 部署遇到内网通,外网不通 问题 [rootlocalhost ~]# systemctl status network ● network.service - LSB: Bring up/down networkingLoaded: loaded (/etc/rc.d/init.d/network; bad; vendor preset: disabled)Active: failed (Result: exit-code) …

9-6springboot该如何学习

这阶段如何学习 javase:面向对象OOP mysql:持久化 htmlcssjsjquery框架:视图(框架不熟练),css不好 javaweb:独立开发MVC三层架构的网站:原始 ssm:框架:简化了我们的…

2-1 opencv实战进阶系列 阈值编辑器

目录 一、不说废话,先上现象 二、前言 三、方法详解 四、贴出完整代码 一、不说废话,先上现象 二、前言 对图像的处理中,设置合适的掩膜、寻找多边形、颜色追踪等方法都需要预先设置好颜色的上阈值和下阈值,来从原图中分割出…

C++11线程池、多线程编程(附源码)

Test1 示例源码展示&#xff1a; #include<iostream> #include<thread> #include<string> using namespace std;void printHelloWord(string s) {cout << s << endl;//return; } int main() {string s;s "wegfer";thread thread1(p…

贷款利率高低跟什么有关?仅凭身份证就能贷到款?额度是多少?

在金融的广阔舞台上&#xff0c;借款人的“信用基石”——即其综合资质&#xff0c;是决定贷款利率高低的决定性因素。这并非偶然&#xff0c;而是银行基于详尽的风险评估与收益预期所做出的精准判断。 需明确的是&#xff0c;贷款的易得性并不意味着无门槛的放任。它更像是设置…

资料分析笔记(花生)

preparation 资料分析首先最重要的是时间/时间段分小互换 一、速算技巧 加法技巧 1.尾数法 在多个数字精确求和或求差时&#xff0c;从“尾数”入手&#xff0c;为保证精确与速度&#xff0c;一般可观察两位。 求和题目中&#xff0c;若四个选项中后两位都不同&#xff0c;…

通信工程学习:什么是SSB单边带调制、VSB残留边带调制、DSB抑制载波双边带调制

SSB单边带调制、VSB残留边带调制、DSB抑制载波双边带调制 SSB单边带调制、VSB残留边带调制、DSB抑制载波双边带调制是三种不同的调制方式&#xff0c;它们在通信系统中各有其独特的应用和特点。以下是对这三种调制方式的详细解释&#xff1a; 一、SSB单边带调制 1、SSB单边带…

WebAPI (一)DOM树、DOM对象,操作元素样式(style className,classList)。表单元素属性。自定义属性。间歇函数定时器

文章目录 Web API基本认知一、 变量声明二、 DOM1. DOM 树2. DOM对象3. 获取DOM对象(1)、选择匹配的第一个元素(2)、选择匹配多个元素 三、 操作元素1. 操作元素内容2. 操作元素属性(1)、常用属性&#xff08;href之类的&#xff09;(2)、通过style属性操作CSS(3)、通过类名(cl…

ctfshow-php特性(web123-web150plus)

​web123 <?php error_reporting(0); highlight_file(__FILE__); include("flag.php"); $a$_SERVER[argv]; $c$_POST[fun]; if(isset($_POST[CTF_SHOW])&&isset($_POST[CTF_SHOW.COM])&&!isset($_GET[fl0g])){if(!preg_match("/\\\\|\/|\~|…

基于大数据的科研热点分析与挖掘系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 科研活动的快速发展产生了大量的学术文献&#xff0c;如何从这些文献中提炼出有价值的科研热点和趋势成为了一个重要的问题。本项目旨在开发一个基于大数据的科研热点分析可视化系统&#xff0c;采…

Differential Diffusion,赋予每个像素它应有的力量,以及在comfyui中的测试效果

&#x1f97d;原论文要点 首先是原论文地址&#xff1a;https://differential-diffusion.github.io/paper.pdf 其次是git介绍地址&#xff1a;GitHub - exx8/differential-diffusion 感兴趣的朋友们可以自行阅读。 首先&#xff0c;论文开篇就给了一个例子&#xff1a; 我们的方…

Redis 事务:支持回滚吗?深入解析

今天我们要来探讨一个关于 Redis 事务的重要问题&#xff1a;Redis 事务支持回滚吗&#xff1f;这个问题在 Redis 的使用中经常被提及&#xff0c;对于正确理解和使用 Redis 事务至关重要。那么&#xff0c;让我们一起深入解析这个问题吧&#xff01; 一、Redis 事务简介 在了…

tabBar设置底部菜单选项以及iconfont图标

tabBartabBar属性:设置底部 tab 的表现 ​ ​ ​ ​ 首先在pages.json页面写一个tabBar对象,里面放入list对象数组,里面至少要有2个、最多5个 tab, 如果只有一个tab的话,H5(浏览器)依然可以显示底部有一个导航栏,如果没有,需要重启后才有,小程序则报错,只有2个以上才可以…

IDEA加载工程报错Error Loading Project: Cannot load module demo.iml解决

spring boot工程由于工程名字为demo不太好&#xff0c;直接更改了这个工程的名字&#xff0c;主要操作了包括重命名项目文件夹、修改IDEA中的项目名称、模块名称、包名称、以及相关的配置文件等。 然后再打开工程&#xff0c;报错Error Loading Project: Cannot load module de…

瑜伽馆预约系统小程序搭建,全民健身下的市场机遇

随着现代生活水平的提高&#xff0c;人们对健康的要求逐渐提高&#xff0c;瑜伽作为一种修身养性的健身方式&#xff0c;深受大众欢迎。在互联网小程序的普及下&#xff0c;瑜伽馆预约小程序也成为了市场的必然发展趋势&#xff01; 为什么要开发瑜伽馆预约系统&#xff1f; 瑜…