系统移植实践

        

目录

一、引言

二、系统移植概述

1、移植的定义

2、移植的目标

3、移植的原理

三、移植步骤

1、启动图

2、图解

 3、下载uboot到SD卡

 4、内核、根文件镜像下载

 5、uboot下载到MMC并以MMC方式运行

6、自启动下载内核镜像与共享根文件系统

7、移植思路 

四、结论


        摘要: 本文将介绍关于如何进行基于FS6818核心板的移植,包括移植的基本概念、步骤和常见问题等。通过这篇文章,大家可以了解到系统移植的基本原理和操作流程,并掌握一些实用的技巧和经验。 


一、引言

        系统移植的目标是将一个操作系统或软件从一个硬件平台成功地迁移到另一个硬件平台上,并确保其功能正常、性能优良。这样做的好处是能够充分利用新硬件的优势,提升系统的稳定性、安全性和性能。

        系统移植涉及到多方面的知识和技术,包括硬件架构、设备驱动程序、中断处理、文件系统、网络协议栈等。

二、系统移植概述

1、移植的定义

        系统移植是指将一套操作系统从一个硬件平台或操作系统移植到另一个目标硬件平台或操作系统的过程。在移植中,需要对原有的软件进行适当的修改和配置,以确保它能够在新的环境下正常运行,并能够满足需求。通常情况下,系统移植涉及到Bootloader、内核镜像、设备树、根文件系统等多个方面的准备工作。

2、移植的目标

        当你在使用一个单片机的时候,你写的程序都是裸机代码。什么叫裸机代码?

        不跑操作系统的代码就是裸机代码。那么对于裸机操作,是没有进程线程、时间片轮询调度、并发这些概念存在的。举个最简单的例子,你在Vmware里面写的一个应用层的代码,里面写了一个sleep函数,进程执行到这个函数时,该进程会让出CPU资源。也就是说,在多任务的情况下,CPU会去转去执行另外的任务,而不会出现CPU空转或者CPU死等的情况,而你在些单片机上去使用HAL_Delay函数的时候,你会发现CPU无法去执行别的事情,相当浪费CPU资源。

        当我们在板子的基础上,移植了一个操作系统,让它具备能同时通过时间片轮询多个任务,或者不再出现CPU空转、CPU死等的情况。 比如说当你在学单片机的时候,老师总是给你提FreeRTOS(嵌入式实时操作系统),这个到底是干嘛的,有什么作用?相信大家类比系统移植会有一定的认识。

        系统移植目标:

  1. 跨平台适用性:通过系统移植,使软件系统能够在不同的硬件平台或操作系统上运行。这可以使开发者将已有的软件技术应用到更广泛的硬件设备上,降低开发成本,并扩大产品的市场范围。

  2. 优化性能:针对目标平台的特点和资源限制,对软件系统进行优化,以提升系统的性能和响应速度。通过充分利用目标平台的硬件资源和优化算法,可以使系统在新的平台上达到更好的性能表现。

  3. 扩展功能:在移植过程中,可以根据目标平台的特性和需求,添加新的功能或模块,以增强软件系统的功能和灵活性。例如,将原本只支持单核处理器的系统移植到多核平台上,并充分利用多核资源实现并行计算等功能。

  4. 提高可移植性:通过移植工作,对软件系统进行必要的抽象和封装,以实现更好的可移植性。这使得软件系统能够更轻松地适应未来的硬件平台和操作系统的变化,提供更稳定和可靠的解决方案。

3、移植的原理

        系统移植是将一个操作系统或软件从一个硬件平台移植到另一个硬件平台上的过程。

        系统移植原理:

  1. 硬件适配:不同的硬件平台具有不同的处理器架构、设备接口和硬件资源,移植时需要根据目标平台的硬件特性进行修改和优化。通常需要编写或修改启动引导程序、设备驱动程序、中断处理程序等底层代码,以确保操作系统或软件能够正常启动并与硬件交互。

  2. 软件移植:软件移植是将源码或可执行文件从一个操作系统或编译环境移植到另一个操作系统或编译环境的过程。需要解决不同操作系统或编译环境下的兼容性问题,并进行相应的适配和调试。通常需要针对不同操作系统或编译器的差异进行修改和编译,确保软件能够在目标环境下正确运行。

  3. 接口适配:不同的操作系统或软件之间存在着不同的接口和通信协议,移植时需要将这些接口和协议适配到目标环境中。例如,针对不同操作系统的进程通信机制、文件系统接口、网络协议栈等进行适配和修改,以确保软件能够在目标环境中正确地与其他组件或应用程序进行交互。

