目录

  • 1、DDR的注册
    • (1)、在dts中定义了DDR(memory)的范围
    • (2)、将DDR地址范围注册到linux kernel
  • 2、reserved-memory的注册
    • (1)、在dts中定义了reserved-memory的范围
    • (2)、将reserved memory信息告知给linux kernel

★★★ 友情链接 : 个人博客导读首页—点击此处 ★★★

1、DDR的注册

(1)、在dts中定义了DDR(memory)的范围

memory@0 {device_type = "memory";reg = <0x0 0x80000000 0x2 0x0>;
};

(2)、将DDR地址范围注册到linux kernel

early_init_dt_scan_memory()
early_init_dt_scan_memory() —> early_init_dt_add_memory_arch(base, size) —> memblock_add(base, size)—>memblock_add_region(base, size, MAX_NUMNODES, 0)

(driver/of/fdt.c)
/*** early_init_dt_scan_memory - Look for an parse memory nodes*/
int __init early_init_dt_scan_memory(unsigned long node, const char *uname,int depth, void *data)
{const char *type = of_get_flat_dt_prop(node, "device_type", NULL);const __be32 *reg, *endp;int l;/* We are scanning "memory" nodes only */if (type == NULL) {/** The longtrail doesn't have a device_type on the* /memory node, so look for the node called /memory@0.*/if (!IS_ENABLED(CONFIG_PPC32) || depth != 1 || strcmp(uname, "memory@0") != 0)return 0;} else if (strcmp(type, "memory") != 0)return 0;reg = of_get_flat_dt_prop(node, "linux,usable-memory", &l);if (reg == NULL)reg = of_get_flat_dt_prop(node, "reg", &l);if (reg == NULL)return 0;endp = reg + (l / sizeof(__be32));pr_debug("memory scan node %s, reg size %d,\n", uname, l);while ((endp - reg) >= (dt_root_addr_cells + dt_root_size_cells)) {u64 base, size;base = dt_mem_next_cell(dt_root_addr_cells, &reg);size = dt_mem_next_cell(dt_root_size_cells, &reg);if (size == 0)continue;pr_debug(" - %llx ,  %llx\n", (unsigned long long)base,(unsigned long long)size);early_init_dt_add_memory_arch(base, size);}return 0;
}

MAX_NUMNODES表示有几块DDR区域(注意是几块DDR区域,并不是几块DDR),大小为1(1<<0)或和CONFIG_NODES_SHIFT值相关

#define MAX_NUMNODES    (1 << NODES_SHIFT)#ifdef CONFIG_NODES_SHIFT
#define NODES_SHIFT     CONFIG_NODES_SHIFT
#else
#define NODES_SHIFT     0
#endif

2、reserved-memory的注册

(1)、在dts中定义了reserved-memory的范围

