news 2026/6/10 10:04:20

linux 内存初始化过程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
linux 内存初始化过程

背景 工作中内存子系统相关的问题主要聚焦在内存分配、内存回收,本文记录内存初始化的学习过程,加深对linux内核子系统的理解。

源码版本 linux 5.10

架构 arm64

主要带着两个问题去学习:

1、内核是如何确认及获取物理内存大小的;

2、物理内存是如何被添加到buddy系统。

一、内核是如何确认及获取物理内存大小的

通过dts中配置的memory字段

内存 通过memblock_add添加到memblock中

start_kernel

setup_arch

setup_machine_fdt(__fdt_pointer)

early_init_dt_scan

early_init_dt_scan_nodes

early_init_dt_scan_memory

early_init_dt_add_memory_arch

memblock_add

memblock_add_range(&memblock.memory, base, size, MAX_NUMNODES, 0)

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; bool hotpluggable; /* We are scanning "memory" nodes only */ if (type == NULL || 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)); hotpluggable = of_get_flat_dt_prop(node, "hotpluggable", NULL); 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); if (!hotpluggable) continue; if (early_init_dt_mark_hotplug_memory_arch(base, size)) pr_warn("failed to mark hotplug range 0x%llx - 0x%llx\n", base, base + size); } return 0; }

struct memblock

struct memblock_type memory;

struct memblock_region *regions;

struct memblock_type memory;

struct memblock_region *regions;

二、内存如何添加到buddy子系统

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 9:58:13

终极指南:在64位Windows上无缝运行16位应用程序的完整解决方案

终极指南:在64位Windows上无缝运行16位应用程序的完整解决方案 【免费下载链接】winevdm 16-bit Windows (Windows 1.x, 2.x, 3.0, 3.1, etc.) on 64-bit Windows 项目地址: https://gitcode.com/gh_mirrors/wi/winevdm 在64位Windows系统中运行经典的16位应…

作者头像 李华
网站建设 2026/6/10 9:51:23

4、【AI产品经理概述】AI产品经理的核心价值

很多团队在引入 AI 能力时,往往陷入一个误区:认为只要有了大模型接口,产品就能自动变聪明。结果却是 demo 很惊艳,上线后用户抱怨不断,要么回答胡言乱语,要么根本解决不了实际业务痛点。这背后的核心差距&a…

作者头像 李华
网站建设 2026/6/10 9:41:10

166.各大品牌Bootloader解锁机制对比|华为/小米/OPPO/vivo/一加/苹果差异

摘要 本文系统阐述主流品牌手机刷机维修的底层原理与标准化操作流程。覆盖华为、小米、OPPO、vivo、一加及苹果六类设备,从Bootloader解锁、Recovery模式操作到固件刷写与底层数据恢复,提供可直接运行的Python脚本辅助校验固件完整性。文章严格遵循工程逻辑,所有步骤均经过…

作者头像 李华