Linux 内核 内存管理内存管理架构 ④ ( 内存分配系统调用过程 | 用户层 malloc free | 系统调用层 brk mmap | 内核层 kmalloc | 内存管理流程 )

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 内核 内存管理内存管理架构 ④ ( 内存分配系统调用过程 | 用户层 malloc free | 系统调用层 brk mmap | 内核层 kmalloc | 内存管理流程 )相关的知识,希望对你有一定的参考价值。

文章目录





一、内存分配系统调用过程 ( 用户层 | 系统调用 | 内核层 )



" 堆内存 " 动态分配 的 系统调用 过程 :

① 用户应用程序调用 : 开发者 在 " 用户空间 “ 的 应用程序 中调用 malloc 等函数 , 申请 动态分配 ” 堆内存 " ,

② 系统调用 : 用户空间 的 内存管理函数 调用 " 内核与用户层接口 “ 中的 brk sbrk mmap munmap 等函数 , 这些函数就是 ” 系统调用 " 函数 ; 系统调用接口 是 用户层的 malloc 函数 与 内核层的 vmalloc 函数之间的 桥梁 ;

③ 内核层调用 : 内核与用户层接口 的 内存管理函数 调用 " Linux 内核 " 中的 kmalloc vmalloc 函数 ;


C 语言中使用 malloc free 等函数分配堆内存 , C++ 中使用的 new delete 关键字管理内存 , 其本质还是调用 malloc free 函数实现的内存管理 ;





二、内存管理流程



内存管理流程 :

① 用户层 ( 用户空间 ) 内存管理 :

  • C 语言 : 在 C 中 , 使用 malloc 动态分配 " 堆内存 " , 使用 free 回收 " 堆内存 " ;
  • C++ 语言 : 在 C++ 中 , 使用 new 关键字 动态分配 " 堆内存 " , 使用 delete 关键字 回收 " 堆内存 " ;
  • C++ STL : STL 中 , 堆内存 是 自动分配 , 自动回收 的 , 不需要用户进行手动操作 ;

② 系统调用接口 内存管理 : 调用 brk sbrk mmap munmap 等系统调用函数 ,

  • brk sbrk 函数 既可以分配内存 , 又可以回收内存 , 通过 修改 起始 和 终止 地址即可实现 ;
  • mmap 函数用于分配内存 , munmap 函数用于回收内存 ;

可参考 【Linux 内核 内存管理】Linux 内核堆内存管理 ② ( 动态分配堆内存方式 | brk 系统调用 | mmap 系统调用 | brk 系统调用源码介绍 ) 博客 , 了解 brk 和 mmap 系统调用 ;

  • brk 系统调用 : 该方式本质是 设置 " 进程数据段 “结束地址 , 将该 ” 结束地址 "高或低 移动 , 实现堆内存的 扩张或收缩 ;

  • mmap 系统调用 : 向 Linux 操作系统 申请 " 虚拟地址空间 " 内存 , 并且将某个文件 " 映射 “ 到该申请的内存中 ; 如果 不需要映射文件 到该空间中 , 则该空间就是 ” 匿名空间 " , 可作为 " 堆内存 " 使用 ;


③ 内核层 ( 内核空间 ) 内存管理 : 在 Linux 内核中 , 通过 kmalloc vmalloc __get_free_pages 函数管理内存 ;

以上是关于Linux 内核 内存管理内存管理架构 ④ ( 内存分配系统调用过程 | 用户层 malloc free | 系统调用层 brk mmap | 内核层 kmalloc | 内存管理流程 )的主要内容,如果未能解决你的问题,请参考以下文章

Linux 内核 内存管理Linux 内核内存布局 ④ ( ARM64 架构体系内存分布 | 内核启动源码 start_kernel | 内存初始化 mm_init | mem_init )

Linux 内核 内存管理虚拟地址空间布局架构 ④ ( 内存描述符 mm_struct 结构体成员分析 | hiwater_rss | start_code | start_brk )

Linux 内核 内存管理虚拟地址空间布局架构 ④ ( 内存描述符 mm_struct 结构体成员分析 | hiwater_rss | start_code | start_brk )

Linux 内核 内存管理内存管理系统调用 ④ ( 代码示例 | mmap 创建内存映射 | munmap 删除内存映射 )

Linux 内核 内存管理分区伙伴分配器 ④ ( 备用内存区域列表排序方式 | 节点优先顺序 | 区域优先顺序 | 排序方式优缺点 | 默认排序方式 )

Linux 内核 内存管理虚拟地址空间布局架构 ② ( 用户虚拟地址空间组成 | 内存描述符 mm_struct 结构体源码 )