日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

linux kernel内存管理学习篇

發(fā)布時(shí)間:2025/3/21 linux 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux kernel内存管理学习篇 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

      • 1、DDR的注冊(cè)
        • (1)、在dts中定義了DDR(memory)的范圍
        • (2)、將DDR地址范圍注冊(cè)到linux kernel
      • 2、reserved-memory的注冊(cè)
        • (1)、在dts中定義了reserved-memory的范圍
        • (2)、將reserved memory信息告知給linux kernel


★★★ 友情鏈接 : 個(gè)人博客導(dǎo)讀首頁(yè)—點(diǎn)擊此處 ★★★

1、DDR的注冊(cè)

(1)、在dts中定義了DDR(memory)的范圍

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

(2)、將DDR地址范圍注冊(cè)到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區(qū)域(注意是幾塊DDR區(qū)域,并不是幾塊DDR),大小為1(1<<0)或和CONFIG_NODES_SHIFT值相關(guān)

#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的注冊(cè)

(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; }

總結(jié)

以上是生活随笔為你收集整理的linux kernel内存管理学习篇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。