CN104317734A - 一种适用于slab的内存分配方法及装置 - Google Patents
一种适用于slab的内存分配方法及装置 Download PDFInfo
- Publication number
- CN104317734A CN104317734A CN201410707583.1A CN201410707583A CN104317734A CN 104317734 A CN104317734 A CN 104317734A CN 201410707583 A CN201410707583 A CN 201410707583A CN 104317734 A CN104317734 A CN 104317734A
- Authority
- CN
- China
- Prior art keywords
- memory
- user
- region
- block
- slab
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Landscapes
- Techniques For Improving Reliability Of Storages (AREA)
Abstract
本发明公开了一种适用于SLAB的内存分配方法及装置,涉及计算机领域,通过将内存块的使用者信息与分配给用户使用的内存块分离,避免了越界写时使用者信息被改写的问题。本发明实施例提供的SLAB内存分配方法包括:获取一连续的第一内存区域;将所述第一内存区域划分为多个连续的大小相同的内存块;获取一连续的第二内存区域;在所述第二内存区域设置与所述内存块对应的控制块;其中,所述控制块包含:指向所述第一内存区域起始地址的内存块数组指针、所有所述内存块的控制信息组成的控制信息数组、所有所述内存块的使用者信息组成的使用者信息数组。
Description
技术领域
本发明涉及计算机技术领域,尤其涉及一种适用于SLAB的内存分配方法及装置。
背景技术
SLAB是一种在LINUX和类UNIX操作系统内核中广泛使用的内存管理机制,该机制创建一系列SLAB内存池,将从底层内存管理机制分出的大块内存划分为特定大小的内存块放入SLAB内存池中,上层用户请求分配内存时直接从SLAB内存池中分配,上层用户释放内存时将内存释放回SLAB内存池,并通过与该SLAB内存池对应的SLAB控制块以链表方式对SLAB内存池中的每个内存块进行管理。
其中,LINUX内核中的SLAB内存管理机制还可以记录内存块的使用者信息(如使用者调用内存分配接口函数或内存释放接口函数时的指令地址或者调用堆栈信息),以便于使用者利用内存块的使用者信息分析定位内存泄露、越界写、内存未初始化就使用、内存释放后继续使用等内存使用的相关问题(bug)。例如,图1为现有SLAB内存的结构图。如图1所示,包含内存块数组以及控制该内存块数组的SLAB控制块,其中,内存块数组为一段连续的物理内存区域,包含多个内存大小相等的内存块,以及,与内存块相邻的内存块的使用者信息的记录区域,SLAB控制块包含指向内存块数组起始地址的内存块数组指针以及内存块对应的控制信息,其中,控制信息包含内存块的状态信息(如已分配、空闲)。
由于现有SLAB内存管理机制中记录内存块的使用者信息的区域与内存块区域相邻接,当使用者发生内存越界写时,内存块的使用者信息记录通常会被改写,导致记录的信息无效,使得定位内存bug困难。例如,如图1所示,假设用户分配了内存块1,且内存块1的大小为32字节,此时,用户若向内存块1中写入36字节的数据,则会使得多出的4字节数据写入内存块1的使用者信息的区域,使得内存块的使用者信息的记录被改写。
发明内容
本发明的实施例提供一种适用于SLAB的内存分配方法及装置,以解决现有SLAB内存管理机制中,在使用者越界写的情况下,内存块的使用者信息记录被改写的问题。
为达到上述目的,本发明的实施例采用如下技术方案:
第一方面,本发明实施例提供一种适用于SLAB的内存分配方法,包括:
获取一连续的第一内存区域;
将所述第一内存区域划分为多个连续的大小相同的内存块;
获取一连续的第二内存区域;
在所述第二内存区域设置与所述内存块对应的控制块,其中,所述控制块包含:指向所述第一内存区域起始地址的内存块数组指针、所有所述内存块的控制信息组成的控制信息数组、所有所述内存块的使用者信息组成的使用者信息数组。
第二方面,本发明实施例提供一种适用于SLAB的内存分配装置,包括:
获取单元,用于获取一连续的第一内存区域;
划分单元,用于将所述第一内存区域划分为多个连续的大小相同的内存块;
所述获取单元,还用于获取一连续的第二内存区域;
配置单元,用于在所述第二内存区域设置与所述内存块对应的控制块,其中,所述控制块包含:指向所述第一内存区域起始地址的内存块数组指针、所有所述内存块的控制信息组成的控制信息数组、所有所述内存块的使用者信息组成的使用者信息数组。
由上可知,本发明实施例提供的SLAB内存分配方法及装置,与现有技术相比,通过将内存块的使用者信息配置在与内存块对应的控制块中,来实现将内存块区域与记录内存块的使用者信息的区域分离。因为本发明实施例中内存块的使用者信息与分配给用户使用的内存块不相邻,所以,当使用者越界写时,使用者信息不会被破坏,从而有效避免了现有SLAB内存管理机制中,使用者越界写的情况下,内存块的使用者信息记录被改写的问题。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为现有SLAB内存的结构图;
图2为本发明实施例提供的一种适用于SLAB的内存分配方法的流程图;
图3为本发明实施例提供的SLAB内存的结构图;
图3A为本发明实施例提供的SLAB内存的结构图;
图4为本发明实施例提供的一种适用于SLAB的内存分配装置的结构图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
需要说明的是,本发明提供的SALB内存分配方法适用于Linux操作系统,还适用于类UNIX等其他操作系统,本发明对此不进行限制,仅以Linux操作系统的SLAB内存分配方法为例进行说明。在Linux系统中,SLAB内存管理有两部分组成:一是缓存keme_cache(即SLAB内存池),二是SLAB,每一种keme_cache对应一种数据结构,每一个keme_cache包含多个SLAB,每个SLAB包含多个特定大小的内存块,可以缓存多个对象,并且每个SLAB中的对象由与该SLAB对应的控制块通过索引链表方式进行管理。本发明实施例中仅以对一个SLAB的内存分配为例进行说明。
图2为本发明实施例提供的一种适用于SLAB的内存分配方法的流程图,如图2所示,所述方法可以包括:
201、获取一连续的第一内存区域。
优选的,可以从底层内存管理机制(如Linux中的buddy内存管理机制)获取一连续的第一内存区域。
202、将所述第一内存区域划分为多个连续的大小相同的内存块。
其中,每块的大小由该SLAB所属的kmem_cache的对象大小确定。
203、获取一连续的第二内存区域。
优选的,该第二内存区域可以和第一内存区域一起从底层内存管理机制(如Linux中的buddy内存管理机制),也可以从另一kmem_cache获取。
204、在所述第二内存区域设置与所述内存块对应的控制块,其中,所述控制块包含:指向所述第一内存区域起始地址的内存块数组指针、所有所述内存块的控制信息组成的控制信息数组、所有所述内存块的使用者信息组成的使用者信息数组。
其中,所述控制块是一种数据结构,用于记录所述内存块的相关信息;所述内存块的控制信息用于标识内存块的使用情况,包含:已分配、空闲;所述内存块的使用者信息包含使用者调用内存分配的接口函数或释放内存的接口函数时的指令地址、和/或调用堆栈信息;图3为本发明实施例提供的SLAB内存的结构图,如图3所示,控制块中包含指向所述第一内存区域起始地址的内存块数组指针、内存块1的控制信息-内存块4的控制信息、以及内存块1的使用者信息-内存块4的使用者信息;控制头包含第一内存区域(内存块1-内存块4)的起始地址。如此,将内存块的使用者信息存放在控制块中,以避免与内存块区域的连续存放。
优选的,本发明实施例中,在配置控制块时,可以配置与所述内存块数组指针的大小、所述控制信息数组的大小、所述使用者信息数组的大小之和相等的控制块。
此外,为了后期方便读取信息,在配置控制块时,将内存块的控制信息连续存放,组成控制信息数组;将内存块的使用者信息连续存放,组成使用者信息数组。
进一步的,本发明实施例中为了快速的查找到内存块的使用者信息,如图3A所示,在控制块的控制头中还设置有一指向使用者信息数组的起始地址的使用者信息数组指针,以便通过该指针快速查看使用者信息。需要说明的是,该使用者信息数组指针不是必需,因为还可以通过其它方式计算出使用者信息数组的起始地址。
由上可知,本发明实施例提供的SLAB内存分配方法,与现有技术相比,通过将内存块的使用者信息配置在与内存块对应的控制块中,来实现将内存块区域与记录内存块的使用者信息的区域分离。因为本发明实施例中内存块的使用者信息与分配给用户使用的内存块不相邻,所以,当使用者越界写时,使用者信息不会被破坏,从而有效避免了现有SLAB内存管理机制中,使用者越界写的情况下,内存块的使用者信息记录被改写的问题。
图4为本发明实施例提供的一种适用于SLAB的内存分配装置的结构图,如图4所示,所述装置可以包括:
获取单元401,用于获取一连续的第一内存区域。
划分单元402,用于将所述第一内存区域划分为多个连续的大小相同的内存块。
所述获取单元401,用于获取一连续的第二内存区域。
配置单元403,用于在所述第二内存区域设置与所述内存块对应的控制块,其中,所述控制块包含:指向所述第一内存区域起始地址的内存块数组指针、所有所述内存块的控制信息组成的控制信息数组、所有所述内存块的使用者信息组成的使用者信息数组。
其中,所述控制块是一种数据结构,用于记录所述内存块的相关信息;所述内存块的控制信息用于标识内存块的使用情况,包含:已分配、空闲;所述内存块的使用者信息包含使用者调用内存分配的接口函数或释放内存的接口函数时的指令地址、和/或调用堆栈信息;图3为本发明实施例提供的SLAB内存的结构图,如图3所示,控制块中包含指向所述第一内存区域起始地址的内存块数组指针、内存块1的控制信息-内存块4的控制信息、以及内存块1的使用者信息-内存块4的使用者信息。如此,将内存块的使用者信息存放在控制块中,以避免与内存块区域的连续存放。
进一步的,所述获取单元401,具体用于从底层内存管理机制(如Linux中的buddy内存管理机制)获取一连续的第一内存区域以及第二内存区域;其中,第二内存区域也可从另一kmem_cache中获取。
进一步的,所述划分单元402,具体用于将所述内存区域划分为多个连续的大小相同的内存块;每块的大小由该SLAB所属的kmem_cache的对象大小确定。
进一步的,配置单元403,具体用于配置与所述内存块数组指针的大小、所述控制信息数组的大小、所述使用者信息数组的大小之和相等的控制块。
此外,为了后期方便读取信息,在配置控制块时,将内存块的控制信息连续存放,组成控制信息数组;将内存块的使用者信息连续存放,组成使用者信息数组。
进一步的,本发明实施例中为了快速的查找到内存块的使用者信息,如图3A所示,还在控制块中设置有使用者信息数组指针,以便通过该指针快速查看使用者信息。需要说明的是,该使用者信息数组指针不是必需,因为还可以通过其它方式计算出使用者信息数组的起始地址。
由上可知,本发明实施例提供的SLAB内存分配装置,通过将内存块的使用者信息配置在与内存块对应的控制块中,来实现将内存块区域与记录内存块的使用者信息的区域分离。因为本发明实施例中内存块的使用者信息与分配给用户使用的内存块不相邻,所以,当使用者越界写时,使用者信息不会被破坏,从而有效避免了现有SLAB内存管理机制中,使用者越界写的情况下,内存块的使用者信息记录被改写的问题。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。
Claims (8)
1.一种适用于SLAB的内存分配方法,其特征在于,包括:
获取一连续的第一内存区域;
将所述第一内存区域划分为多个连续的大小相同的内存块;
获取一连续的第二内存区域;
在所述第二内存区域设置与所述内存块对应的控制块;其中,所述控制块包含:指向所述第一内存区域起始地址的内存块数组指针、所有所述内存块的控制信息组成的控制信息数组、所有所述内存块的使用者信息组成的使用者信息数组。
2.根据权利要求1所述的SLAB内存分配方法,其特征在于,在所述第二内存区域设置与所述内存块对应的控制块,包括:
在所述第二内存区域设置与所述内存块数组指针的大小、所述控制信息数组的大小、所述使用者信息数组的大小之和相等的控制块。
3.根据权利要求1或2所述的SLAB内存分配方法,其特征在于,
所述控制块还包含指向所述使用者信息数组起始地址的使用者信息数组指针。
4.根据权利要求1-3任一项所述的SLAB内存分配方法,其特征在于,在获取一连续的第一内存区域之前,所述方法还包括:
接收上层用户发送的分配请求,其中,所述分配请求包含用户请求分配的内存大小;
将所述第一内存区域划分为多个连续的大小相同的内存块包括:
将所述内存区域划分为多个连续的、大小与所述用户请求分配的内存大小相等的内存块。
5.一种适用于SLAB的内存分配装置,其特征在于,包括:
获取单元,用于获取一连续的第一内存区域;
划分单元,用于将所述第一内存区域划分为多个连续的大小相同的内存块;
所述获取单元,还用于获取一连续的第二内存区域;
配置单元,用于在所述第二内存区域设置与所述内存块对应的控制块,其中,所述控制块包含:指向所述第一内存区域起始地址的内存块数组指针、所有所述内存块的控制信息组成的控制信息数组、所有所述内存块的使用者信息组成的使用者信息数组。
6.根据权利要求5所述的SLAB内存分配装置,其特征在于,所述配置单元,具体用于:
在所述第二内存区域设置与所述内存块数组指针的大小、所述控制信息数组的大小、所述使用者信息数组的大小之和相等的控制块。
7.根据权利要求5和6所述的SLAB内存分配装置,其特征在于,
所述控制块还包含指向所述使用者信息数组起始地址的使用者信息数组指针。
8.根据权利要求1-3任一项所述的SLAB内存分配装置,其特征在于,
所述获取单元,还用于在获取一连续的第一内存区域之前,接收上层用户发送的分配请求,其中,所述分配请求包含用户请求分配的内存大小;
相应的,所述划分单元,具体用于将所述内存区域划分为多个连续的、大小与所述用户请求分配的内存大小相等的内存块。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410707583.1A CN104317734A (zh) | 2014-11-28 | 2014-11-28 | 一种适用于slab的内存分配方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410707583.1A CN104317734A (zh) | 2014-11-28 | 2014-11-28 | 一种适用于slab的内存分配方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN104317734A true CN104317734A (zh) | 2015-01-28 |
Family
ID=52372969
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410707583.1A Pending CN104317734A (zh) | 2014-11-28 | 2014-11-28 | 一种适用于slab的内存分配方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104317734A (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104951370A (zh) * | 2015-06-02 | 2015-09-30 | 大唐移动通信设备有限公司 | 一种内存管理方法及装置 |
CN105978985A (zh) * | 2016-06-07 | 2016-09-28 | 华中科技大学 | 一种用户态RPC over RDMA的内存管理方法 |
CN106598724A (zh) * | 2015-10-14 | 2017-04-26 | 三星电子株式会社 | 用于在计算系统中管理内存的方法 |
CN108038062A (zh) * | 2017-11-27 | 2018-05-15 | 北京锦鸿希电信息技术股份有限公司 | 嵌入式系统的内存管理方法和装置 |
CN110209595A (zh) * | 2018-02-28 | 2019-09-06 | 贵州白山云科技股份有限公司 | 一种用于管理内存页的方法及装置 |
CN112650577A (zh) * | 2019-10-12 | 2021-04-13 | 龙芯中科技术股份有限公司 | 内存管理方法和装置 |
CN114327879A (zh) * | 2021-12-23 | 2022-04-12 | 中汽创智科技有限公司 | 一种os内核数据对象的提取方法、装置及存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1567249A (zh) * | 2003-06-16 | 2005-01-19 | 华为技术有限公司 | 计算机系统的内存管理方法 |
CN1786926A (zh) * | 2004-12-07 | 2006-06-14 | 华为技术有限公司 | 一种处理器中使用缓存区的方法 |
US20090235017A1 (en) * | 1995-07-31 | 2009-09-17 | Petro Estakhri | Increasing the memory performance of flash memory devices by writing sectors simultaneously to multiple flash memory devices |
-
2014
- 2014-11-28 CN CN201410707583.1A patent/CN104317734A/zh active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20090235017A1 (en) * | 1995-07-31 | 2009-09-17 | Petro Estakhri | Increasing the memory performance of flash memory devices by writing sectors simultaneously to multiple flash memory devices |
CN1567249A (zh) * | 2003-06-16 | 2005-01-19 | 华为技术有限公司 | 计算机系统的内存管理方法 |
CN1786926A (zh) * | 2004-12-07 | 2006-06-14 | 华为技术有限公司 | 一种处理器中使用缓存区的方法 |
Cited By (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104951370A (zh) * | 2015-06-02 | 2015-09-30 | 大唐移动通信设备有限公司 | 一种内存管理方法及装置 |
CN104951370B (zh) * | 2015-06-02 | 2018-08-21 | 大唐移动通信设备有限公司 | 一种内存管理方法及装置 |
CN106598724A (zh) * | 2015-10-14 | 2017-04-26 | 三星电子株式会社 | 用于在计算系统中管理内存的方法 |
CN106598724B (zh) * | 2015-10-14 | 2022-01-14 | 三星电子株式会社 | 用于在计算系统中管理内存的方法 |
CN105978985A (zh) * | 2016-06-07 | 2016-09-28 | 华中科技大学 | 一种用户态RPC over RDMA的内存管理方法 |
CN105978985B (zh) * | 2016-06-07 | 2019-03-05 | 华中科技大学 | 一种用户态RPC over RDMA的内存管理方法 |
CN108038062A (zh) * | 2017-11-27 | 2018-05-15 | 北京锦鸿希电信息技术股份有限公司 | 嵌入式系统的内存管理方法和装置 |
CN108038062B (zh) * | 2017-11-27 | 2021-05-04 | 北京锦鸿希电信息技术股份有限公司 | 嵌入式系统的内存管理方法和装置 |
CN110209595A (zh) * | 2018-02-28 | 2019-09-06 | 贵州白山云科技股份有限公司 | 一种用于管理内存页的方法及装置 |
CN112650577A (zh) * | 2019-10-12 | 2021-04-13 | 龙芯中科技术股份有限公司 | 内存管理方法和装置 |
CN114327879A (zh) * | 2021-12-23 | 2022-04-12 | 中汽创智科技有限公司 | 一种os内核数据对象的提取方法、装置及存储介质 |
CN114327879B (zh) * | 2021-12-23 | 2023-10-27 | 中汽创智科技有限公司 | 一种os内核数据对象的提取方法、装置及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104317734A (zh) | 一种适用于slab的内存分配方法及装置 | |
KR102444832B1 (ko) | 분산된 가상 명칭 공간 관리를 사용한 온-디맨드 스토리지 프로비져닝 | |
US10628043B1 (en) | Systems and methods for implementing a horizontally federated heterogeneous cluster | |
US8639898B2 (en) | Storage apparatus and data copy method | |
JP5510556B2 (ja) | 仮想マシンのストレージスペースおよび物理ホストを管理するための方法およびシステム | |
US8984248B2 (en) | Data migration system and data migration method | |
CN103080895B (zh) | 包括具有存储虚拟化功能和容量虚拟化功能二者的多个存储装置的存储系统 | |
JP4464378B2 (ja) | 同一データを纏める事で格納領域を節約する計算機システム、ストレージシステム及びそれらの制御方法 | |
TWI533152B (zh) | 資料儲存裝置及方法 | |
US8868622B2 (en) | Method and apparatus for allocating resources in a computer system | |
US20160011811A1 (en) | Managing Capacity of a Thinly Provisioned Storage System | |
US20170075614A1 (en) | Memory system and host apparatus | |
CN103577345A (zh) | 提高由多个系统共享的存储高速缓存灵活性的方法和结构 | |
JP7467593B2 (ja) | リソース割振り方法、記憶デバイス、および記憶システム | |
JP5915378B2 (ja) | ストレージ装置およびストレージ装置の制御方法 | |
US20090300315A1 (en) | Reserve Pool Management in Virtualized Storage Systems | |
CN107783812B (zh) | 虚拟机内存管理方法及装置 | |
WO2013140446A1 (en) | Storage apparatus and method thereof for fast creation of a eager zeroed virtual disk by allocation of pre -zeroed storage areas | |
EP2836900B1 (en) | Creating encrypted storage volumes | |
CN104252419B (zh) | 一种内存分配的方法及装置 | |
US10922276B2 (en) | Online file system check | |
US20130111127A1 (en) | Storage system and data processing method in storage system | |
US9529538B1 (en) | Virtual accounting container for supporting small volumes of data | |
US20120066466A1 (en) | Storage system storing electronic modules applied to electronic objects common to several computers, and storage control method for the same | |
US9329788B2 (en) | Computer system and method for allocating and recovering virtual volumes |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20150128 |