reserved-memory {#address-cells = <1>;#size-cells = <1>;ranges;/* global autoconfigured region for contiguous allocations */linux,cma {compatible = "shared-dma-pool";reusable;size = <0x4000000>;alignment = <0x2000>;linux,cma-default;};display_reserved: framebuffer@78000000 {reg = <0x78000000 0x800000>;};multimedia_reserved: multimedia@77000000 {compatible = "acme,multimedia-memory";reg = <0x77000000 0x4000000>;};};/* ... */fb0: video@12300000 {memory-region = <&display_reserved>;/* ... */};scaler: scaler@12500000 {memory-region = <&multimedia_reserved>;/* ... */};codec: codec@12600000 {memory-region = <&multimedia_reserved>;/* ... */};

(2)、将reserved memory信息告知给linux kernel

__fdt_scan_reserved_mem()
__fdt_scan_reserved_mem() —> __reserved_mem_reserve_reg() —> early_init_dt_reserve_memory_arch(base, size, nomap)—>memblock_reserve(base, size) —> memblock_reserve_region(base, size, MAX_NUMNODES, 0)

(driver/of/fdt.c)
/*** fdt_scan_reserved_mem() - scan a single FDT node for reserved memory*/
static int __init __fdt_scan_reserved_mem(unsigned long node, const char *uname,int depth, void *data)
{static int found;const char *status;int err;if (!found && depth == 1 && strcmp(uname, "reserved-memory") == 0) {if (__reserved_mem_check_root(node) != 0) {pr_err("Reserved memory: unsupported node format, ignoring\n");/* break scan */return 1;}found = 1;/* scan next node */return 0;} else if (!found) {/* scan next node */return 0;} else if (found && depth < 2) {/* scanning of /reserved-memory has been finished */return 1;}status = of_get_flat_dt_prop(node, "status", NULL);if (status && strcmp(status, "okay") != 0 && strcmp(status, "ok") != 0)return 0;err = __reserved_mem_reserve_reg(node, uname);if (err == -ENOENT && of_get_flat_dt_prop(node, "size", NULL))fdt_reserved_mem_save_node(node, uname, 0, 0);/* scan next node */return 0;
}

linux kernel内存管理学习篇相关推荐

  1. Linux kernel内存管理之OOM相关参数

    一.OOM概念 OOM是Out Of Memory(内存溢出)的缩写,虽然linux kernel的内存管理有很多机制(从cache中回收.swap out等)可以满足用户空间的各种虚拟内存需求,但是 ...

  2. linux kernel内存管理之/proc/meminfo下参数介绍

    一.前言 /proc/meminfo是了解Linux系统内存状态的主要接口,里面统计了当前系统各类内存的使用状况,需要注意的是:这是从内核的角度来统计.我们常用的free,vmstat等指令都是通过/ ...

  3. linux按进程分配物理内存,linux下内存管理学习心得(一)

    最近在学习内存管理的时候,发现对linux下的所谓内存如何管理如何分配都不熟悉,通过最近的查阅资料可总结如下,如有不妥之处欢迎大家批评与指正. 总的的来说linux的内存管理其实主要难理解的是以下几个 ...

  4. linux kernel 内存管理 感想总结(未完待续)

    理解内存管理需要知道的概念 什么是 MMU , MMU的作用? 什么是页帧,页,页表,区,他们之间的关系又是怎样的 ? 什么是页的高速缓存 地址线, 寻址, cpu 和 各级高速缓存的关系, cpu ...

  5. Android/Linux Kernel 内存管理-入门笔记

    Android/Linux Kernel上下層的記憶體管理機制,由於牽涉到基礎,核心與使用者空間的Framework,這系列的文章會分為幾個單元,依據筆者自己的時間安排,逐一分享出來,並希望對各位有所 ...

  6. Linux内存管理学习资料

    下面是Linux内存管理学习的一些资料. 博客 mlock() and mlockall() system calls. All about Linux swap space 逆向映射的演进 Linu ...

  7. 郝健: Linux内存管理学习笔记-第5节课

    前序文章: 郝健: Linux内存管理学习笔记-第1节课 郝健: Linux内存管理学习笔记-第2节课 郝健: Linux内存管理学习笔记-第3节课 郝健: Linux内存管理学习笔记-第4节课 摘要 ...

  8. 郝健: Linux内存管理学习笔记-第6节课

    前序文章: 郝健: Linux内存管理学习笔记-第1节课 郝健: Linux内存管理学习笔记-第2节课 郝健: Linux内存管理学习笔记-第3节课 郝健: Linux内存管理学习笔记-第4节课 郝健 ...

  9. 郝健: Linux内存管理学习笔记-第4节课

    前序文章: 郝健: Linux内存管理学习笔记-第1节课 郝健: Linux内存管理学习笔记-第2节课 郝健: Linux内存管理学习笔记-第3节课 摘要 page cache free命令的详细解释 ...

最新文章

  1. 大学生只会用C语言写简单的计算怎么办?
  2. 基于linux的netfilter处理数据包的过程分析,基于Linux的Netfilter处理数据包的过程分析...
  3. jvm性能调优实战 - 26一个每秒10万并发的系统如何频繁发生Young GC的
  4. rtos与linux软件开发,实时Linux和RTOS的基本特性及技术进行比较
  5. mysql把游标数据存入表中_mysql数据库怎么使用游标
  6. oracle result_cache_max_size,当设置RESULT_CACHE_MAX_SIZE参数并且重启过database后,Query Result Cache 还是被禁用的。...
  7. 微信小程序swiper高度自适应,swiper的子元素高度不固定
  8. python 关于Python看金庸小说的实验
  9. java excel图表_Java 创建Excel图表
  10. Win10 封装报错处理
  11. 空间解析几何基础总结
  12. hdu5208 Where is Bob 数位dp
  13. Android使用Socket.IO实现即时通讯
  14. Echarts饼图无法切换漏斗图问题处理
  15. matlab多元二次分析,Matlab篇----常用的回归分析Matlab命令(regress篇)
  16. ACM里的期望和概率问题 从入门到精(入)通(土)
  17. QT华视身份证读卡器二次开发(获取姓名身份证号)
  18. GSM模块TCP初始化流程
  19. Daily News for Stock Market Prediction(股市预测日报)
  20. 关于IDFA、CAID和「5. 1.2 - Data use sharing」

热门文章

  1. ftp上传当天文件的方法_五种方法将文件上传到FTP服务器
  2. “疫”不容辞,数据中心的“逆行之道”
  3. 6.7级地震!北海道数据中心陷最长停电危机!
  4. 多雨季节 数据中心亦要“防汛”
  5. 如何查看dll被那个service占用_不小心执行 rm -f,该如何恢复?
  6. CV之detectron2:detectron2的简介、安装、使用方法之详细攻略
  7. Matlab:成功解决Function definition are not permitted at the prompt or scripts
  8. Matlab:利用Matlab编程实现模拟分子布朗运动的动画展示
  9. Ubuntu20.04中安装shutter
  10. Nginx与安全有关的几个配置