掌桥专利:专业的专利平台
掌桥专利
首页

一种基于多核ARM的Linux实时改造方法

文献发布时间:2023-06-19 11:42:32


一种基于多核ARM的Linux实时改造方法

技术领域

本发明属于嵌入式实时领域,是一种基于多核ARM的Linux实时改造方法。根据目前主流的Linux实时改造技术,基于64位的多核ARM的开发平台,采用较新的内核版本,实现了实时系统环境的搭建,通过实验对比分析为64位ARM平台选择更适合的改造技术,为64位ARM实时系统搭建提供了方法,同时利用多核的优势,通过Linux内核特性control groups实现CPU资源的隔离与绑定,达到应用程序更好的实时性。

背景技术

嵌入式系统诞生于微型机时代,嵌入式系统的嵌入性本质是将一个计算机嵌入到一个对象体系中以实现对象的智能化控制,因此,它有着与通用计算机系统完全不同的技术要求与技术发展方向。嵌入式操作系统是最重要的系统软件,它的任务是针对有关整个系统内部的各个硬件及软件资源进行合理的调配,为用户提供一个良好的工作环境。在实际应用中,某些特定环境下嵌入式产品对操作系统的实时性要求是相对比较苛刻的,这样对搭载在产品上的嵌入式系统本身的多任务、抢占调度、任务间的通讯与同步、任务与中断之间的通信等方面就提出了实时性处理的要求。

随着计算机技术发展,以及大量新的计算机应用领域的出现,人们对计算机处理器性能提出了更高的要求,而单核处理器的性能遇到了瓶颈。为此,芯片生产公司争相研发和推出多核架构处理器。在嵌入式系统硬件方面,ARM以其高性能、廉价、低功耗的RISC处理器不断的取得突破,体系结构也越来越丰富,为嵌入式产品开发和创新提供了强有力的支撑。

目前正在开发的嵌入式系统中,有近50%的项目选择Linux作为嵌入式操作系统。Linux操作系统是一个免费的、开源的、可裁剪的、可移植的、应用广泛且安全可靠的操作系统,仅需提高其实时性即可用于工业控制领域。Linux2.6版内核开始支持可抢占式任务调度,此后随着低延迟补丁、CFS调度器、优先级继承、高精度时钟系统等改进技术进入Linux主线版本,Linux的实时性不断的提高。Linux虽然还是一个分时操作系统,但是它已经可以支持很多实时处理的特性,如符合POSIX标准的调度策略、实时信号机制等特性,所以对Linux进行实时性研究具有充分的可行性和重要的实际意义。

发明内容

本发明是基于多核ARM的Linux实时改造方法,方法主要包括搭建实时系统环境、两种改造技术实验对比、用户态屏蔽方案设计。

本发明采用了如下的技术方案及实现步骤:

1.实时系统的搭建

实时操作系统专门用于在时间约束条件下运行时间敏感的应用程序,中国市场对RTOS有很广泛的需求。从二十世纪90年代开始,实时操作系统在嵌入式系统领域里逐渐占据主导地位。不论是嵌入式实时领域还是实时工业控制领域,都离不开实时操作系统。本发明中对实时系统的搭建如图1所示。

在宿主机x86架构的系统中下载交叉编译器,对下载的引导程序源码进行编译生成flash.bin,为下载的较新版本的5.4.47内核源码分别打入Xenomai及Preempt-RT补丁,经过内核配置、交叉编译生成64位ARM平台的对应设备树文件和内核镜像,通过debootstrap工具抽取指定的Ubuntu 18.04的根文件系统,准备SD card,对其分区并写入上述的flash.bin、内核镜像及设备树文件、根文件系统,各部分关系如图2所示,SDcard插入平台硬件,通过SecureCRT查看系统启动情况,。

2.实时性测试:

用于操作处理实时任务所需的最坏情况执行时间是实时系统最关心的,本发明中从系统实时性出发对两种实时技术构建的实时系统进行实验、分析对比从而得到更适合64位ARM平台的实时改造方案。

