内存分配方法和装置

阅读:0发布:2022-05-01

专利汇可以提供内存分配方法和装置专利检索,专利查询,专利分析的服务。并且本 发明 提供一种内存分配方法和装置,其中,内存分配方法包括:在BIOS初始化完成时,将预留的系统内存所对应的共享内存信息存储在BIOS与 内核 的 接口 结构体中;在内核初始化时,解析接口结构体,获取共享内存信息,并将共享内存信息存储在内核与驱动共享的全局变量中;在驱动初始化时,读取全局变量中的共享内存信息,并将共享内存信息对应的系统内存保留为驱动的私有内存。本发明提供的技术方案,建立了BIOS、内核与驱动之间的通信机制,避免了三者对系统内存的分配不统一的问题,保证了系统的安全性;同时,大大提高了内存分配的灵活性。,下面是内存分配方法和装置专利的具体信息内容。

1.一种内存分配方法,其特征在于,包括:
基本输入输出系统BIOS初始化完成时,将预留的系统内存所对应的共享内存信息存储在BIOS与内核接口结构体中;
在内核初始化时,解析所述接口结构体,获取所述共享内存信息,并将所述共享内存信息存储在内核与驱动共享的全局变量中;
在所述驱动初始化时,读取所述全局变量中的共享内存信息,并将所述共享内存信息对应的系统内存保留为所述驱动的私有内存。
2.根据权利要求1所述的内存分配方法,其特征在于,所述共享内存信息包括预留的系统内存的起始地址和大小。
3.根据权利要求1或2所述的内存分配方法,其特征在于,在内核初始化时,在所述将所述共享内存信息存储在内核与驱动共享的全局变量中之后,所述方法还包括:
进行除预留的系统内存以外的其他系统内存的初始化操作。
4.根据权利要求1或2所述的内存分配方法,其特征在于,在所述驱动初始化时,在所述将所述共享内存信息对应的系统内存保留为所述驱动的私有内存之后,所述方法还包括:
利用所述驱动的私有内存进行驱动初始化操作。
5.根据权利要求1或2所述的内存分配方法,其特征在于,所述将预留的系统内存所对应的共享内存信息存储在BIOS与内核的接口结构体中,具体包括:
在所述接口结构体中增加共享内存域,所述共享内存域用以存储所述共享内存信息。
6.根据权利要求5所述的内存分配方法,其特征在于,所述共享内存域为多个,所述预留的系统内存包括为多个驱动预留的系统内存段,各系统内存段对应的共享内存信息分别存储在各所述共享内存域中。
7.根据权利要求6所述的内存分配方法,其特征在于,所述共享内存信息还包括驱动标识,所述将所述共享内存信息存储在内核与驱动共享的全局变量中,具体包括:
根据所述共享内存信息中的驱动标识,将所述共享内存信息存储在内核与驱动标识对应的驱动共享的全局变量中。
8.一种内存分配装置,其特征在于,包括:
第一处理模,用于在基本输入输出系统BIOS初始化完成时,将预留的系统内存所对应的共享内存信息存储在BIOS与内核的接口结构体中;
第二处理模块,用于在内核初始化时,解析所述接口结构体,获取所述共享内存信息,并将所述共享内存信息存储在内核与驱动共享的全局变量中;
第三处理模块,用于在所述驱动初始化时,读取所述全局变量中的共享内存信息,并将所述共享内存信息对应的系统内存保留为所述驱动的私有内存。
9.根据权利要求8所述的内存分配装置,其特征在于,所述共享内存信息包括预留的系统内存的起始地址和大小。
10.根据权利要求8或9所述的内存分配装置,其特征在于,第二处理模块,还用于在将所述共享内存信息存储在内核与驱动共享的全局变量中之后,进行除预留的系统内存以外的其他系统内存的初始化操作。
11.根据权利要求8或9所述的内存分配装置,其特征在于,所述第三处理模块,还用于在将所述共享内存信息对应的系统内存保留为所述驱动的私有内存之后,利用所述驱动的私有内存进行驱动初始化操作。
12.根据权利要求8或9所述的内存分配装置,其特征在于,所述第一处理模块,具体用于:
在所述接口结构体中增加共享内存域,所述共享内存域用以存储所述共享内存信息。
13.根据权利要求12所述的内存分配装置,其特征在于,所述共享内存域为多个,所述预留的系统内存包括为多个驱动预留的系统内存段,各系统内存段对应的共享内存信息分别存储在各所述共享内存域中。
14.根据权利要求13所述的内存分配装置,其特征在于,所述共享内存信息还包括驱动标识,所述第二处理模块,具体用于:
根据所述共享内存信息中的驱动标识,将所述共享内存信息存储在内核与驱动标识对应的驱动共享的全局变量中。

