APP下载

基于国产服务器的国产Linux操作系统适配研究

2023-04-21付志鹏张晓梨

计算机技术与发展 2023年4期
关键词:外设固件网卡

付志鹏,冯 丹,陈 红,张晓梨

(鹏城实验室,广东 深圳 518055)

0 引 言

随着国内外环境的变化,建设自主可控的国产计算生态的必要性和紧迫性日益凸显。作为计算生态核心的处理器和操作系统,除了Wintel(Windows+Intel)体系和Intel+IOS体系,AL(ARM[1]+Linux)体系由于其在移动端(手机、平板等)的优势地位而成为在服务器和PC端具有全球发展潜力的另一种体系。随着多年的发展,国内在AL体系已逐渐形成了以飞腾[2]+麒麟[3-6]为代表的PK(Phytium+Kylin)体系和以华为鲲鹏+欧拉为代表的鲲鹏体系。近几年,飞腾服务器和鲲鹏服务器在国内市场飞速增长,基于国产飞腾服务器和鲲鹏服务器的生态适配显得日益迫切,这为在关键领域加速完成国产化替代奠定基础,具有广阔的市场前景。

国产计算平台的核心部件,主要包括处理器、整机、操作系统、中间件等。将这些核心部件有效集成起来,形成能够支撑当前互联网信息时代的基础设施,进而建设国产计算生态,实现对国外生态的全面替代尤为重要。生态适配首先需要解决国产操作系统对国产服务器的适配。由于Intel服务器长期在国际国内的垄断地位,国产操作系统主要基于Intel服务器开发和运行,无需进行适配。在AL生态蓬勃发展的当下,国产操作系统需要首先完成对飞腾服务器和华为鲲鹏服务器的适配,才能以此为基础建设国产AL计算平台,并在此平台上发展AL应用生态。

国外关于操作系统对服务器适配的相关研究较少,主要原因在于Wintel体系和Intel+IOS体系在服务器和终端市场诞生的初期就天生结合在一起,Windows和IOS操作系统的开发和调试主要在Intel系列服务器或终端设备上进行,具有天生的适配能力。

在国内,前期国产操作系统主要以在Intel系列服务器上运行为主。国内外环境改变后,计算平台国产化问题日益突出,国产操作系统在国产服务器上适配需求越来越迫切。在某些特殊领域,国产操作系统对处理器的适配已有相关研究。雷鸣等[7]针对在龙芯平台上适配Android操作系统进行研究,通过编译环境适配、Linux内核适配、文件系统适配等一系列改进,测试结果表明Android操作系统能够适配龙芯处理器。任占广等[8]针对国内高性能通信需求,采用锐华国产嵌入式操作系统在自主研制的高性能通信处理器“网芯一号”上进行适配,突破了操作系统在实时通信方面的不足,完成了锐华操作系统在“网芯一号”上的板级升级包和相关驱动上的适配。测试结果表明,锐华操作系统完全能够满足国内高性能通信需求,解决了通信领域大量使用国外软硬件产品,存在安全隐患的矛盾。张静等[9]针对锐华操作系统适配到国产飞腾1500A/4上的问题,给出了一个针对性的处理器支持包,该包支持锐华操作系统在飞腾1500A/4下的任务上下文切换、中断处理、多核同步与互斥等功能,有力解决了飞腾1500A/4和锐华操作系统在国产通信领域的嵌入式应用障碍。针对航空航天领域软硬件国产化的特殊需求,项涛等[10]将国产自研的天脉1机载嵌入式实时操作系统在国产自研飞腾2000A处理器上进行适配,测试结果表明天脉1嵌入式操作系统能在飞腾2000A上顺利运行。刘帜琦等[11]将天脉1嵌入式操作系统适配到T2080处理器上,以满足机载计算平台对实时性的需求。基于PK体系,郭长国等[12]针对近几年在国产办公信息系统的研发、集成以及国产化推进、实施等方面进行总结梳理,提出了若干建设PK体系生态需要注意的问题及相应的应对策略,为下一步国产计算生态建设积累了经验。针对5G时代下的物联网对新型移动操作系统“低延时、高带宽、大连接”需求,宋佳明等[13]提出分别从硬件适配能力、软件兼容能力以及服务生态兼容性三个方面来构建新型操作系统适配验证体系的思路。

