diff --git a/docs/doc/kernel/mm.md b/docs/doc/kernel/mm.md index ebc2f9d..77fce58 100644 --- a/docs/doc/kernel/mm.md +++ b/docs/doc/kernel/mm.md @@ -18,7 +18,7 @@ ## 前言 -XiUOS操作系统提供了独特的内存管理分配算法进行内存管理,通过静态内存管理和动态内存管理相结合,保证分配和释放内存的实时性,提高内存的使用率,有效地规避了内存碎片问题,同时增加了内存检索的速度。 +XiUOS 操作系统提供了独特的内存管理分配算法进行内存管理,通过静态内存管理和动态内存管理相结合,保证分配和释放内存的实时性,提高内存的使用率,有效地规避了内存碎片问题,同时增加了内存检索的速度。 @@ -31,7 +31,7 @@ XiUOS操作系统提供了独特的内存管理分配算法进行内存管理, #### 静态内存划分 -静态内存包含2个链表。其中,每个链表都具有block_size静态内存块大小、total_count静态内存块的总个数、free_count空闲内存块的总个数和free_list空闲链表这四个属性。 +静态内存包含2个链表,其中,每个链表都具有 block_size、total_count、free_count和free_list 这四个属性。 * block_size 记录了当前链表中每个静态内存块的大小 * total_count 记录了系统初始化之后分配给该链表中静态内存块的总个数 * free_count 记录了该链表中还可以分配给用户静态内存块的个数 @@ -47,24 +47,19 @@ XiUOS操作系统提供了独特的内存管理分配算法进行内存管理, #### 静态内存分配 在用户发起内存分配请求时,若用户请求分配的内存空间大小小于等于预设的静态内存阈值,且所述静态内存区域有相应空闲的内存块,则从静态内存区域分配相应大小的内存空间。 - -在用户发起内存释放请求时,所述分配释放请求解析根据用户提供的内存地址决定后续的操作: -> 如果所述内存地址是不合法的,则直接返回结果给用户。 -> 如果所述内存地址是合法地址,分配释放请求解析模块解析所述内存地址所属内存区域,所述内存地址在静态内存区域,则内存分配任务由静态内存管理模块负责;所述内存地址在动态内存区域,则内存分配任务由动态内存管理模块负责。 - -从静态内存区域分配静态内存块的过程,包括三种情况。 -+ 当用户请求分配内存大小小于等于32字节,那么分配释放请求解析模块解析该内存大小由静态内存管理模块负责。系统获取静态链表头1,从静态链表头1中获取一个静态内存块返回给用户; -+ 当用户请求分配内存大小为33~64字节,那么分配释放请求解析模块解析该内存大小由静态内存管理模块负责。系统获取静态链表头2,从静态链表头2中获取一个静态内存块返回给用户; -+ 若所获得的静态链表头是一个空的链表,即没有空闲的静态内存块可用,那么通知分配释放请求解析模块在静态内存区域中内存分配失败。 +从静态内存区域分配静态内存块的过程,包括三种情况。 ++ 当用户请求分配内存大小小于等于32字节,那么分系统获取静态链表头1,从静态链表头1中获取一个静态内存块返回给用户; ++ 当用户请求分配内存大小为33~64字节,那么系统获取静态链表头2,从静态链表头2中获取一个静态内存块返回给用户; ++ 若所获得的静态链表头是一个空的链表,即没有空闲的静态内存块可用,那么静态内存分配失败。 #### 静态内存释放 -当用户请求释放内存,所述内存用ptr表示,释放操作包括三种情况。 -+ 所述ptr内存地址是不合法的,则直接返回释放操作。 -+ 所述ptr指向的静态内存块属于静态链表头1管理,则将所述ptr指向的静态内存块放置到链表头1的头部; -+ 若所述ptr指向的静态内存块属于链表头2管理,则将所述ptr指向的静态内存块放置到链表头2的头部。 +当用户请求释放内存,释放操作包括三种情况。 ++ 要释放的内存地址是不合法的,则直接返回释放操作; ++ 要释放的内存地址属于静态链表头1区域,则将内存块放置到链表头1的头部; ++ 要释放的内存地址属于链表头2区域,则将内存块放置到链表头2的头部。 @@ -73,7 +68,7 @@ XiUOS操作系统提供了独特的内存管理分配算法进行内存管理, #### 动态内存划分 -静态内存划分后,剩下的内存区域作为动态内存分配给动态内存区域。动态内存区域管理用到了三种重要的数据结构,分别是已分配动态内存段、空闲动态内存段和动态内存管理数据结构。下图显示了已分配动态内存段和空闲动态内存段这两种数据结构。其中,已分配动态内存包括元数据信息和用户的数据段(用户数据),元数据信息中的size属性记录了该动态内存段的内存大小,prev_size属性则记录了该动态内存段前一个相邻动态内存段的内存大小,从而可以获取前一个相邻动态内存段。用户数据则是分配给用户使用的内存空间。空闲动态内存段的元数据信息具有size、prev_size、prev和next这四个属性,其中,size和prev_size属性与已分配动态内存段的对应属性表示的意义相同,prev属性记录了前一个空闲动态内存段,最后一个next属性则记录了下一个空闲动态内存段。 +静态内存划分后,剩下的内存区域作为动态内存分配给动态内存区域。动态内存区域管理用到了三种重要的数据结构,分别是已分配动态内存段、空闲动态内存段和动态内存管理数据结构。下图显示了已分配动态内存段和空闲动态内存段这两种数据结构。其中,已分配动态内存包括元数据信息和用户的数据段(用户数据),元数据信息中的 size 属性记录了该动态内存段的内存大小,prev_size 属性则记录了该动态内存段前一个相邻动态内存段的内存大小,从而可以获取前一个相邻动态内存段。用户数据则是分配给用户使用的内存空间。空闲动态内存段的元数据信息具有 size、prev_size、prev 和 next 这四个属性,其中,size 和 prev_size 属性与已分配动态内存段的对应属性表示的意义相同,prev 属性记录了前一个空闲动态内存段,最后一个 next 属性则记录了下一个空闲动态内存段。