System.ArgumentOutOfRangeException: 索引和长度必须引用该字符串内的位置。 参数名: length 在 System.String.Substring(Int32 startIndex, Int32 length) 在 zhuanliShow.Bind() 一种基于BIOS PCI链路实现物理内存共享的方法技术_技高网

一种基于BIOS PCI链路实现物理内存共享的方法技术

技术编号:42090453 阅读:4 留言:0更新日期:2024-07-19 17:04
本发明专利技术提供一种基于BIOS PCI链路实现物理内存共享的方法,包括:步骤S1,启动时,通过申请连续物理内存空间作为内存映射空间;步骤S2,在BIOS启动过程中,通过PCIE总线获取VGA设备配置信息;步骤S3,通过UEFI函数读取设备地址;步骤S4,读取和解析所述基地址寄存器BAR的值,通过基地址寄存器BAR使能寄存器P2A的桥通道和重新映射基址;步骤S5,通过mmap()内存映射函数映射从0x98E00000地址开始的内存映射空间实现读写操作。本发明专利技术将BMC申请的连续物理内存空间的内存地址映射到主系统CPU中,实现BIOS数据、BMC数据以及Redfish数据的共享,满足实际的数据交互需求。

【技术实现步骤摘要】

本专利技术涉及一种内存共享方法,尤其涉及一种基于bios pci链路实现物理内存共享的方法。


技术介绍

1、随着科技的迅速进步,服务器业务需求不断上升,对服务器的易操作性、性能和功能希求都在持续提升。通过基板管理控制器(baseboard managementcontroller,即bmc)远程管理服务器,使用ipmi和redfsih实现远程管理。而bmc后端将持续处理ipmi大量事务严重降低bmc性能,目前普遍通过在bmc系统中开辟一块物理内存缓存作为bios和redfish数据存储缓存,用于减少ipmi带外管理和redfish频繁调用ipmi指令,提升数据交互响应和bmc性能指数。

2、在一些应用场景下,bmc需要与主机的服务器cpu)之间交互大量数据,主机指的是运行基本输入输出系统(basic input output system,即bios)。这两者之间的通信,主要使用的是ipmi(intelligent platform management interface)。ipmi是独立于主机系统cpu、bios/uefi和os之外,可独立运行的板上部件,其核心部件即为bmc(intelligentplatform management interface,ipmi)协议。

3、由于ipmi协议的串行交互方式,使得基于ipmi协议的交互方案需要阻塞等待当前ipmi命令返回执行结果后,才会继续发送下一个ipmi命令,一旦当前ipmi命令阻塞等待时间过长,容易造成主机任务阻塞。而且,ipmi协议的串行交互方式也导致该交互方案不支持批量下发数据,数据交互效率低,命令响应速度慢。此外,bios采用单线程的运行机制,阻塞等待期间无法运行其他模块,也进一步延长了主机启动时间。

4、redfish是一种基于https服务的管理标准,利用restful接口实现设备管理。每个https操作都以utf-8编码的json格式(json是一种key-value对的数据格式)提交或返回一个资源或结果,就像web应用程序向浏览器返回html一样。该技术具有降低开发复杂性的优势,易于实施和使用,而且提供了可扩展性优势,为设计灵活性预留了空间。

5、redfish部署在bmc上的好处是可以远程管理服务器,包括开机、重启、关机、查看状态等。同时,redfish还可以实现bios post(power-on self-test,上电自检)、固件下载和上传等功能,包括用户管理、获取服务器信息、管理模块信息、bios配置。虽然redfish功能强大,但是,其底层也是基于ipmi指令方式完成,会存在上面所述ipmi的传输效率低等弊端,交互量过大还将导致处理能力下降等问题,不能很好地满足实际的应用需求。

6、因此需要一种替代ipmi数据的交互数据方式,以满足实际的数据交互需求。


技术实现思路

1、本专利技术所要解决的技术问题是需要提供一种基于bios pci链路实现物理内存共享的方法,旨在通过内存映射空间实现bios数据、bmc数据以及redfish数据的共享,满足实际的数据交互需求。

