当前位置: 首页 > news >正文

memblock-1

Ref

http://www.wowotech.net/memory_management/memory-layout.html

memblock将内存块分成两种类型:一种是memory type,另外一种是reserved type,分别用数组来管理系统中的两种类型的memory region。

memblock数组的初始化是根据dts的解析来的,主要解析其chosenmemory以及reserved node

memblock中的那些数组定义的地址都是物理地址

map_mem()函数中,为所有memory type类型的数组创建地址映射的时候,有no-map属性的那段内存地址将不会创建地址映射,也就不在OS的控制范围内了。

memory type region的构建

1、扫描device tree

在完成fdt内存区域的地址映射之后(fixmap_remap_fdt),内核会对fdt进行扫描,以便完成memory type数组的构建。具体代码位于setup_machine_fdt--->early_init_dt_scan--->early_init_dt_scan_nodes中:

void __init early_init_dt_scan_nodes(void)

{

    int rc = 0;

    /* Retrieve various information from the /chosen node */

    rc = of_scan_flat_dt(early_init_dt_scan_chosen, boot_command_line);

    if (!rc)

        pr_warn("No chosen node found, continuing without\n");

    /* Initialize {size,address}-cells info */

    of_scan_flat_dt(early_init_dt_scan_root, NULL);

    /* Setup memory, calling early_init_dt_add_memory_arch */

    of_scan_flat_dt(early_init_dt_scan_memory, NULL);

}

传统的命令行参数解析

early_init_dt_scan_chosen()

memory node解析

early_init_dt_scan_memory()

  1. 解析memory节点,获取内存的基础布局。
  2. memory node的reg属性值其实就是一个数组,数组中的每一个entry都是base address和size的二元组。
  3. 最后,通过early_init_dt_add_memory_arch()将每段内存区域加入memory type region。

2、解析early option: mem

setup_arch--->parse_early_param函数中会对early options解析。我们这里主要关注“mem”option。

/*

 * Limit the memory size that was specified via FDT.

 */

static int __init early_mem(char *p)

{

    if (!p)

        return 1;

    memory_limit = memparse(p, &p) & PAGE_MASK;

    pr_notice("Memory limited to %lldMB\n", memory_limit >> 20);

    return 0;

}

early_param("mem", early_mem);

在ARM64中,由于强制使用device tree,因此mem这个启动参数失去了本来的意义,现在它只是定义了memory的上限(最大的系统内存地址),可以限制DTS传递过来的内存参数。

reserved type region的构建

保留内存的定义主要在fixmap_remap_fdt和arm64_memblock_init函数中进行。

1、保留fdt占用的内存

static void __init setup_machine_fdt(phys_addr_t dt_phys)

{

    void *dt_virt = fixmap_remap_fdt(dt_phys, &size, PAGE_KERNEL);

    if (dt_virt)

        memblock_reserve(dt_phys, size);

    /* Early fixups are done, map the FDT as read-only now */

    fixmap_remap_fdt(dt_phys, &size, PAGE_KERNEL_RO);

}

2、保留内核和initrd占用的内容

void __init arm64_memblock_init(void)

{

    /*

     * Register the kernel text, kernel data, initrd, and initial

     * pagetables with memblock.

     */

    memblock_reserve(__pa_symbol(_text), _end - _text);

    if (IS_ENABLED(CONFIG_BLK_DEV_INITRD) && phys_initrd_size) {

        /* the generic initrd code expects virtual addresses */

        initrd_start = __phys_to_virt(phys_initrd_start);

        initrd_end = initrd_start + phys_initrd_size;

    }

}

3、通过early_init_fdt_scan_reserved_mem函数来保留内存

  1. 分析fdt中的 /memreserve/ fields ,保留每一个/memreserve/ fields定义的memory region。
  2. __fdt_scan_reserved_mem函数,进行reserved-memory节点的扫描,之后调用fdt_init_reserved_mem函数进行内存预留

4、通过命令行参数保留CMA内存

arm64_memblock_init--->dma_contiguous_reserve函数中会根据命令行参数进行CMA内存的保留

http://www.dtcms.com/a/420573.html

相关文章:

  • 云南住房和城乡建设厅网站首页网站建设策划基本流程
  • 深度学习核心技术演进:从函数到 Transformer 架构
  • 圣耀做单网站商城类小程序
  • 仿贴吧的网站网站建设费账务处理
  • 博客网站源码带后台前端电商网站登录界面怎么做
  • 成都网站建设平台郑州建站优化
  • 手机wap网站免费制作中山最好的网站建设公司哪家好
  • 网站阵地建设管理办法微网站建设网站
  • 郑州网站制作哪家便宜租房平台网站开发
  • 详解MySQL中的索引、事务和锁
  • 用cms织梦做网站图文教程网站优化计划
  • [C++项目组件]Etcd的简单介绍和使用
  • 重庆网站排名优化wordpress网页手机版
  • 怎样在手机上做自己的网站不是做有网站都叫狠狠
  • 解锁CRM系统流程优势:重塑企业客户关系管理的核心动能
  • 茂名做网站设计与网站建设案例
  • 文安做网站前端直播网站怎么做
  • 网站建设费可以抵扣么苏州网站建设系统方案
  • 河南省建设教育协会网站首页用asp做的网站有多少
  • 郑州做网站优化地址网站建设播放vr视频教程
  • 广西桂川建设集团网站seo运营招聘
  • JS逆向-代码混淆AST技术抽象语法树Obfuscator混淆还原接口数据节点AI生成
  • 前端开发网站开发wordpress fpm
  • 品牌网站建设怎么样设计深圳网站制作
  • 四川城乡建设官方网站百度网站建设要多少钱
  • 新站seo快速排名 排名58同城app下载安装手机版
  • Kafka 深度剖析:架构演进、核心概念与设计精髓
  • 网站模版 蓝色网站搭建服务平台
  • 网络设计师证书win10优化大师官网
  • 云渲染可以缓解硬件压力,延长使用时间