linux kernel物理内存概述(二)

news2024/11/15 13:21:17

目录

物理内存数据结构

设备数物理内存描述

物理内存映射

map_kernel

map_mem

zone数据结构 

zone类型


物理内存数据结构

  • 站在处理器角度,管理物理内存的最小单位是页面。使用page数据结构描述,通常默认大小4kB,采用mem_map[]数组来存放这些page数据结构,数组与物理内存由一一对应关系。

设备数物理内存描述

  • 在设备树dts中,定义内存的起始地址,大小 如VExpress平台 ;qemu虚拟机内存的描述在 hw/arm/virt.c文件中
    memory@60000000{
        device_type = "memory";
        reg = <0x60000000 0x40000000>;
    }

dts文件的解析 start_kernel->setup_arch->setup_machine_fdt->early_init_dt_scan_nodes->early_init_dt_scan_memory

void __init early_init_dt_add_memory_arch(u64 base, u64 size)
{
	int in_use = 0;

	low_mem_sz = size;
	in_use = 1;
	memblock_add_node(base, size, 0, MEMBLOCK_NONE);
}

memblock_add_node添加到memblock子系统中

物理内存映射

在内核使用之前,需要初始化内核页表,paging_init 函数完成,主要做两次映射,map_kernel与map_mem

void __init paging_init(void)
{
	pgd_t *pgdp = pgd_set_fixmap(__pa_symbol(swapper_pg_dir));
	map_kernel(pgdp);
	map_mem(pgdp);
}

都是建立物理地址到内核虚拟地址的线性映射,但映射的地址不一样

map_kernel
  1. map_kernel映射内核镜像到内核空间的虚拟地址 该函数对内核映像的各个段分别进行映射,映射的内核空间虚拟地址为vmalloc区域; vmalloc区域的范围从0xFFFF 0000 1000 0000 到 0xFFFF 7DFF BFFF 0000
    • 代码段:从_text到_etext
    • 只读数据段:从__start_rodata到__inittext_begin;
    • 初始化代码段:
    • 初始化数据段:
    • 数据段:从_data到_end
map_mem
  1. map_mem做物理内存的线性映射。 映射三段物理内存到线性映射区。线性映射区的范围从0xFFFF 8000 0000 0000 到0xFFFF FFFF FFFF FFFF,大小为128TB 为什么把第三段物理内存单独拿出来映射? 这三段物理内存都会被映射到 不可执行 的属性,但是后续代码里把第三段映射的属性设置成 只读 ,防止后续的其他内核模块不经意地修改了代码,如CPU休眠机制。另外,第一段和第二段映射启用了连续页表属性(PTE_CONT),单独把第三段映射拎出来可以避免连续页表特性映像第三段的映射。

对页表的初始化完成后,内核可以对内存进行管理,内核采样zone管理区来管理。

zone数据结构 

struct zone {
	/* Read-mostly fields */

	/* zone watermarks, access with *_wmark_pages(zone) macros */
	unsigned long _watermark[NR_WMARK];//每个zone在系统启动时会计算出3个水位,最低警戒水位,低水位和高水位,在页面分配器和kswapd页面回收中用到
	unsigned long watermark_boost;

	unsigned long nr_reserved_highatomic;

	long lowmem_reserve[MAX_NR_ZONES];//防止页面分配器过度使用低端zone的内存

#ifdef CONFIG_NUMA
	int node;
#endif
	struct pglist_data	*zone_pgdat;//指向内存节点
	struct per_cpu_pages	__percpu *per_cpu_pageset;
	struct per_cpu_zonestat	__percpu *per_cpu_zonestats;

	int pageset_high_min;
	int pageset_high_max;
	int pageset_batch;

#ifndef CONFIG_SPARSEMEM
	/*
	 * Flags for a pageblock_nr_pages block. See pageblock-flags.h.
	 * In SPARSEMEM, this map is stored in struct mem_section
	 */
	unsigned long		*pageblock_flags;
#endif /* CONFIG_SPARSEMEM */