通过这几项相关研究,可以发现如下几个特点:

(1)针对某些关键领域的国产化替代来进行,具有很强的针对性。

(2)操作系统对处理器的适配主要在嵌入式领域,在服务器和PC领域没有涉及。

(3)适配的对象主要是处理器,而不涉及到整机、外设等。

(4)中国逐渐意识到生态建设的重要性并加大国产计算生态的建设力度。

针对国内通用ARM服务器领域的国产化替代来进行,适配内容除了处理器外,还包括固件、主板、外设等。其适配思路和方法,同样可以推广到国产ARM PC领域,具有一定的可推广性。

操作系统的选型是国产计算平台建设的基础,是进行国产ARM服务器适配的第一步。目前主流的国产操作系统主要有银河麒麟系列、欧拉系列以及统信操作系统。鉴于PK体系和鲲鹏欧拉体系在AL体系中的主流地位,采用银河麒麟操作系统来进行适配。该适配思路和方法可以同样扩展到欧拉或统信等其他操作系统上。

国产操作系统对国产ARM服务器的适配需要经过一系列流程。由于服务器主要由固件、CPU、主板、外设等几个大模块组成,因此相应的适配过程也主要分为如下四个步骤来进行:固件适配、处理器适配、主板适配、外设适配,其中每个步骤又可以细分为多个子步骤,适配整体方案如图1所示。

图1 国产操作系统对ARM服务器适配的整体方案

国产固件适配主要解决服务器加载并启动操作系统的问题,国产处理器适配主要针对国产处理器内置SOC控制器,包括GPIO(General-Purpose Input/Output)、GIC(Generic Interrupt Controller)、内存地址随机化部件等进行适配。外设适配主要针对网卡、显卡、外部存储和RTC(Real-Time Clock)等模块,需要基于整体硬件平台构建操作系统的驱动模块,实现系统对硬件的无缝兼容。主板适配主要是指操作系统在主板上运行时可能会遇到各种各样的问题,并针对这些问题进行排查、分析和解决。随着操作系统和国产主板几十年的发展,在主板适配上遇到的问题较少,因此这里主要阐述固件适配、处理器适配和外设适配。

1 国产固件适配

固件是在启动操作系统之前首先在计算机上运行的一种软件,它的作用有两个,一个是检测并进行基本的硬件初始化,另外一个是加载操作系统,然后把控制权交给操作系统。

国产固件适配是指让国产固件能够成功启动操作系统,目前主要支持两种启动方式:直接启动(固件直接加载操作系统内核并启动内核)和间接启动(固件先加载grub等bootloader,然后通过bootloader启动操作系统),启动方式不同,其要做的工作也有所区别。固件适配要做的工作主要包括:

(1)约定好启动操作系统要加载的内容。直接启动,则要加载内核二进制文件、initrd文件及设备树文件。间接启动,则还要加载启动加载器grub。

(2)约定好所加载内容的加载地址,包括内核二进制文件加载地址、initrd文件加载地址、设备树文件加载地址等。

(3)约定好固件传递给内核的启动参数。

当固件做完其硬件检查和配置工作,需要启动操作系统时,根据其启动方式不同,分别做相应的操作。当为直接启动时,使用约定的内核参数启动内核,内核在启动过程中需要解析设备树,解压并挂载initrd文件和文件系统进行内核和系统启动工作。当为间接启动时,通过已加载的grub参数加载指定的内核和设备树,然后使用约定的内核参数启动内核,内核在启动过程中需要解析设备树,解压并挂载initrd文件和文件系统进行内核和系统启动工作。

2 国产处理器适配

国产处理器适配主要从GPIO驱动模块、GIC中断驱动模块以及内存地址随机化模块三个方面进行。

国产处理器集成了GPIO模块[14],主要用来实现IO数据的传输。GPIO驱动模块适配需要根据约定的硬件采样机制,实现GPIO的接口操作封装,同时对系统内核通用关机和重启接口进行改造,实现系统下软关机和软重启功能。