系统实时性测试通过rt-tests的分支工具cyclictest,创建实时进程,设置最大优先级,指定调度次数及调度周期根据结果进行系统性能对比,通过Linux Test Project中提供的系统功能测试来统计系统延迟及性能情况,另外自定义设置调度任务的周期,分别采用Linux标准的POSIX接口及Xenomai改造方案提供的的接口实现调度,通过比较周期与任务实际运行时间进行实时改造方案接口性能对比。

3.用户态屏蔽方案的设计

实时系统中存在着强实时任务、弱实时任务以及Linux系统本身的任务。需要充分发挥多核处理器的优势,对实时任务及非实时任务所使用的资源进行划分,将任务分配到合适的CPU上,同时在多核中也需要解决中断平衡问题,当中断发生时应该将其交由哪个CPU处理,CPU可以绑定哪些中断等。

利用Linux内核特性control groups对非实时任务重新绑定其亲缘性,并将非实时任务迁移至其绑定的CPU上,隔离出主频较高的CPU,同时将系统中断进行亲缘性绑定,减少高频CPU上的中断次数,将实时任务指定到隔离的CPU上运行达到实时性的提升,隔离说明如图3所示。

附图说明

图1是实时系统搭建的框架图。

图2是系统启动关系图。

图3是用户态屏蔽方案的框架图。

具体实施方式

本发明具体实施方案以64位ARM开发平台i.MX8QM为例进行说明,主要包括系统平台搭建、实时改造技术对比、用户态屏蔽方案设计三部分,平台搭建基于开源代码实现。

实时系统搭建框架如图1所示,针对特定的目标平台i.MX8QM,需要首先生成系统引导程序flash.bin启动映像。其次是内核,它将应用层程序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。内核是应用程序角度出发的最底层,在实际工作中内核抽象了相关细节,内核是一个资源管理程序,负责将可用的共享资源如CPU、磁盘分配到各个系统进程,内核向上提供了一组面向系统的命令即系统调用。为保证两种改造技术的实时系统测试环境一致,本发明中Linux内核版本号为5.4.47,Linux源码将从目标平台硬件商官网获取以便系统可正确启动,对应的版本为imx-5.4.47_2.2.0。最后是根文件系统制作,debootstrap是debian/ubuntu下的一个工具,用来构建一套基本的系统,生成的目录符合Linux文件系统标准,且比发行版本的Linux体积小很多,同时可以实现联网后根据需要安装工具,无需buildroot工具那样复杂的配置过程。

具体步骤如下:

对于实时平台搭建,首先需要使用交叉编译器生成系统引导程序flash.bin,其中包括生成系统控制器固件(SCFW)、ARM可信固件(ATF)、U-Boot以及下载安全控制器固件。

SCFW编译:不同的内核版本对应不同的SCFW,本发明中内核版本为imx-5.4.47-2.2.0,根据内核版本在宿主机Linux系统中下载对应的SCFW源码,通过命令tar xzvfscfw_export_mx8qm_b0.tar.gz解压SCFW源码,源码目录下创建toolchain目录,下载交叉编译工具gcc-arm-none-eabi-6-2017-q2-update-linux.tar.bz2到toolchain并使用命令export TOOLS=../../toolchain/配置编译环境,最终执行命令make为对应的目标平台生成scfw_tcm.bin。

ATF编译:宿主机Linux系统中下载对应的imx-atf源码,设置交叉编译环境,通过命令make PLAT=imx8qm为特定的目标平台i.MX8QM生成ARM可信固件二进制文件bl31.bin。

U-Boot编译:在宿主机Linux系统中下载对应的uboot-imx源码,配置交叉编译环境,通过命令make imx8qm_mek_defconfig为目标平台i.MX8QM进行默认配置,最终执行命令make生成u-boot.bin。

安全控制器固件文件为mx8qm-ahab-container.image,下载该文件到宿主机Linux系统即可。

生成flash.bin:在宿主机Linux系统中下载imx-mkimage工具,将上述生成的scfw_tcm.bin、u-boot.bin、bl31.bin及mx8qm-ahab-container.image拷贝至imx-mkimage工具下的目标平台对应的目录iMX8QM,执行命令make SOC=iMX8QM flash_b0为目标平台编译出最终的引导程序flash.bin。