说明书全文

内存分配方法和装置

技术领域

[0001] 本发明涉及内存分配技术,尤其涉及一种内存分配方法和装置。

背景技术

[0002] 目前,在Linux图形系统中,图形处理器(Graphics Processing Unit,简称GPU)所使用的内存(即显存)有三种分配方式:独立显存、共享显存和独立显存+共享显存的混合模式。其中,共享显存分配方式是在系统内存中分配一部分内存供GPU使用,具体分配的内存大小可以根据实际需要灵活定制,且不需要外接独立的显存颗粒。因此,在目前的芯片级系统(System on Chip,简称SOC)或类SOC系统中,共享显存分配方式被越来越多地采用。
[0003] 现有的共享显存分配方式,具体是通过基本输入输出系统(Basic Input Output System,简称BIOS)或内核保留一段系统内存,GPU驱动使用这段保留的内存作专用显存使用。BIOS、内核和GPU驱动之间没有通信机制,在修改共享显存大小或位置时,需要同时修改BIOS、内核和GPU驱动。
[0004] 现有的这种共享显存分配方式,在修改共享显存大小或位置时,由于BIOS、内核和GPU驱动间没有通信机制,很容易造成三者对系统内存的分配不统一,最终导致系统存在巨大的安全隐患。

发明内容

[0005] 针对现有技术的上述缺陷,本发明提供一种内存分配方法和装置,用以提高系统的安全性。
[0006] 本发明提供一种内存分配方法,包括:
[0007] 在基本输入输出系统BIOS初始化完成时,将预留的系统内存所对应的共享内存信息存储在BIOS与内核的接口结构体中;
[0008] 在内核初始化时,解析接口结构体,获取共享内存信息,并将共享内存信息存储在内核与驱动共享的全局变量中;
[0009] 在驱动初始化时,读取全局变量中的共享内存信息,并将共享内存信息对应的系统内存保留为驱动的私有内存。
[0010] 在本发明的一实施例中,共享内存信息包括预留的系统内存的起始地址和大小。
[0011] 在本发明的一实施例中,在内核初始化时,在将共享内存信息存储在内核与驱动共享的全局变量中之后,方法还包括:
[0012] 进行除预留的系统内存以外的其他系统内存的初始化操作。
[0013] 在本发明的一实施例中,在驱动初始化时,在将共享内存信息对应的系统内存保留为驱动的私有内存之后,方法还包括:
[0014] 利用驱动的私有内存进行驱动初始化操作。
[0015] 在本发明的一实施例中,将预留的系统内存所对应的共享内存信息存储在BIOS与内核的接口结构体中,具体包括:
[0016] 在接口结构体中增加共享内存域,共享内存域用以存储共享内存信息。
[0017] 在本发明的一实施例中,共享内存域为多个,预留的系统内存包括为多个驱动预留的系统内存段,各系统内存段对应的共享内存信息分别存储在各共享内存域中。
[0018] 在本发明的一实施例中,共享内存信息还包括驱动标识,将共享内存信息存储在内核与驱动共享的全局变量中,具体包括:
[0019] 根据共享内存信息中的驱动标识,将共享内存信息存储在内核与驱动标识对应的驱动共享的全局变量中。
[0020] 本发明还一种内存分配装置,包括:
[0021] 第一处理模,用于在基本输入输出系统BIOS初始化完成时,将预留的系统内存所对应的共享内存信息存储在BIOS与内核的接口结构体中;
[0022] 第二处理模块,用于在内核初始化时,解析接口结构体,获取共享内存信息,并将共享内存信息存储在内核与驱动共享的全局变量中;
[0023] 第三处理模块,用于在驱动初始化时,读取全局变量中的共享内存信息,并将共享内存信息对应的系统内存保留为驱动的私有内存。
[0024] 在本发明的一实施例中,共享内存信息包括预留的系统内存的起始地址和大小。
[0025] 在本发明的一实施例中,第二处理模块,还用于在将共享内存信息存储在内核与驱动共享的全局变量中之后,进行除预留的系统内存以外的其他系统内存的初始化操作。
[0026] 在本发明的一实施例中,第三处理模块,还用于在将共享内存信息对应的系统内存保留为驱动的私有内存之后,利用驱动的私有内存进行驱动初始化操作。
[0027] 在本发明的一实施例中,第一处理模块,具体用于:
[0028] 在接口结构体中增加共享内存域,共享内存域用以存储共享内存信息。
[0029] 在本发明的一实施例中,共享内存域为多个,预留的系统内存包括为多个驱动预留的系统内存段,各系统内存段对应的共享内存信息分别存储在各共享内存域中。
[0030] 在本发明的一实施例中,共享内存信息还包括驱动标识,第二处理模块,具体用于:
[0031] 根据共享内存信息中的驱动标识,将共享内存信息存储在内核与驱动标识对应的驱动共享的全局变量中。
[0032] 本发明实施例提供的内存分配方法,通过在BIOS初始化完成时,将预留的系统内存所对应的共享内存信息存储在BIOS与内核的接口结构体中;然后在内核初始化时,解析接口结构体,获取共享内存信息,并将共享内存信息存储在内核与驱动共享的全局变量中;最后在驱动初始化时,读取全局变量中的共享内存信息,并将共享内存信息对应的系统内存保留为驱动的私有内存,建立了BIOS、内核与驱动之间的通信机制,避免了三者对系统内存的分配不统一的问题,保证了系统的安全性;同时,大大提高了内存分配的灵活性。
附图说明
[0033] 图1为本发明提供的内存分配方法的流程示意图;
[0034] 图2为本发明提供的内存分配装置的结构示意图。
[0035] 附图标记说明:
[0036] 10-第一处理模块;
[0037] 20-第二处理模块;
[0038] 30-第三处理模块。

