博客
关于我
linux内存管理-内核用户空间 【转】
阅读量:790 次
发布时间:2023-02-03

本文共 1831 字,大约阅读时间需要 6 分钟。

Linux内存管理详解

1. Linux内存管理中的关键结构体与数组

Linux内存管理是操作系统的核心部分之一,涉及多个重要的结构体和数组。以下是几个关键的结构体及其作用:

  • page

    每个page结构体包含以下字段:

    • flags:一组标志位,用于表示页框所在的管理区。
    • _count:表示该页被引用的次数。
    • _mapcount:表示页框中页表项的数量(若为-1则表示无页表项)。
    • lru:管理页的忙碌或空闲链表,保护区中通过zone->lru_lock锁定。
  • zone

    区管理内存,包含以下字段:

    • free_area:用于标识空闲页框的数组,采用“伙伴系统”实现。
    • zone_pgdat:区的一些属性信息,如指向各个node_zone指针。
    • zone_start_pfn:区在mem_map中的起始页框号。
  • pglist_data

    包含节点管理区描述符数组node_zones,以及zonelist数据结构,用于页分配器的管理。

  • mem_map

    用于内核虚拟地址与物理内存的映射,初始化通过free_area_init_node()alloc_node_mem_map()完成。


2. 各结构体之间的关系

Linux内存管理结构具有高度的层次性和依赖性,主要包括以下关系:

  • zone:是内存管理的基本单位,包含多个free_area
  • pglist_data:描述节点中的管理区和zonelist,为zone管理提供支持。
  • mem_map:将内核虚拟地址与物理内存映射一一对应。

通过这些结构体,内核能够高效地管理物理内存和虚拟地址,实现内存的分配与释放。


3. 主要的内存分配函数

Linux内存分配主要通过以下函数实现:

  • vmalloc

    • 优先使用高端物理内存,但性能上存在一定的开销。
    • 分配的物理页不会被交换。
    • 适用于需要大块连续内存的场景。
  • kmalloc

    • 分配的内核虚拟地址与物理地址存在偏移(如0xC000_0000)。
    • 适用于需要连续物理内存的场景,支持GFP_KERNELGFP_ATOMIC等标志位。
    • 基于伙伴系统实现,具有较好的性能表现。
  • kmap

    • 用于高端物理内存的映射,通常用于设备驱动。
    • 不支持睡眠,适用于不需要频繁释放的场景。
  • get_user_pages

    • 用于从用户空间获取缓冲区地址,适用于大数据量的DMA操作。

4. 内存管理的其他特性

  • gfp_mask

    用于控制内存分配的行为、区和类型修饰。

    • 行为修饰:如GPF_WAIT(允许睡眠)、GPF_IO(允许启动磁盘操作)。
    • 区修饰:指定内存分配的区。
    • 类型修饰:如GFP_KERNEL(内核内存)、GFP_IO(设备内存)。
  • migrate_type

    定义了伙伴系统中页面的迁移类型,用于优化内存碎片。

    • MIGRATE_UNMOVABLE:不可迁移的页面。
    • MIGRATE_RECLAIMABLE:可迁移的页面。
    • MIGRATE_MOVABLE:易于迁移的页面。

5. 用户空间进程内存管理

在用户空间中,内核通过task_structmm_structvm_area_struct等结构体管理进程内存:

  • task_struct:表示一个进程,包含内存管理指针mm
  • mm_struct:表示进程的内存管理,包含多个vm_area_struct
  • vm_area_struct:表示一个虚拟地址区域,包含vm_startvm_end等字段。

6. 虚拟地址的确定

内核通过mem_map将内核虚拟地址与物理内存映射一一对应。虚拟地址的确定主要由编译器完成:

  • 编译器将用户程序的虚拟地址分配到0-3G范围。
  • 内核根据mem_map查找对应的物理地址进行操作。

7. 内核内存管理的核心结构

内核内存管理的核心结构包括:

  • page:表示一个物理内存页。
  • zone:表示内存管理的逻辑区。
  • mem_map:表示内核虚拟地址与物理内存的映射。
  • pglist_data:协调多个zonemem_map的管理。

这些结构体通过伙伴系统和zone管理实现高效的内存分配与释放。


8. 用户空间malloc的实现

用户空间的malloc实现依赖于内核的内存分配功能,通常通过以下步骤完成:

  • 调用brk()系统调用,获取内核虚拟地址。
  • 使用__get_free_pages()分配物理内存。
  • 将物理内存映射到用户空间。
  • 通过这些步骤,用户程序能够获取所需的内存块。

    转载地址:http://xtzfk.baihongyu.com/

    你可能感兴趣的文章
    License授权
    查看>>
    Linq 分组(group by)求和(sum)并且按照分隔符(join)分割列数据
    查看>>
    Linq 合并多个查询条件
    查看>>
    linux centos 安装 docker-compose 1.27.4
    查看>>
    Linux NFS服务器的安装与配置详解
    查看>>
    Linux OpenSSL 生成CA证书及终端用户证书
    查看>>
    linux qt creator arm,Linux 下 PC 與 ARM 版 qt + opencv 環境搭建(Qt Creator)
    查看>>
    LINUX REDHAT第十一单元练习题
    查看>>
    Linux rm 删除指定文件外的其他文件 方法汇总
    查看>>
    Linux uniq学习笔记
    查看>>
    linux 下使用isign 签名ipa包
    查看>>
    Linux 中的 /dev/random 和 /dev/urandom 是什么?
    查看>>
    Linux 中的绝对路径与相对路径:有什么区别?
    查看>>
    Linux 命令
    查看>>
    Linux 命令中 find 和 xargs 命令的用法
    查看>>
    Linux 命令大全
    查看>>
    Linux 学习总结(85)—— 后端开发人员需要知道的 Linux 服务器性能指标总结
    查看>>
    Linux 学习总结(92)—— Linux文件系统的演进之从 Ext2、Ext3 到 Ext4
    查看>>
    Linux 学习笔记__Day2
    查看>>
    linux 安装mysql8.0.x
    查看>>