GPIO驱动模块适配流程分为五个过程:(1)探测设备并对片内GPIO控制器寄存器进行初始化;(2)获取设备树定义的GPIO属性配置信息进行GPIO设置;(3)构建GPIO控制器方法,包括定义GPIO方向输入方法、GPIO值获取方法、GPIO值设置方法并进行GPIO池的注册;(4)为了方便GPIO驱动和应用接口的良好交互,构建sysfs文件系统框架,将GPIO的方向输入接口、GPIO值设置和获取接口提供给应用接口;(5)通过改造poweroff/reboot系统接口,按照约定的采样机制构建GPIO设置执行流程,实现系统下通过GPIO接口的软关机和软重启功能。

GIC中断驱动模块[15]适配,需要建立一个中断和中断源的映射关系,即一个设备发起一个中断,能够被系统及时察觉到并做相应的处理。如PCIe设备的MSI和MSI-X类型的中断,系统需要在内存中建立相应的结构,用于存储这种对应关系,从而确保这些中断能够及时被处理。适配完成后,所有外设触发的中断都能够在系统下正常被处理器响应和执行。系统下打开/proc/interrupts可以查看系统中各设备对应的中断关系,并查看这些中断的数目的变化,变化的幅度在正常范围内。

为了提供更安全的地址空间分配随机化功能(地址分配随机化增强功能),需要在32位系统达到28-30位时随机化,即G bytes级别;在64位系统要达到≥40位时随机化,即T bytes级别。飞腾FT1500A芯片是ARM64架构,要满足40位以上的地址空间随机化,需要通过mmap基地址(mmap_base)映射代码段、数据段、堆段、栈段、mmap段和匿名mmap段、vdso段。内核在初始化mmap基地址的时候会判断当前内核是否支持地址空间随机化,若支持则会基于mmap_base 加上经过一定处理的随机数rnd来保证后续每次访存得到的地址空间都随机变化,以达到提高系统安全性的目的。

适配完成的地址随机化功能,通过终端命令“cat /proc/self/maps”,就可以查看系统下代码段、数据段、堆段、栈段、mmap段和匿名mmap段、vdso段等地址空间信息。重复输入该命令,对比可以发现同一地址空间(例如栈段)变动的位数,即当前系统实现的地址空间随机化位数。

3 外设适配

国产整机一般除了CPU上SOC集成的外设外,还会通过扩展总线(比如PCIe总线、USB总线)扩展其他外设,这些外设主要包括网卡、显卡、存储设备等。

3.1 网卡适配

网卡适配主要是适配对应网卡型号的网络设备驱动,以及结合处理器和网卡驱动实现发送和接收环的定制操作。网卡驱动位于操作系统网络协议栈的数据链路层,上层接收网络协议中发出的数据,并传递给网卡硬件,下层从网卡接收数据,并传递给网络协议栈。

网卡适配分为四个部分,注册网卡驱动、网卡初始化、构建网卡基本操作接口和初始化发送/接收操作接口,如图2所示。

图2 网卡适配流程

首先调用PCIe设备驱动注册函数注册网卡驱动,在匹配设备ID后,调用驱动探针函数对网卡进行初始化,包括寄存器、DMA以及获取EEPROM (Electrically Erasable Programmable Read Only Memory)等信息,接着构建网卡基本操作接口,接口包括open(命令ifup对应的内核接口),close(命令ifdown对应的内核接口)等;初始化发送/接收操作,包括发送接口函数的初始化以及napi的初始化(82574网卡接收采用的是napi机制)以及发送接收中断等函数接口。

网卡驱动的发送和接收流程是网卡适配难点,需要结合处理器以及网卡驱动实现发送和接收环的定制操作。以接收流程为例,每个接收描述符环含有256(size)个描述符,一个头指针Head,一个尾指针Tail,如图3所示。

图3 接受描述符环软件结构