具体实施方式

[0039] 为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0040] 本发明实施例提供的内存分配方法和装置,可以应用于针对GPU的共享显存分配,也可以应用于针对其他设备的共享内存分配,为了便于说明,本发明实施例以针对GPU的共享显存分配为例进行说明。
[0041] GPU是Linux图形系统的运算和控制核心,主要承担输出显示图形的任务;与中央处理器(Central Processing Unit,简称CPU)利用系统内存实现运算和控制功能类似,GPU需要利用显存实现图形显示的运算和控制。GPU使用的显存可以是显卡中的独立显存,也可以是从系统内存中分配的一部分内存(即共享显存),还可以是独立显存+共享显存。本发明实施例提供的内存分配方法和装置可以应用于GPU使用共享显存或独立显存+共享显存的场景。
[0042] 图1为本发明提供的内存分配方法的流程示意图,本实施例的执行主体可以为内存分配装置,该装置可以集成在CPU中,也可以是独立的处理设备。如图1所示,本实施例的方法包括:
[0043] 步骤S101、在BIOS初始化完成时,将预留的系统内存所对应的共享内存信息存储在BIOS与内核的接口结构体中。
[0044] 在BIOS初始化时,BIOS会预留一段系统内存供GPU或其他设备使用,本实施例中,在BIOS初始化完成后,可以将这段预留的系统内存相关的信息(即共享内存信息)存储在BIOS与内核的接口结构体中,从而在进行内核初始化时,内核就可以从该接口结构体中获取到该共享内存信息。其中,BIOS与内核的接口结构体主要用于BIOS给内核传递参数,BIOS将相关参数存储在该接口结构体中,内核就可以从该接口结构体中解析出这些参数以进行后续的处理。为了便于说明,以下实施例中,均以GPU为例进行说明,对应的,共享内存即为共享显存,共享内存信息即为共享显存信息。
[0045] 具体的,共享显存信息(即共享内存信息)可以包括预留的系统内存(即共享显存)的起始地址和大小,还可以包括预留的系统内存的终止地址,本实施例中优选的,共享显存信息包括预留的系统内存的起始地址和大小,以节省存储空间,以下实施例中也以此为例进行说明。上述BIOS与内核的接口结构体中可以包含有各种子结构体,用于实现不同功能的参数传递,本实施例中,在存储共享显存信息时,可以在BIOS与内核的接口结构体的子结构体struct_efi中增加一个共享显存域,该域的成员可以包括用于存储共享显存的起始地址和大小的变量;在BIOS初始化完成后,可以将共享显存的起始地址和大小存储在此域中。
[0046] 步骤S102、在内核初始化时,解析接口结构体,获取共享内存信息,并将共享内存信息存储在内核与驱动共享的全局变量中。
[0047] BIOS初始化完成后,在内核初始化开始时,内核可以通过调用内存初始化函数从接口结构体中解析出共享显存域,得到共享显存的起始地址和大小(即共享内存信息)。然后,内核在进行内存初始化时,可以将该共享内存信息保存在内核与GPU驱动共享的全局变量中,即将该段共享内存分配给GPU驱动使用。具体在实现时,可以在内核中增加一个全局变量,在内核与GPU驱动的约定协议中,可以约定好该全局变量可以被GPU驱动访问,内核将共享显存的起始地址和大小保存在该全局变量中,GPU驱动就可以通过访问该全局变量获取共享显存信息。
[0048] 步骤S103、在驱动初始化时,读取全局变量中的共享内存信息,并将共享内存信息对应的系统内存保留为驱动的私有内存。
[0049] 具体的,在GPU驱动初始化时,GPU驱动可以直接读取全局变量中的共享显存信息(即共享内存信息),获取共享显存的起始地址和大小;GPU驱动在获取到共享显存(即共享内存信息对应的系统内存)的起始地址和大小之后,可以调用函数(例如:dma_declare_coherent_memory)告知系统,该段共享显存为GPU驱动的私有内存,即该段共享显存为GPU驱动专用,GPU驱动可以利用该段共享显存实现图形显示相关的功能。
[0050] 现有共享显存分配方式,BIOS、内核和GPU驱动之间没有通信机制,在修改共享显存大小或位置时,需要同时修改BIOS、内核和GPU驱动,很容易造成三者对系统内存的分配不统一,从而给系统带来安全隐患。本实施例提供的内存分配方法,通过将预留的系统内存所对应的共享内存信息存储在BIOS与内核的接口结构体中,建立了BIOS与内核之间的通信机制;另外,通过将共享内存信息存储在内核与GPU驱动共享的全局变量中,建立了内核与GPU驱动之间的通信机制,从而在修改共享显存大小或位置时,只需要在BIOS中分配出GPU驱动想要的共享显存段,内核和GPU驱动即可获取到该段共享显存的信息,无需同时在内核和GPU驱动中修改,从而避免了三者对系统内存的分配不统一的问题,保证了系统的安全性;同时,共享显存的起始地址和大小只需在BIOS中设定,内核和GPU驱动即可直接获取使用,从而大大提高了共享显存分配的灵活性。
[0051] 本实施例提供的内存分配方法,通过在BIOS初始化完成时,将预留的系统内存所对应的共享内存信息存储在BIOS与内核的接口结构体中;然后在内核初始化时,解析接口结构体,获取共享内存信息,并将共享内存信息存储在内核与驱动共享的全局变量中;最后在驱动初始化时,读取全局变量中的共享内存信息,并将共享内存信息对应的系统内存保留为驱动的私有内存,建立了BIOS、内核与驱动之间的通信机制,避免了三者对系统内存的分配不统一的问题,保证了系统的安全性;同时,大大提高了内存分配的灵活性。
[0052] 在上述实施例中,BIOS预留的系统内存可以供GPU或其他设备使用,即BIOS在为GPU预留系统内存作为共享显存使用的同时,还可以为其他设备预留系统内存作为共享内存使用。作为本发明一种可能的实施方式,共享内存域为多个,预留的系统内存包括为多个驱动预留的系统内存段,各系统内存段对应的共享内存信息分别存储在各共享内存域中。
[0053] 进一步的,共享内存信息还包括驱动标识,则上述步骤S102中将共享内存信息存储在内核与驱动共享的全局变量中,具体包括:根据共享内存信息中的驱动标识,将共享内存信息存储在内核与驱动标识对应的驱动共享的全局变量中。
[0054] 具体的,BIOS在为GPU预留系统内存作为共享显存使用的同时,再为其他设备预留系统内存作为共享内存使用时,可以在BIOS与内核的接口结构体中再增加一个共享内存域,将分配给该设备的系统内存段对应的共享内存信息存储在该域中,同时可以在GPU对应的共享显存域和该设备对应的共享内存域中增加对应的标识信息,例如驱动标识,以告知内核GPU和上述设备对应的系统内存段。内核解析出GPU对应的共享显存域和其他设备对应的共享内存域后,就可以将对应的共享内存信息存储在与对应的设备驱动共享的全局变量中,即将共享显存域对应的共享内存信息存储在内核与GPU驱动共享的全局变量中,将另外一个共享内存域对应的共享内存信息存储在内核与上述设备驱动共享的全局变量中。当GPU驱动和上述设备驱动进行初始化时,则对应读取各自与内核共享的全局变量中的共享内存信息,然后将对应的系统内存段保留为各自的私有内存。上述过程实现了对两个设备的共享内存分配,当然,上述只是作为一种示例,需要分配共享内存的其他设备可以有多个,对应的共享内存域和全局变量也为多个,具体可以根据实际需要设置。
[0055] 在上述实施例的基础上,在本发明的一实施例中,在内核初始化时,在将共享内存信息存储在内核与驱动共享的全局变量中之后,还可以进行除预留的系统内存以外的其他系统内存的初始化操作。
[0056] 具体的,内核在进行内存初始化时,将共享内存信息存储在内核与驱动共享的全局变量中,即将共享显存分配给GPU驱动之后,还可以将能够使用的系统内存(即除预留的系统内存以外的其他系统内存)的起始地址和大小告知系统,实现除共享显存以外的其他系统内存的初始化操作,以完成内核初始化过程中的整个内存初始化过程。
[0057] 另外,在驱动初始化时,在将共享内存信息对应的系统内存保留为驱动的私有内存之后,还可以利用驱动的私有内存进行驱动初始化操作。
[0058] 具体的,GPU驱动在将共享显存保留为私有内存之后,就可以利用这段私有内存进行GPU驱动的初始化操作,例如:申请和释放私有内存的接口函数等,从而为GPU的正常运行提供运行基础。
[0059] 图2为本发明提供的内存分配装置的结构示意图,本实施例的装置可以集成在中央处理器中,也可以是独立的处理设备。如图2所示,本实施例的装置包括:第一处理模块10、第二处理模块20和第三处理模块30,其中:
[0060] 第一处理模块10,用于在BIOS初始化完成时,将预留的系统内存所对应的共享内存信息存储在BIOS与内核的接口结构体中;
[0061] 第二处理模块20,用于在内核初始化时,解析接口结构体,获取共享内存信息,并将共享内存信息存储在内核与驱动共享的全局变量中;
[0062] 第三处理模块30,用于在驱动初始化时,读取全局变量中的共享内存信息,并将共享内存信息对应的系统内存保留为驱动的私有内存。
[0063] 本实施例提供的内存分配装置,可以执行上述方法实施例,其实现原理和技术效果类似,此处不再赘述。
[0064] 在上述实施例中,作为一种可选的实施方式,共享内存信息包括预留的系统内存的起始地址和大小。
[0065] 在上述实施例的基础上,在本发明的一实施例中,第一处理模块10,具体用于:在接口结构体中增加共享内存域,共享内存域用以存储共享内存信息。
[0066] 作为本发明一种可能的实施方式,共享内存域为多个,预留的系统内存包括为多个驱动预留的系统内存段,各系统内存段对应的共享内存信息分别存储在各共享内存域中。
[0067] 进一步的,共享内存信息还包括驱动标识,第二处理模块20,具体用于:根据共享内存信息中的驱动标识,将共享内存信息存储在内核与驱动标识对应的驱动共享的全局变量中。
[0068] 在上述实施例的基础上,在本发明的一实施例中,第二处理模块20,还用于在将共享内存信息存储在内核与驱动共享的全局变量中之后,进行除预留的系统内存以外的其他系统内存的初始化操作。
[0069] 第三处理模块30,还用于在将共享内存信息对应的系统内存保留为驱动的私有内存之后,利用驱动的私有内存进行驱动初始化操作。
[0070] 本实施例提供的装置,可以执行上述方法实施例,其实现原理和技术效果类似,此处不再赘述。
[0071] 最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