三、移植步骤

1、启动图

        在移植操作系统前,先给大家看一张图(必须掌握)。

图3-1 开发板启动过程图

2、图解

        开发板上电后首先运行SOC内部iROM中固化的代码(BL0),这段代码先对基本的软硬件环境(时钟等...)进行初始化,然后再检测拨码开关位置获取启动方式,然后再将对应存储器中的uboot搬移到内存,然后跳转到uboot运行。

         uboot开始运行后首先对开发板上的软硬件环境做进一步初始化,然后将linux内核、设备树(dtb)、根文件系统(rootfs)从外部存储器(或网络)搬移到内存,然后跳转到linux运行。linux开始运行后先对系统环境做初始化,当系统启动完成后,Linux再从内存中(或网络)挂载根文件系统。

        通过识别拨码开关的位置,之后将对应SD卡或者EMMC读取程序到内存条上执行该程序。

图3-2 拨码开关图示

 3、下载uboot到SD卡

         对于此类操作,我们要先将uboot下载到SD卡中,选择以SD的方式启动,运行uboot。当你的uboot运行不成功的时候,出现的是如图3-3结果。

图3-3 uboot引导加载程序失败

        解决方法:1、查看拨码开关位置。2、检查拷贝到SD卡的uboot(引导加载程序)是否正确,制作的时候也要考虑支持的板子信号等。比如博主在制造uboot引导加载程序之前。先执行了

make fs6818_config(也就是指定当前使用的硬件平台)。然后再make(Makefile根据情况进行微小修改,比如改个目录什么的),稍等几十秒之后,出现如图3-4的情况,代表成功啦。

图3-4 ubootpak.bin制造成功

        

        uboot(Bootloader中的一类)作用:

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

        也就是说,当你uboot制造失败,或者启动不成功时,出现的如图3-3的白屏的情况。成功之后就可以正常启动啦,如图3-5。

图3-5 正常启动界面

 4、内核、根文件镜像下载

        启动之后,在倒计时之前进入交互界面,也就是相当于一个配置界面。你可以通过一些指令来设置这些环境变量(setenv 环境变量 环境变量的值),记得设置完保存(saveenv)。

图3-6 查看或设置环境参数

补充:需要将Windows、linux、开发板连到同一个网段,连到同一个网段那么就可以直接进行网络通信了。也就是说,Windows下,以及linux下的ip地址的设置,我没列出,相信大家都会,最后就是进入到图3-5这个界面设置开发板的ip地址以及服务器地址(Linux地址)。保证三者能进行通信,才可以使用后续的tftp(用于下载文件)、nfs(用于挂载、共享文件夹)。

详细说说这两个的作用:tftp用于可以用来下载服务器的一些文件什么的。

        tftp 0x41000000 uImage //这条语句就是通过tftp将内核镜像读取到内存0x41000000这个位置

        mmc write 0x41000000 0x800 0x4000 //将该内存位置的东西写到MMC永久保存下来,0x800代表起始位置,0x4000代表块大小。

        tftp 0x41000000 ramdisk.img //同上,再将文件系统镜像下载过来。

        mmc write 0x41000000 0x20800 0x20800 //同上mmc。

         通过以上操作之后,实现了将服务器目录下的那些文件下载了过来,先下载到内存条上,然后将内存条上的东西再写到磁盘永久保存了下来。也就是说硬件之上的内核(博主使用的包含设备树),根文件系统这三者都已经完成了。但是目前还存在两个问题:1、ubbot还没在MMC中。2、光拷过去有什么用啊?你肯定要设置一些参数什么的吧,不然你怎么让它执行那个位置呢?

 5、uboot下载到MMC并以MMC方式运行

