国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

淺淺講解下Linux內(nèi)存管理之CMA

2022-12-13 17:47 作者:補給站Linux內(nèi)核  | 我要投稿

說明:

  1. Kernel版本:4.14

  2. ARM64處理器,Contex-A53,雙核

  3. 使用工具:Source Insight 3.5, Visio

1. 概述

Contiguous Memory Allocator, CMA,連續(xù)內(nèi)存分配器,用于分配連續(xù)的大塊內(nèi)存。CMA分配器,會Reserve一片物理內(nèi)存區(qū)域:

  1. 設備驅(qū)動不用時,內(nèi)存管理系統(tǒng)將該區(qū)域用于分配和管理可移動類型頁面;

  2. 設備驅(qū)動使用時,用于連續(xù)內(nèi)存分配,此時已經(jīng)分配的頁面需要進行遷移;

此外,CMA分配器還可以與DMA子系統(tǒng)集成在一起,使用DMA的設備驅(qū)動程序無需使用單獨的CMA API。

2. 數(shù)據(jù)結構

內(nèi)核定義了struct cma結構,用于管理一個CMA區(qū)域,此外還定義了全局的cma數(shù)組,如下:

  • base_pfn:CMA區(qū)域物理地址的起始頁幀號;

  • count:CMA區(qū)域總體的頁數(shù);

  • *bitmap:位圖,用于描述頁的分配情況;

  • order_per_bit:位圖中每個bit描述的物理頁面的order值,其中頁面數(shù)為2^order值;

來一張圖就會清晰明了:

圖片


【文章福利】小編推薦自己的Linux內(nèi)核技術交流群:【749907784】整理了一些個人覺得比較好的學習書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實戰(zhàn)項目及代碼)? ? ??

3. 流程分析

3.1 CMA區(qū)域創(chuàng)建

3.1.1 方式一 根據(jù)dts來配置

之前的文章也都分析過,物理內(nèi)存的描述放置在dts中,最終會在系統(tǒng)啟動過程中,對dtb文件進行解析,從而完成內(nèi)存信息注冊。

CMA的內(nèi)存在dts中的描述示例如下圖:

圖片

dtb解析過程中,會調(diào)用到rmem_cma_setup函數(shù):

圖片

3.1.2 方式二 根據(jù)參數(shù)或宏配置

可以通過內(nèi)核參數(shù)或配置宏,來進行CMA區(qū)域的創(chuàng)建,最終會調(diào)用到cma_declare_contiguous函數(shù),如下圖:

圖片

3.2 CMA添加到Buddy System

在創(chuàng)建完CMA區(qū)域后,該內(nèi)存區(qū)域成了保留區(qū)域,如果單純給驅(qū)動使用,顯然會造成內(nèi)存的浪費,因此內(nèi)存管理模塊會將CMA區(qū)域添加到Buddy System中,用于可移動頁面的分配和管理。CMA區(qū)域是通過cma_init_reserved_areas接口來添加到Buddy System中的。


core_initcall(cma_init_reserved_areas);

core_initcall宏將cma_init_reserved_areas函數(shù)放置到特定的段中,在系統(tǒng)啟動的時候會調(diào)用到該函數(shù)。

圖片

3.3?CMA分配/釋放

  • CMA分配,入口函數(shù)為cma_alloc

圖片
  • CMA釋放,入口函數(shù)為cma_release:函數(shù)比較簡單,直接貼上代碼

3.4?DMA使用

代碼參考driver/base/dma-contiguous.c,主要包括的接口有:

在上述的接口中,實際調(diào)用的就是cma_alloc/cma_release接口來實現(xiàn)的。

整體來看,CMA分配器還是比較簡單易懂,也不再深入分析。


原文作者:LoyenWang


淺淺講解下Linux內(nèi)存管理之CMA的評論 (共 條)

分享到微博請遵守國家法律
太湖县| 高要市| 新兴县| 梧州市| 阳东县| 灵川县| 河源市| 镇平县| 阿克陶县| 北票市| 汉寿县| 沁阳市| 大余县| 绥芬河市| 怀来县| 西城区| 旬邑县| 郴州市| 建德市| 阿瓦提县| 高陵县| 中阳县| 赤峰市| 馆陶县| 海南省| 台安县| 威信县| 安阳市| 秦皇岛市| 满城县| 汕尾市| 平定县| 清新县| 佛冈县| 沁源县| 澄城县| 县级市| 平江县| 安陆市| 南投县| 绍兴县|