对于实时平台搭建,其次是实时内核的准备,需要分别从两种实时改造技术出发对内核进行打补丁、配置及编译。

patch命令用于修补文件,可读取如何更改文件的源文件相关的指示信息,并应用这些更改。本发明中打补丁工作统一使用patch命令来完成。通过下载补丁到内核源码同一级父目录下,进入内核源码目录执行命令patch–p1<../xxx.patch为Linux内核添加实时特性。

在进行编译前首先需要配置内核,配置内核需要根据硬件平台特点为其生成对应的默认配置,需要执行命令make ARCH=$ARCH CROSS_CPMPILE=$CROSS_COMPILE_PATHconfigfile,本发明中对应的ARCH为aarch64,CROSS_COMPILE为在硬件平台i.MX8QM相关的yocto项目中所获取的交叉编译工具链aarch64-poky-linux-gcc 9.2.0路径,平台对应的config文件为imx_v8_defconfig,命令执行后将会在内核源码目录下生成对应的.config文件。

在默认配置的基础上,使用Linux自身提供的可视化图形配置界面进行内核配置。执行命令make menuconfig可以生成图形配置界面,它基于内核源码下的arch/$ARCH/Kconfig文件为用户生成内核配置界面,用户仅使用键盘即可完成配置,配置后的信息将会更新到内核源码目录下.config文件中。

对于Xenomai双内核实时方案,添加内核配置的后缀信息可用于系统启动后内核信息的验证,配置与cobalt内核相关的资源大小,同时使能高精度时钟,禁止可能影响系统实时性的特性如CONFIG_CPU_FREQ、CONFIG_CPU_IDLE等。

对于Preempt-RT方案,添加内核配置的后缀信息可用于系统启动后内核信息的验证,同时配置内核抢占模式为完全可抢占特性。

内核编译时配置交叉编译环境,执行命令make-j 4编译生成内核镜像。

对于实时平台搭建,最后是根文件系统的准备,通过debootstrap工具来实现。

执行命令sudo apt-get install qemu-user-static binfmt-supportdebootstrap下载依赖工具,执行命令ls/usr/share/debootstrap/scripts查看debootstrap支持的发行版本代号,选择与内核版本有较高兼容性的内核版本代号bionic,执行命令sudo debootstrap--arch=arm64--foreign bionic fs_debian_bionic抽取根文件系统,拷贝qemu-user-static工具到根文件系统以保证可以在宿主机中访问根文件系统,设置环境变量后进入根文件系统并执行命令debootstap--second-stage完成根文件系统引导启动过程。

平台基础工作完成后需要实现系统的正确启动,本发明使用SD card完成系统启动,系统启动关系如图2所示。

fdisk是一种硬盘格式化工具,用户可通过该工具查看硬盘的使用情况,亦可根据需要对硬盘进行分区,执行命令sudo fdisk/dev/mmcblk0→p查看SD card分区情况,清除旧分区并创建两个新的主分区,一个作为内核分区,一个作为根文件系统分区,内核分区主要存放内核镜像及内核编译过程中生成的平台设备树文件,根文件系统分区则存放抽取的根文件系统,根文件系统拷贝前需要执行命令sudo mkfs-t ext4-L root/dev/mmcblk0p2格式化分区。

系统引导程序写入需要使用dd命令将flash.bin写入SD card,涉及到的命令为sudo dd if=flash.bin of=/dev/mmcblk0 seek=32bs=1k conv=fsync。

插入SD card到硬件平台并使用usb线连接硬件平台及宿主机,通过SecureCRT工具查看系统启动情况。

实时改造技术对比主要从调度延迟出发。

cyclictest是一个高精度的测试程序,cyclictest是rt-tests下的一个测试工具,也是rt-tests下使用最广泛的测试工具,一般主要用来测试内核的延迟,可以准确地测量任务的预期唤醒时间与实际唤醒时间之间的差异,以提供有关系统延迟的统计信息,也可以测量由硬件、固件和操作系统引起的实时系统的延迟。

cyclictest使用需要安装rt-tests工具,需要配置交叉编译环境并通过gitclone下载源码,执行make命令编译生成可在目标平台运行的文件。

