Linux内核内存大小

Linux内核内存大小,在ARM Linux中,各种设备的相关属性描述都采用DTS方式来呈现。DTS是device tree source的简称,最早是由PowerPC等其他体系结构使用的FDT(Flattened Device Tree)转变过来的,ARM Linux社区自2011年被Linus Torvalds公开批评之后开始全面支持DTS,并且删除了大量的冗余代码。

在ARM Vexpress平台中,内存的定义在vexpress-v2p-ca9.dts文件中。该DTS文件定义了内存的起始地址为0x60000000,大小为0x40000000,即1GB大小内存空间。

      [arch/arm/boot/dts/vexpress-v2p-ca9.dts]

          memory@60000000 {
              device_type = "memory";
              reg = <0x60000000 0x40000000>;
          };

内核在启动的过程中,需要解析这些DTS文件,实现代码在early_init_dt_scan_memory()函数中。代码调用关系为:start_kernel()->setup_arch()->setup_machine_fdt()->early_init_dt_scan_nodes()->early_init_dt_scan_memory()。

      [drivers/of/fdt.c]

      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;

            if (strcmp(type, "memory") ! = 0)
                return 0;

            reg = of_get_flat_dt_prop(node, "reg", &l);
            endp = reg + (l / sizeof(__be32));

            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;
                early_init_dt_add_memory_arch(base, size);
            }

            return 0;
      }

解析“memory”描述的信息从而得到内存的base_address和size信息,最后内存块信息通过early_init_dt_add_memory_arch ()->memblock_add()函数添加到memblock子系统中。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!