2、对此,本专利技术提供一种基于bios pci链路实现物理内存共享的方法,包括以下步骤:

3、步骤s1,在linux系统内核启动时,通过申请物理内存ddr4从0x98e00000地址处偏移预设大小的连续物理内存空间,以此连续物理内存空间作为内存映射空间;

4、步骤s2,在bios启动过程中,通过pcie总线获取vga设备的配置信息;

5、步骤s3,通过uefi函数读取设备地址,获取基地址寄存器bar的数据;

6、步骤s4,读取和解析所述基地址寄存器bar的值,确定设备所需的地址空间范围和映射信息,通过基地址寄存器bar使能寄存器p2a的桥通道和重新映射基址;

7、步骤s5,在linux系统中初始化应用程序,通过mmap()内存映射函数映射从0x98e00000地址开始的内存映射空间,在所述内存映射空间的内存区域实现读写操作。

8、本专利技术的进一步改进在于,所述预设大小的连续物理内存空间指的是2mbyte的内存映射空间。

9、本专利技术的进一步改进在于,所述步骤s1中,通过内存管理的memblock_reserve()函数在linux系统内核启动时预留一段预设大小的连续物理内存空间,并对其物理内存块进行标记,标记为已保留。

10、本专利技术的进一步改进在于,所述步骤s2包括以下步骤:

11、步骤s201,通过uefi函数的locatehandlebuffer()服务函数在uefi固件中遍历查找支持pci i/o协议的vga设备,并返回vga设备对应的设备句柄列表和设备数量;

12、步骤s202,通过设备句柄列表和设备数量在系统中枚举pcie设备信息;

13、步骤s203,通过uefi函数的第一数据读取函数从pci设备的配置空间中读取数据,读取设备地址pcis00所返回的vga设备信息。

14、本专利技术的进一步改进在于,所述步骤s203中,所述第一数据读取函数为pciio->pci.read(pciio,efipciiowidthuint32,0,1,&data32),其中,pciio表示指向efi_pci_io_protocol的指针,用于访问pci设备的i/o功能;参数efipciiowidthuint32表示数据读取的宽度,单位为字节;参数0表示读取的偏移量;参数1表示读取的数据数量;参数&data32表示指向32位数据变量的指针,用于存储读取到的数据。

15、本专利技术的进一步改进在于,所述步骤s3中,通过uefi函数的第二数据读取函数读取设备地址pcis14,获取基地址寄存器bar的数据。

16、本专利技术的进一步改进在于,所述第二数据读取函数为pciio->pci.read(pciio,efipciiowidthuint32, 0 ,1,&pcis14),其中,参数&pcis14表示指向设备地址pcis14的指针。

17、本专利技术的进一步改进在于,所述步骤s4包括以下步骤:

18、步骤s401,在基地址寄存器bar加上保护密钥寄存器p2a00的偏移赋值为1;并加上重新映射基址寄存器p2a04的偏移赋值,该偏移赋值为内存映射的地址0x98e00000;

19、步骤s402,通过基地址寄存器bar加上0x10000的地址空间以获取到内存重映射的首地址内存空间,把当前地址赋值给一个用于操作内存的指针;

20、步骤s403,返回所述指针,所述指针用于对内存进行读写操作。

21、本专利技术的进一步改进在于,所述步骤s5包括以下子步骤:

22、步骤s501,通过open() 函数打开内存字符设备驱动,返回一个文件句柄;

23、步骤s502,通过本文档来自技高网...

【技术保护点】

1.一种基于BIOS PCI链路实现物理内存共享的方法,其特征在于,包括以下步骤:

2.根据权利要求1所述的基于BIOS PCI链路实现物理内存共享的方法,其特征在于,所述预设大小的连续物理内存空间指的是2Mbyte的内存映射空间。

