一种不同类型CPU的Glibc兼容方法与流程

    专利2022-07-08  66


    本发明涉及应用程序资源兼容
    技术领域
    ,具体涉及一种不同类型cpu的glibc兼容方法。
    背景技术
    :国产飞腾系列处理器基于arm64体系结构,目前已经发布了ft1500a、ft2000ahk、ft2000plus和ft2000/4等4款不同类型的cpu,然而,这四款cpu所支持的设备内存特性并不相同,且在进行设备内存访问时,对这四款cpu的要求也有所不同,具体如下表所示:cpuwritecombine设备内存访问ft1500a不支持64bits对齐访问ft2000ahk不支持128bits对齐访问ft2000plus支持打开wc时,支持非对齐访问ft2000/4支持打开wc时,支持非对齐访问表一:飞腾平台下不同cpu支持的设备内存特性及设备内存访问要求不同类型cpu支持的设备内存特性和设备内存访问要求的不同,给linux内核操作系统的实现造成了不便。目前在linux内核的操作系统中,glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于它,它也提供了相关的设备内存访问函数。因此,为兼容各款支持不同内存访问特性和使用要求的cpu,通常的处理方法是:首先,为不同类型的cpu定制不同版本的glibc库,每个glibc库都有针对性地实现可以满足对应cpu访问设备内存的相关函数;其次,当确定cpu平台后,根据cpu来选择对应的glibc库进行系统编译,生成定制的linux内核的操作系统。这种方式实现相对简单,且可以保证在定制的操作系统中,操作系统对应的cpu在访问设备内存时不会出现问题。然而,上述方式需要维护多个版本的glibc库,也需要维护多个版本的操作系统,会导致系统缺乏灵活性、成本增加、不利于维护以及容易出现glibc错用等问题的出现,且针对一类cpu的定制系统无法实现对其他类型cpu的兼容。尤其是ft1500a和ft2000/4都定位为桌面平台cpu,希望至少操作系统能够实现对这两款cpu的兼容,而不是针对每款cpu都定制一款操作系统。解决此类问题的目标是:一个glibc库即可兼容飞腾平台不同类型的cpu(特别是ft1500a和ft2000/4),并使每个类型的cpu都能够获得最大性能,且该glibc也可以适用于其他类型的cpu,从而满足一个版本的glibc和操作系统即可兼容各类型的cpu的需求。中国发明专利“一种cpu的指令集兼容方法及其终端”(专利号:cn106406819b)。该专利公开了一种cpu的指令集兼容方法及其终端,解决了目前的部分amdcpu不兼容ssse3指令集的应用,使得很多应用程序无法运行,而导致的用户体验性低的技术问题。该专利的cpu的指令集兼容方法包括:获取到amdcpu运行ssse3指令应用的命令,通过捕获ssse3指令应用运行后的异常信号;调用预置异常handler函数,并进行异常信号是否为ssse3指令的判断,若是,则通过预置sse1指令和预置sse2指令模拟ssse3指令,使得ssse3指令应用成功运行。该专利是针对部分amdcpu不兼容ssse3指令集的改进,在不支持ssse3指令集的cpu上,采用异常捕获来发现是否为ssse3指令,并对ssse3指令进行模拟。该专利并不能解决glibc兼容性的问题,且采用异常捕获和模拟的方式对指令集实现兼容也会导致额外的性能开销。中国发明专利“执行在具有不同指令集架构的处理器上的操作系统”(专利号:cn105074666b)。该专利公开了一种可以使操作系统可同时在两个具有不同指令集架构的处理器上执行的方法。该专利包括步骤:1)在操作系统的调度程序处接收调度用于执行的任务的请求;2)第一处理器经配置以存取共享数据结构中的存储在虚拟地址处的函数表的第一表项,且第二处理器经配置以存取所述共享数据结构中的存储在所述虚拟地址处的所述函数表的第二表项;3)响应于确定所述任务可用于使用所述第一处理器上的所述第一指令集架构和使用所述第二处理器上的所述第二不同指令集架构的执行,基于至少一个选择准则调度所述第一处理器上的所述任务;以及在所述任务的执行期间,将所述任务的执行从所述第一处理器切换到所述第二处理器。该专利是针对不同指令集架构的cpu的同时运行,且通过对不同指令集架构的cpu采用不同版本的函数代码的方式,与上文所述多版本glibc库方法一样,存在缺乏灵活性、成本增加、不利于维护等问题;且采用共享数据结构存储函数表的方式,也会带来额外的内存开销。中国发明专利“linux内核镜像数据支持多种cpu的实现方法及装置”(专利号:cn101894028b)。该专利提供了一种linux内核镜像数据支持多种cpu的实现方法及装置,其方法包括:预先设置存储索引信息,所述存储索引信息用于查找到多种cpu能够共用的linux内核镜像数据;预设每种cpu的识别信息;读取待运行的cpu的识别信息,对该cpu做识别处理;并根据所述存储索引信息,查找到适用于该cpu的linux内核镜像数据,且在该cpu上运行所述linux内核镜像数据。该专利提供的方法主要用于解决linux内核镜像数据难以支持多种cpu、难以适应嵌入式设备硬件差异的多样性和复杂性的技术问题,且主要针对arm架构的嵌入式平台。该方法需要存储公共linux内核镜像数据和不同类型cpu的内核镜像数据,与我们在上节中提到的多版本glibc库方法一样,存在缺乏灵活性、成本增加、不利于维护等问题。世界知识产权组织发明专利“linuxkerneldriverloadingmethodanddevice”(专利号:wo2016091071(a1))。该专利公开了一种linux内核驱动程序的加载方法和装置,包括:1)选择与目标系统的cpu平台相一致的内核代码作为用于编译初始通用内核驱动程序的参考内核代码;2)在参考内核代码的结构中填充预定大小的字节,并编译填充后的参考内核代码和初始通用内核驱动程序;3)在所述目标系统中搜索所述目标系统携带的内核驱动程序,并作为参考驱动程序,根据参考驱动程序信息,修改编译后的初始通用内核驱动程序,生成通用内核驱动程序;4)将生成的通用内核驱动程序加载到目标系统的内核中。该专利同样需要在一套系统中维护针对不同cpu平台的内核代码和内核驱动版本的程序代码,只是在编译后生成针对cpu的内核和驱动。其编译后生成的系统并不具备对不同类型cpu的兼容性,且与上文提到的多版本glibc库方法一样,也存在缺乏灵活性、成本增加、不利于维护等问题。此外,目前尚没有技术关注像在飞腾平台这种同种架构下的、不同类型cpu的设备内存访问的兼容性问题。技术实现要素:为解决已有技术存在的不足,本发明提供了一种不同类型cpu的glibc兼容方法,包括如下步骤:步骤s1:创建设备内存访问函数的若干实现;具体包括:步骤s11:收集具有不同设备内存访问特性支持和访问要求的cpu型号;步骤s12:针对每一种cpu型号,均通过ifunc方式在glibc中创建能够与之适配的设备内存访问函数的一种实现;步骤s2:采用elf辅助向量向用户控件传递信息;步骤s3:选定设备内存访问函数的一种实现;步骤s4:使用选定实现进行设备内存访问。其中,所述步骤s2包括如下步骤:步骤s21:在脚本或程序在运行时,内核获取得到当前的cpu型号;步骤s22:根据获取的cpu型号,内核将预先定义的、与该cpu对应的设备内存访问情况填充到elf辅助向量中;步骤s23:被填充的elf辅助向量将设备内存访问情况传递给脚本或程序。其中,所述步骤s3包括如下步骤:步骤s31:从elf辅助向量中获取设备内存访问情况;步骤s32:根据获取得到的设备内存访问情况,选定设备内存访问函数的一个实现。其中,所述设备内存访问函数为memcpy/memset/memmove函数。其中,所述步骤s2包括如下步骤:步骤s21:修改内核中的elf文件,为每个类型的cpu创建一个常量,该常量的值对应该类型的cpu的访问情况;步骤s22:在脚本或程序在运行时,内核通过读取midr寄存器来获得当前的cpu型号;步骤s23:根据获取的cpu型号,内核将步骤s21中创建的与该cpu对应的常量的值填充到elf辅助向量at_flags中;被填充的elf辅助向量at_flags将cpu的访问情况传递给脚本或程序。其中,所述步骤s3包括如下步骤:步骤s31:当访问设备内存时,首先从elf辅助向量at_flags中获取cpu的访问情况;步骤s32:根据从elf辅助向量at_flags中获取得到的cpu的访问情况,选定设备内存访问函数的一个实现,且该选定实现在进程生命周期内不再改变;步骤s33:使用选定的设备内存访问函数实现进行设备内存访问。其中,所述设备内存访问函数为memcpy/memset/memmove函数。本发明提供的不同类型cpu的glibc兼容方法,通过同一个glibc实现,可兼容多种cpu;在保证兼容的前提下,使每个类型cpu都获得的访问设备内存的最大性能。附图说明图1:本发明不同类型cpu的glibc兼容方法的实现流程图。具体实施方式为了对本发明的技术方案及有益效果有更进一步的了解,下面结合附图详细说明本发明的技术方案及其产生的有益效果。本发明的目的在于实现一个统一的glibc库,该glibc库可以满足不同类型cpu对设备内存的访问需求。基于该glibc库,可以确保一个操作系统即可兼容多种类型(特别是飞腾平台下)的cpu,并能够使每个类型的cpu都能够获得最大性能。为了实现glibc库对不同类型的cpu的二进制兼容,需要解决以下问题:(1)为了不造成性能损失,需要在同一个glibc库中,创建设备内存访问函数的若干不同实现,每一个函数实现均针对一种特定类型的cpu,可以满足该cpu的设备内存特性支持以及访问设备内存时的要求;(2)一种在glibc中能够高效获取到当前cpu型号和内存访问情况的方法。以便在进行设备内存操作时,位于e1用户控件的glibc也可以快速获得当前cpu型号和内存访问情况,并根据cpu型号调用与之相匹配的函数实现来进行设备内存的访问;(3)可以在运行时动态选择内存访问函数的不同实现的工具或方式。该工具或方式不能对系统的正常运行和兼容性造成影响。为实现上述目的,本发明提供的技术方案如下:一种不同类型cpu的glibc兼容方法。为了实现可在运行时动态选择函数的指定实现的需要,所述方法使用ifunc方式来创建设备内存访问函数的多个实现。针对每一种类型的飞腾cpu,所述方法均在glibc库中为其创建了设备内存访问函数的对应实现,不同的函数实现均满足对应cpu的设备内存特性支持和访问设备内存对该cpu的要求。同时,通过ifunc,系统可以在运行时根据cpu型号和给定的判断规则选定函数的一种实现来完成内存访问。进一步,因为内核仅允许在el1中读取cpu型号,为了使运行在el0用户空间的glibc能够获得当前cpu型号等相关信息,所述方法采用elf辅助向量的方式,从内核空间向用户空间进程传递cpu型号和设备内存访问情况。具体实现步骤如下:步骤s1:创建设备内存访问函数的若干实现:(1)收集具有不同设备内存访问特性支持和访问要求的cpu型号;(2)针对每一种cpu型号,均通过ifunc方式在glibc中创建能够与之适配的设备内存访问函数的一种实现,从而使每一种实现均对应一种类型的飞腾cpu。步骤s2:采用elf辅助向量向用户控件传递信息:(1)在脚本或程序在运行时,内核获取得到当前的cpu型号;(2)根据获取的cpu型号,内核将预先定义的、与该cpu对应的设备内存访问情况填充到elf辅助向量中;(3)被填充的elf辅助向量可将设备内存访问情况传递给脚本或程序。因为在glibc中只需要知道当前cpu的设备内存访问情况就可以进行选择操作,所以可以仅通过elf传递当前的设备内存访问情况即可。并且,因为elf辅助向量中的at_flags在当前系统中并未实际使用,所以可以用at_flags来传递设备内存访问情况。步骤s3:选定设备内存访问函数的一种实现:(1)从elf辅助向量中获取设备内存访问情况;(2)根据获取得到的设备内存访问情况,通过ifunc来选定设备内存访问函数的一个实现。一旦选定,在进程的整个生命周期内将不会再更改。步骤s4:使用选定实现进行设备内存访问。图1是本发明提供的可兼容不同型号cpu的glibc一较佳实施例的改进方法的实现流程图,具体可适用于linux内核的操作系统中飞腾cpu的兼容。在linux内核的操作系统中,设备内存访问函数为memcpy/memset/memmove函数,本实施例主要是创建memcpy/memset/memmove函数的多个实现,并根据cpu的设备内存访问情况来选定该函数的一个实现,达到根据cpu类型调用满足当前cpu访问其设备内存特性及对其要求的memcpy/memset/memmove函数的目的。具体实现步骤如下:步骤s201:针对每一种类型的飞腾cpu,均基于ifunc方式,在glibc中创建能够与之适配的memcpy/memset/memmove函数的一种实现;步骤s202:修改内核中的elf文件,为每个类型的飞腾cpu创建一个常量,该常量的值对应该类型的飞腾cpu的访问情况;步骤s203:在脚本或程序在运行时,内核通过读取midr寄存器来获得当前的cpu型号;步骤s204:根据获取的cpu型号,内核将s202中创建的与该cpu对应的常量的值填充到elf辅助向量at_flags中;被填充的elf辅助向量at_flags可将cpu的访问情况传递给脚本或程序;步骤s205:当访问设备内存时,首先从elf辅助向量at_flags中获取cpu的访问情况;步骤s206:根据从elf辅助向量at_flags中获取得到的cpu的访问情况,选定memcpy/memset/memmove函数的一个实现,且该选定实现在进程生命周期内不再改变;步骤s207:使用选定的memcpy/memset/memmove函数实现进行设备内存访问。本发明中,所谓的“飞腾cpu”,即国产飞腾系列处理器,其基于arm64体系结构,全面兼容armv8指令集,并在内部实现了neon拓展指令。本发明中,所谓的“glibc”,是gnu发布的libc库,即c运行库,当前它最主要的应用是配合linux内核。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。本发明中,所谓的“elf辅助向量”,可将操作系统特定的信息传送到程序解释器和进程。在脚本或程序在运行时,内核会填充这些向量,以便将操作系统特定的信息传送到程序解释器和进程中。本发明中,所谓的“ifunc”,全称为indirectfunction,间接函数。ifunc是gnu工具链的一项功能,它允许开发人员创建给定函数的多个实现,并在运行时根据给定的判断规则选定一种实现。一旦确定了实现方案,在整个进程的生命周期都不会发生改变。这个方法在glibc中已经有了广泛使用。本发明提供的不同类型cpu的glibc兼容方法,尤其适用于国产飞腾平台的cpu兼容。本发明实现效果明显,通过一个glibc实现,兼容飞腾平台已发布的4款cpu;在保证兼容的前提下,使每个类型cpu都获得的访问设备内存的最大性能。虽然本发明已利用上述较佳实施例进行说明,然其并非用以限定本发明的保护范围,任何本领域技术人员在不脱离本发明的精神和范围之内,相对上述实施例进行各种变动与修改仍属本发明所保护的范围,因此本发明的保护范围以权利要求书所界定的为准。当前第1页1 2 3 
    技术特征:

    1.不同类型cpu的glibc兼容方法,其特征在于,包括如下步骤:

    步骤s1:创建设备内存访问函数的若干实现;具体包括:

    步骤s11:收集具有不同设备内存访问特性支持和访问要求的cpu型号;

    步骤s12:针对每一种cpu型号,均通过ifunc方式在glibc中创建能够与之适配的设备内存访问函数的一种实现;

    步骤s2:采用elf辅助向量向用户控件传递信息;

    步骤s3:选定设备内存访问函数的一种实现;

    步骤s4:使用选定实现进行设备内存访问。

    2.如权利要求1所述的不同类型cpu的glibc兼容方法,其特征在于,所述步骤s2包括如下步骤:

    步骤s21:在脚本或程序在运行时,内核获取得到当前的cpu型号;

    步骤s22:根据获取的cpu型号,内核将预先定义的、与该cpu对应的设备内存访问情况填充到elf辅助向量中;

    步骤s23:被填充的elf辅助向量将设备内存访问情况传递给脚本或程序。

    3.如权利要求2所述的不同类型cpu的glibc兼容方法,其特征在于,所述步骤s3包括如下步骤:

    步骤s31:从elf辅助向量中获取设备内存访问情况;

    步骤s32:根据获取得到的设备内存访问情况,选定设备内存访问函数的一个实现。

    4.如权利要求1或3所述的不同类型cpu的glibc兼容方法,其特征在于,所述设备内存访问函数为memcpy/memset/memmove函数。

    5.如权利要求1所述的不同类型cpu的glibc兼容方法,其特征在于,所述步骤s2包括如下步骤:

    步骤s21:修改内核中的elf文件,为每个类型的cpu创建一个常量,该常量的值对应该类型的cpu的访问情况;

    步骤s22:在脚本或程序在运行时,内核通过读取midr寄存器来获得当前的cpu型号;

    步骤s23:根据获取的cpu型号,内核将步骤s21中创建的与该cpu对应的常量的值填充到elf辅助向量at_flags中;被填充的elf辅助向量at_flags将cpu的访问情况传递给脚本或程序。

    6.如权利要求5所述的不同类型cpu的glibc兼容方法,其特征在于,所述步骤s3包括如下步骤:

    步骤s31:当访问设备内存时,首先从elf辅助向量at_flags中获取cpu的访问情况;

    步骤s32:根据从elf辅助向量at_flags中获取得到的cpu的访问情况,选定设备内存访问函数的一个实现,且该选定实现在进程生命周期内不再改变;

    步骤s33:使用选定的设备内存访问函数实现进行设备内存访问。

    7.如权利要求1或6所述的不同类型cpu的glibc兼容方法,其特征在于,所述设备内存访问函数为memcpy/memset/memmove函数。

    技术总结
    本发明涉及不同类型CPU的Glibc兼容方法,包括如下步骤:S1创建设备内存访问函数的若干实现;具体包括:收集具有不同设备内存访问特性支持和访问要求的CPU型号;针对每一种CPU型号,均通过IFUNC方式在Glibc中创建能够与之适配的设备内存访问函数的一种实现;S2:采用ELF辅助向量向用户控件传递信息;S3:选定设备内存访问函数的一种实现;S4:使用选定实现进行设备内存访问。本发明通过同一个Glibc实现,可兼容多种CPU;在保证兼容的前提下,使每个类型CPU都获得的访问设备内存的最大性能。

    技术研发人员:周磊;张铎;王勇军;刘意虎;孙立明;李唯实
    受保护的技术使用者:麒麟软件有限公司
    技术研发日:2020.11.06
    技术公布日:2021.03.12

    转载请注明原文地址:https://wp.8miu.com/read-23212.html

    最新回复(0)