驱动初始化的时候Head和Tail指针都是指向Base,软件控制Tail指针,初始化一个描述符,Tail指针往后移动一个单位,当Tail指针移动到Base+Size的时候重置为Base,当软件发现Tail等于Head的时候,表示当前已经没有数据可供处理,需要等待网卡接收新的数据报文。硬件控制Head指针,网卡设备接收到数据包的时候,硬件移动Head指针,当Head指针移动到Base+Size的时候重置为Base,当网卡设备发现Head等于Tail的时候,表示当前环的所有描述符都已经被填充,说明网卡接收速度快于驱动处理数据的速度,需要等待驱动处理数据并提供新的描述符。适配需要结合处理器以及网卡驱动实现发送和接收环的定制操作。

3.2 显卡适配

显卡是显示设备,为计算机提供图形渲染与图形显示的功能。显卡一般由GPU、显示控制器和显示接口等几部分组成。目前主流的显卡主要有两家厂商,ATI的A系列显卡和英伟达的N系列显卡,而国产化的显卡在图形加速处理能力以及产品成熟度上跟主流商用显卡存在一定差距,急需解决国产化显卡在图形加速处理方面不足的问题。

早期的3D加速处理,渲染缓冲模块由一个屏幕前缓冲和一个屏幕后缓冲组成,所有的客户端和服务器必须共享这个单一的缓冲区,应用程序将直接渲染到这个屏幕后缓冲里,然后通过等待垂直同步信号的到来再交换到屏幕前缓冲中,这种机制下在下一次渲染时需要等待当前渲染缓冲的释放,会带来阻塞开销,同时往返等待服务器发送渲染缓冲区的过程也会带来性能损失。

随着单位帧内渲染场景的复杂度增加,对渲染缓冲区的需求加大,现阶段3D处理提出了一种称为动态多缓冲区的机制,这种机制使得每一个客户端都使用自己私有的后缓冲,而不是使用单个共享的后缓冲。客户端通过这个私有的后缓冲关联自己的深度缓冲、模板缓冲、颜色缓冲,最后将渲染内容拷贝到屏幕。

该机制重新定义了一个与当前应用客户端关联的缓冲区池,当前应用需要缓冲区进行渲染时就会在该缓冲区池中获取一个新的缓存,通过轮询该缓冲区池中的每一个缓存,找到一个空闲的缓冲区。

动态多缓冲区机制的实现由原来一个缓冲增加到现在的一个缓冲池。一个渲染客户端可以拥有一个或多个缓冲区,这些缓冲区的生命周期就是当前渲染上下文的生命周期。一旦当前渲染上下文销毁后,该缓冲池中的每一个缓存将被释放。

合理分配缓冲区池中缓存的数量,尽量避免3D引擎主动向服务器端轮询消息事件,有效控制往返等待消息事件的时间,使得渲染过程不会因为申请缓存的时间开销而增大渲染周期,给图形渲染带来性能损失。经过不同场景下对图形性能的测试发现,缓冲池中的缓存数量保持在2~3个为最佳。

3.3 存储设备适配

存储设备是指存储控制器,为计算机提供访问外存的控制设备。存储包括许多不同的种类,SATA(Serial Advanced Technology Attachment)控制器用于扩展SATA磁盘,RAID(Redundant Array of Independent Disk)控制器用来搭建RAID,光纤控制器用来扩展ISCSI(Internet Small Computer System Interface)磁盘阵列等。存储设备驱动位于IO栈的底层,其上层是通用块设备层,下层就是具体的存储设备。存储设备驱动接收来自通用块设备层的IO请求,根据IO请求的内容和方向,发送数据给磁盘或从磁盘读取数据传递给上层。

SCSI实现了一种客户机/服务器风格的通信架构。发起者向目标设备发送命令请求,该目标处理此请求并向发起者返回响应。发起者可以是托管计算机中的一个SCSI设备,而SCSI目标则可以是一个磁盘、光盘和磁带设备或特殊设备(比如箱体设备)。

目前,国产平台选用的SATA控制器对命令的支持程度是有局限性的,有一些SCSI命令无法被硬件所识别并响应,特别是针对光驱的一些命令,如读取光盘信息等,这就导致了刻录光盘时无法得到空光盘的信息,进而无法刻录等一系列问题。因此,存储设备适配重点解决SATA控制器对SCSI命令无法被硬件识别的问题。为此,首先找到无法被识别的SCSI命令,并根据SCSI命令手册找到这些命令的作用。然后,把无法识别的命令在驱动命令服务层中进行截流改造,如图4所示,让硬件可以正常返回。