系统启动后可通过top命令查看资源使用情况,在加入负载的情况下测试系统的延迟,测试命令:./cyclictest -l 10000 -m -n -t 1 -p 99 -i 100 -h,根据输出结果中最大、最小及平均延迟确定系统的实时性。

Linux Test Project(LTP)是SGI、IBM、OSDL及BULL合作的项日,旨在向开源社区提供一个测试套件,以验证Linux系统的可靠性、健壮性和稳定性。通过Linux TestProject中提供的系统功能测试来统计系统延迟及性能情况。

LTP安装需要配置交叉编译环境并下载源码,进入源码目录执行./configure配置交叉编译工具及输出文件路径,执行make&&make install命令编译出可在目标平台运行的文件。

使用LTP中realtime测试套件的sched_latency,查看周期调度的最大、最小、平均延迟及延迟标准差情况来确定系统的实时性。

使用两种改造技术提供的接口实现周期调度。

Linux的标准POSIX接口及Xenomai方案的POSIX接口性能测试使用如下函数:

Xenomai方案的alchemy接口性能测试使用如下函数:

通过上述接口分别创建线程并周期性执行任务,统计其最大、最小及平均延迟来确定系统的实时性情况。

用户态屏蔽方案主要从CPU资源使用出发。

查看多核ARM平台现有的CPU个数,确定需要隔离的CPU资源,将现有非实时进程进行迁移至非隔离的CPU资源,将实时任务运行在隔离CPU上,同时利用中断的亲缘性信息,将中断绑定至非隔离的CPU资源上,达到隔离CPU资源尽量空闲的目的,用户态屏蔽方案框架如图3所示。

用户态屏蔽方案以vector类型存储当前系统的CPU资源,由于处理器为NUMA架构,还需要进一步定义NUMA架构相关的CPU信息,同时需要获取系统当前的NU MA节点信息,涉及到的数据结构定义如下:

在进行用户态屏蔽时从系统目录/sys/devices/system/node/online获取在线的NUM A节点信息即nodeNumber,依次读取nodeNumber对应的CPU信息即cpus,如/sys/devices/system/node/node0/cpulist,所有的NumaNode信息将被存放在NumaInfo中。

在用户态屏蔽方案中首先需要隔离CPU资源,利用Linux的control groups特性自定义实现CPU隔离接口,将非实时进程迁移至非隔离的CPU资源,接口定义如下:

int ShieldBackgroundProcesses(CpuSet*cpus);

从NumaInfo中查询要隔离的cpus并进行剔除,得到的剩余CPU资源即为非实时进程即将迁移的目标CPU集合,通过control groups创建子CPU集cpuset_unshielded,设置cpuset_unshielded中cpuset.cpus为NumaInfo的NumaNode的cpus信息,设置cpuset_unshielded中cpuset.mems为NumaInfo的NumaNode的nodeNumber信息,将当前系统的非实时进程PID写入cpuset_unshielded的tasks以迁移非实时进程,达到隔离cpus的目的。

对于中断的隔离自定义实现接口如下:

int ShieldInterrupts(CpuSet*cpus);

获取系统当前NUMA架构信息并存储至NumaInfo,从NumaInfo查询cpus信息并剔除cpus信息,将NumaInfo中剩余的CPU信息写入/proc/irq下每个中断对应的亲缘性信息文件smp_affinity_list实现中断亲缘性绑定以达到减少隔离的CPU上中断次数的目的。

CPU资源隔离后可运行实时进程,给定实时进程所在绝对路径及运行参数,并设置其将占用的CPU资源、调度策略及进程优先级,涉及到的接口定义如下:

int RunTask(const*path,const char*arg,const char*cpus,unsigned intpolicy,unsigned int priority);

通过指定cpus为隔离的CPU子集,设置实时进程调度策略及优先级来达到提高系统实时性的目的。

综上所述,本发明方法是一种基于多核ARM的Linux实时改造方法,可以为64位ARM提供更合适的实时系统,并从CPU资源使用的角度提高系统的实时性。

相关技术
  • 一种基于多核ARM的Linux实时改造方法
  • 一种基于ARM和Linux的智能液位仪表信息检测装置
技术分类

06120113023421