	/* zone_start_pfn == zone_start_paddr >> PAGE_SHIFT*/
       unsigned long		zone_start_pfn;//起始页帧号
        atomic_long_t		managed_pages;//被伙伴系统管理的页面数量
	unsigned long		spanned_pages;//zone包含的页面数量
	unsigned long		present_pages;//实际管理的页面数量
#if defined(CONFIG_MEMORY_HOTPLUG)
	unsigned long		present_early_pages;
#endif
#ifdef CONFIG_CMA
	unsigned long		cma_pages;
#endif

	const char		*name;
        ...
	atomic_long_t		vm_stat[NR_VM_ZONE_STAT_ITEMS];
	atomic_long_t		vm_numa_event[NR_VM_NUMA_EVENT_ITEMS];
} ____cacheline_internodealigned_in_smp;

  • zone经常被访问到,因此数据结构使用L1高速缓存对齐;CACHELINE_PADDING 为了性能,填充对齐空间
zone类型

内核的zone分为ZONEDMA、ZONEDMA32、ZONENORMAL和 ZONEHIGHMEM

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1490477.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(每日持续更新)jdk api之PipedWriter基础、应用、实战

博主18年的互联网软件开发经验&#xff0c;从一名程序员小白逐步成为了一名架构师&#xff0c;我想通过平台将经验分享给大家&#xff0c;因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验&#xff0c;晚上进行用心精简、整理、总结、定稿&…

合作的终极策略,竟如此有数学规律?《多Agent系统引论》第6章 多Agent交互 原文注释

6.0 前言 本文介绍一下多Agent交互过程中的一些概念&#xff0c;并且我保证能给你在人类社会中的工作生活学习带来启发。 6.1 效用和偏好 6.1.1 不知道什么是效用&#xff1f;那我告诉你什么是边际效应递减&#xff01; 想象一个人&#xff0c;他总资产只有1块钱&#xff0c;…

Vue前端+快速入门【详解】

目录 1.Vue概述 2. 快速入门 3. Vue指令 4.表格信息案例 5. 生命周期 1.Vue概述 1.MVVM思想 原始HTMLCSSJavaScript开发存在的问题&#xff1a;操作麻烦&#xff0c;耦合性强 为了实现html标签与数据的解耦&#xff0c;前端开发中提供了MVVM思想&#xff1a;即Model-Vi…

什么是 End-to-End 测试?

在使用 vue 的模板创建新项目的时候&#xff0c;有一个选项是问&#xff0c;是否添加“端到端”测试&#xff1f;说实在我不知道&#xff0c;而且三个选项一个都不认识。 ? Add an End-to-End Testing Solution? › - Use arrow-keys. Return to submit. ❯ NoCypressNigh…

QChart柱状图

//柱状图// 创建柱状图数据QBarSet *set0 new QBarSet("");*set0 << 1601 << 974 << 655 << 362;QBarSeries *series new QBarSeries();series->append(set0);set0->setColor(QColor("#F5834B"));// 创建柱状图QChart *ch…

基于springboot+vue的美食烹饪互动平台

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Anthropic

文章目录 关于 Anthropic公司产品anthropic-sdk-python 基本使用 关于 Anthropic 官网&#xff1a;https://www.anthropic.comhuggingface : http://huggingface.co/Anthropicgithub : https://github.com/anthropics https://github.com/anthropics/anthropic-sdk-python官方…

【MySQL】深入解析日志系统:undo log、redo log、bin log

文章目录 前言1、undo log1.1、undo log 是什么1.2、事务回滚 2、redo log2.1、redo log 是什么2.2、redo log 刷盘2.3、redo log 硬盘文件 3、bin log3.1、bin log 是什么3.2、bin log 和 redo log 区别3.3、bin log 刷盘3.4、两阶段提交 前言 MySQL数据库提供了功能强大的日…

6.3 业务分析方法 (15%)

一、业务分析方法 1、客户分析 用户从哪里来到哪里去&#xff1b;来源于各个渠道&#xff1b; 分析: 投入产出比&#xff1a;微博&#xff1e;公众号 展示量&#xff1a;微博低于公众号&#xff1b;若增加品牌曝光率&#xff0c;可用公众号渠道 跳失率&#xff1a;微博低于公…

C# Winform画图绘制圆形