图4 系统命令服务逻辑框架

3.4 RTC驱动模块适配

国产平台主要采用DS1339型号的RTC芯片[16],挂载在I2C0总线下,其作用是为操作系统提供可靠的时间,当系统处于关机的情况下,RTC记录操作系统时间,并可在电池供电情况下继续正常工作,当系统正常启动后,系统可从RTC读取时间信息,来确保关机到开机后时间运行连续性。

为了实现系统对RTC时间的读写操作,需要构建基于DS1339芯片的RTC驱动模型,并且实现对RTC接口的封装以及文件系统下设备节点的创建。用户可以通过操作系统中的设备节点来实现读写RTC时间,具体驱动设计框架如图5所示。

图5 RTC驱动设计框架

主要工作针对图5中的内核空间部分展开。首先,进行设备驱动的注册和初始化工作,包括根据数据手册对DS1339芯片寄存器的初始化;其次,创建设备文件节点,通过class封装函数分别在文件系统下创建sys文件节点,proc文件节点,dev设备节点;最后,针对设备文件节点的操作函数接口封装,让用户通过操作相应的设备文件节点就可以完成对RTC的读写。

由于每次将时间写入RTC芯片的过程中会产生一个时间延迟漂移,根据各芯片特性不同漂移系数会有差别,这是一个隐性问题,比较难以发现。在操作系统的关机过程中,会有一次将系统时间写入RTC的操作,在系统开机加电时再将RTC时间读出,写入系统时间。故而在重启一定次数后,系统时间将会产生比较大的误差,原因是漂移延迟进行了累加。解决办法是在写入RTC过程中加上该芯片的漂移系数。

适配完成的RTC驱动,可以通过date命令设置当前系统时间,通过命令hwclock -w将系统时间写入RTC芯片,通过命令hwclock -r读取当前RTC时间,通过命令hwclock -s将RTC时间覆盖系统时间,观察是否正确。

4 测试验证

为了对上述适配方案进行验证,采用银河麒麟操作系统在鲲鹏服务器上进行,其测试验证平台的软硬件配置如表1所示。

表1 测试验证环境配置

测试验证的内容主要针对麒麟操作系统通过上面的适配方案在鲲鹏服务器上适配后,其固件、处理器、外设等是否适配成功,即相关的固件、处理器、外设是否能够正常使用。

测试方法主要是输入与适配部件相关的命令,如果能够正常查看并使用相关部件,可以认为适配成功并能正常使用,相关测试内容及结果如表2所示。

表2 适配测试及结果

同时,通过表3所示的48小时稳定性测试,来检验适配后的服务器是否能稳定运行。

表3 稳定性测试结果

测试验证结果表明,银河麒麟服务器操作系统V10在TaiShan200-2280v2服务器上适配成功,能满足正常使用需求。

5 结束语

建设国产计算平台是信创建设的基础,是实现国家关键领域国产化替代的关键环节,它首先需要解决国产操作系统在国产服务器上的适配。针对银河麒麟在国产ARM服务器上的适配问题,该文从固件、处理器、网卡、显卡、外部存储、时钟等方面详细阐述,测试验证结果表明,该适配方案能够很好地满足国产操作系统对国产ARM服务器的适配。

下一步将基于国产计算平台建设基于AL平台的国产计算生态,重点在数据库、中间件、关键行业应用软件等方面进行迁移适配。针对国产昇腾AI芯片,下一步也将做相应的适配,满足国内日益增长的人工智能计算需求。通过一系列的数据库、中间件、应用软件适配,希望丰富壮大国产计算生态,有力解决当前关键技术受制于人的被动局面。

猜你喜欢

外设固件网卡
Server 2016网卡组合模式
基于固件的远程身份认证
挑战Killer网卡Realtek网游专用Dragon网卡
提取ROM固件中的APP
读编往来
无线网卡种类有什么区别?
一种通过USB接口的可靠固件升级技术
Microchip推出具备双ADC外设的全新器件,扩展其低成本8位PIC®单片机产品线
多路手机固件升级工具设计
外设天地行情