ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

第 4 章 内存管理:4.1 memory 的 alloc 和 free

第 4 章 内存管理:4.1 memory 的 alloc 和 free

内存分配是 libhsakmt 内存管理的起点:后续的 GPU 映射(map)、注册(register)与导出均以分配阶段建立的虚拟地址和vm_object_t为前提;同时,它也是分支最多的环节,同一入口需要根据标志组合区分系统内存与显存、APU 与 dGPU,以及是否预留地址、是否创建物理后备。本文以hsaKmtAllocMemoryAlignCtx为主线,自顶向下剖析一次内存分配请求如何依据HsaMemFlags确定虚拟地址布局、物理后备来源与向 KFD 发出的 ioctl,逐层说明每一层的核心函数、关键数据结构与设计取舍。


1. 总体结构

在深入各个函数之前,先从全局视角看一次分配请求经过哪些层次、在哪里分叉、又在哪里汇合。图 1 按自上而下的顺序给出了完整的调用结构。

图 1 libhsakmt 内存分配的分层结构

图中自上而下的四条色带分别对应接口层、管理层、收敛层与内核 KFD。接口层的各入口汇聚到hsaKmtAllocMemoryAlignCtx,经校验与派发后分入管理层的 Scratch(紫)、host(绿)、device(红)三列;各列中需要 KFD 创建 BO 的分支在收敛层汇合,最终落到三个 ioctl 之一。虚线框表示只预留虚拟地址、不创建 BO 的分支。各层的分工如下:

返回列表