一、因为绘制的圆形灯需要根据不同的状态切换颜色,所以就将圆形灯创建为用户控件 二、圆形灯用户控件 1、创建用户控件UCLight 2、设值用户控件大小(30,30)。放一个label标签,AutoSize为false(不自动调整大小),Dock为Fill(填充),textaglign为居中显示。 private Color R…

【leetcode】删除链接的倒数第N个节点

/*** Definition for singly-linked list.* function ListNode(val, next) {* this.val (valundefined ? 0 : val)* this.next (nextundefined ? null : next)* }*/ /*** param {ListNode} head* param {number} n* return {ListNode}*/ var removeNthFromEnd fun…

赋能中国制造,大道云行发布智能制造分布式存储解决方案

《中国制造2025》指出&#xff0c;“制造业是国民经济的主体&#xff0c;是立国之本、兴国之器、强国之基。” 智能制造引领产业提质增效 智能制造是一种利用先进的信息技术、自动化技术和智能技术来优化和升级制造业生产过程的方法。它将人工智能、大数据、物联网、机器学习等…

3DEXPERIENCE Works八大核心优势分析

云技术正在加速普及&#xff0c;助力各行各业数字化转型。根据IDC 2023年12月发布的报告&#xff0c;2023年全球云计算市场规模达到3329亿美元&#xff0c;同比增长19.4%。其中&#xff0c;公有云市场规模达到2587亿美元&#xff0c;同比增长21.5%;私有云市场规模达到742亿美元…

深度学习500问——Chapter02:机器学习基础(3)

文章目录 2.10 主成分分析&#xff08;PCA&#xff09; 2.10.1 主成分分析&#xff08;PCA&#xff09;思想总结 2.10.2 图解PCA核心思想 2.10.3 PCA算法推理 2.10.4 PCA算法流程总结 2.10.5 PCA算法主要优缺点 2.10.6 降维的必要性及目的 2.10.7 KPCA与PCA的区别 2.11 模型评估…

JavaScript基础2之运算符、函数

JavaScript基础 运算符一元操作符递增/递减一元加和减 布尔操作符逻辑非逻辑与逻辑或 乘性操作符乘法操作符除法操作符取模操作符 加性操作符加法操作符减法操作符 比较操作符相等操作符关系操作符 函数函数声明函数表达式箭头函数函数的实参和形参arguments 默认参数参数的拓展…

vue 使用vue-scroller 列表滑动到底部加载更多数据

安装插件 npm install vue-scroller -dmain.js import VueScroller from vue-scroller Vue.use(VueScroller)<template><div class"wrap"><div class"footer"><div class"btn" click"open true">新增</d…

1.2计算机体系结构与存储系统-2

1.编址的相关计算 存1个1或1个0的单位是位&#xff08;bit&#xff09;&#xff1b; 内存是按字节&#xff08;byte&#xff09;编址的&#xff1b; 1byte8bit&#xff1b; 如果有4096个字节的内存&#xff0c;想要表示内存地址的话需要多少位&#xff1f; 0-4095&#xff08;…

项目总体测试计划word

1. 引言 1.1 目的 1.2 适用范围 2. 测试类型 2.1 集成测试 2.2 系统测试 2.3 验收测试 2.4 回归测试 3. 测试环境 4. 测试工具 5. 测试内容 5.1 集成测试 5.1.1 集成测试角色与职责 5.1.2 集成测试产生的工作产品清单 5.2 系统测试 5.2.1 系统测试的角色与职责 5.2.2 系统测试产…

双缝实验是量子力学的重要基石之一

双缝实验是物理学界的基石&#xff0c;特别是对于量子力学来讲。理解这个实验需要结合直觉、数学以及对量子理论抽象且奇异的现实的接受。 一、双缝实验的基础知识 双缝实验证明了波粒二象性的概念&#xff0c;这是量子粒子的基本属性。量子粒子同时具有粒子和波的性质。 在这…

【鸿蒙 HarmonyOS 4.0】登录流程

一、背景 登录功能在应用中是一个常用模块&#xff0c;此次使用 HarmonyOS 实现登录流程&#xff0c;包含页面呈现与网络请求。 二、页面呈现 三、实现流程 3.1、创建项目 构建一个ArkTS应用项目(Stage模型)&#xff0c;今天创建流程可查看官网教程&#xff1a;文档中心 目…