紧接着:

        tftp 0x41000000 ubootpak.bin //将uboot也通过tftp从服务器下来过来。

        update_mmc 2 2ndboot 0x41000000 0x200 0x78000 //将读入内存条的东西也更新到MMC中

     setenv bootcmd mmc read 0x48000000 0x800 0x4000\;mmc read 0x49000000 0x20800 0x20800\;bootm 0x48000000 0x49000000   //设置自启动命令,从磁盘里面去读某一块区域到内存上(刚刚刚写到磁盘上的东西),然后就可以执行内存条上的东西。\;代表另一条指令,分多次指令嘛,相信大家读这条命令也会知道干了什么。

  setenv bootargs root=/dev/ram rw initrd=0x49000040,0x1000000 rootfstype=ext4 init=/linuxrc console=ttySAC0,115200 //设置相关环境参数。文件系统类型、串口传输什么的。

        saveenv 保存更改的环境变量

完成以上之后,就可以将拨码开关拨到MMC,也就是以读取磁盘方式打开,都配置好了,也就可以了。

6、自启动下载内核镜像与共享根文件系统

补充:你也可以通过自启动命令获取内核镜像,然后加载到内存中运行        

        setenv bootcmd tftp 0x48000000 uImage\;bootm 0x48000000 //自动下载内核镜像

  setenv bootargs root=/dev/nfs nfsroot=192.168.1.124:/opt/6818/rootfs/rootfs rw console=ttySAC0,115200 init=/linuxrc ip=192.168.1.120         //192.168.1.124是服务器ip地址。这句话主要重点是将这个ip地址下的/opt/6818/rootfs/rootfs挂载在板子上作为板子的根文件系统,板子ip是192.168.1.120

        saveenv  //保存

        对于补充的这个,很方便。直接自启动就完成了下载内核镜像,uboot早先已经下载到MMC中,所以你可以将拨码开关拨到MMC启动模式,也能自动运行起来,但是板子的根文件系统并没有制作,也就是说,你要在你的服务器端,也就是你要在linux下的/opt/6818/rootfs/rootfs这个路径下制作好根文件系统,板子才能实现挂载共享根文件系统。效果图如图3-7:

图3-7 成功启动uboot、启动内核、挂载根文件系统

图3-8 共享的该目录下的根文件系统

7、移植思路 

        针对以上操作,其实你只要知道一个思路(板子的执行顺序?CPU如何执行指令的?内存和磁盘的区别?):

        拿到一块板子,什么都没有,你要移植操作系统在其之上。大致怎么做?

  1. 制作好对应板子的uboot,对应板子的内核镜像,以及根文件系统。对于这些操作,去官网获取资源,然后只需要简单的修改,将其做好就行。
  2. 引导加载程序(Bootloader)移植:上电运行完BL0(板子自带的)之后,运行的第一个就是uboot,所以,将这个东西拷到SD卡中,然后以SD方式打开。就能进入那些配置环境信息的界面了。这个是一个交互界面,顾名思义,你可以输入命令配置环境嘛。
  3. 内核移植:在交互界面,通过tftp下载内核镜像到内存条,然后可以写到MMC,也可以设置自启动模式,自动下载到内存条,然后自动运行。
  4. 文件系统移植:内核移植成功之后,那么之后紧接着就可以挂载服务器的某一个目录实现板子和服务器的文件夹共享。既然板子是共享的linux下的某个目录,这个目录作为板子的根文件系统,那么你肯定不是一个简简单单的文件夹啊,不然板子怎么启动的了呢,怎么能出现图3-7的效果呢。
  5. 思考完那三个问题之后,其实系统移植就想得通透了。
    1. 板子执行BL0-》uboot(SD卡中或者是MMC中的)-》内核启动-》根文件系统挂载。
    2. 为什么有些指令是先读到内存条?CPU执行指令要去内存去读嘛,又不能直接访问磁盘或者SD卡。
    3. 为什么有些东西放到磁盘?有些放到内存就行?磁盘永久保存嘛,内存掉电就没了。

四、结论

        系统移植掌握基本的步骤,需要的那几个uboot、内核镜像、设备树、根文件系统等。把理论知识掌握,不同的板子以上的东西会有所小变动,但是原理都是如此。所以背下这些东西是没有用的,你要知道每一步都在干什么,为什么这样做。

        希望以上内容对你有所帮助!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式小企鹅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值