3.根据权利要求1或2所述的基于BIOS PCI链路实现物理内存共享的方法,其特征在于,所述步骤S1中,通过内存管理的memblock_reserve()函数在Linux系统内核启动时预留一段预设大小的连续物理内存空间,并对其物理内存块进行标记,标记为已保留。

4.根据权利要求1或2所述的基于BIOS PCI链路实现物理内存共享的方法,其特征在于,所述步骤S2包括以下步骤:

5.根据权利要求4所述的基于BIOS PCI链路实现物理内存共享的方法,其特征在于,所述步骤S203中,所述第一数据读取函数为PciIo->Pci.Read(PciIo,EfiPciIoWidthUint32,0,1,&Data32),其中,PciIo表示指向EFI_PCI_IO_PROTOCOL的指针,用于访问PCI设备的I/O功能;参数EfiPciIoWidthUint32表示数据读取的宽度,单位为字节;参数0表示读取的偏移量;参数1表示读取的数据数量;参数&Data32表示指向32位数据变量的指针,用于存储读取到的数据。

6.根据权利要求5所述的基于BIOS PCI链路实现物理内存共享的方法,其特征在于,所述步骤S3中,通过UEFI函数的第二数据读取函数读取设备地址PCIS14,获取基地址寄存器BAR的数据。

7.根据权利要求6所述的基于BIOS PCI链路实现物理内存共享的方法,其特征在于,所述第二数据读取函数为PciIo->Pci.Read(PciIo,EfiPciIoWidthUint32, 0 ,1,&PCIS14),其中,参数& PCIS14表示指向设备地址PCIS14的指针。

8.根据权利要求1或2所述的基于BIOS PCI链路实现物理内存共享的方法,其特征在于,所述步骤S4包括以下步骤:

9.根据权利要求1或2所述的基于BIOS PCI链路实现物理内存共享的方法,其特征在于,所述步骤S5包括以下子步骤:

10.根据权利要求9所述的基于BIOS PCI链路实现物理内存共享的方法,其特征在于,所述步骤S502中,通过内存映射指令mmap(NULL,0x200000,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0x98E00000)将文件或设备映射到进程的虚拟内存空间中,用于访问文件内容或对特定的物理内存进行读写操作;其中,0x200000表示要映射的字节数;PROT_READ |PROT_WRITE表示对映射的内存区域可以进行读取和写入操作;MAP_SHARED表示映射的内存可被其他进程共享,并且对映射内存的修改会映射回底层对象;fd表示要映射的文件描述符,指向要进行映射的对象;0x98E00000表示映射的起始物理内存地址。

...

【技术特征摘要】

1.一种基于bios pci链路实现物理内存共享的方法,其特征在于,包括以下步骤:

2.根据权利要求1所述的基于bios pci链路实现物理内存共享的方法,其特征在于,所述预设大小的连续物理内存空间指的是2mbyte的内存映射空间。

3.根据权利要求1或2所述的基于bios pci链路实现物理内存共享的方法,其特征在于,所述步骤s1中,通过内存管理的memblock_reserve()函数在linux系统内核启动时预留一段预设大小的连续物理内存空间,并对其物理内存块进行标记,标记为已保留。

4.根据权利要求1或2所述的基于bios pci链路实现物理内存共享的方法,其特征在于,所述步骤s2包括以下步骤:

5.根据权利要求4所述的基于bios pci链路实现物理内存共享的方法,其特征在于,所述步骤s203中,所述第一数据读取函数为pciio->pci.read(pciio,efipciiowidthuint32,0,1,&data32),其中,pciio表示指向efi_pci_io_protocol的指针,用于访问pci设备的i/o功能;参数efipciiowidthuint32表示数据读取的宽度,单位为字节;参数0表示读取的偏移量;参数1表示读取的数据数量;参数&data32表示指向32位数据变量的指针,用于存储读取到的数据。

6.根据权利要求5所述的基于bios pci链路实现物理内存共享的方法,其特征在于,所述步骤s3中,通过...

【专利技术属性】
技术研发人员:赵金波
申请(专利权)人:深圳市国鑫恒运信息安全有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1