当前位置: 首页 > news >正文

Linux内核源码分析 (B.1)内核内存布局和堆管理

Linux内核源码分析 (B.1)内核内存布局和堆管理

文章目录

  • Linux内核源码分析 (B.1)内核内存布局和堆管理
  • 一、Linux内核内存布局
  • 二、堆管理

一、Linux内核内存布局

  • 64位Linux一般使用48位来表示虚拟地址空间,45位表示物理地址。通过命令:cat/proc/cpuinfo。查看Linux内核位数和proc文件系统输出系统软硬件信息如下:

    lh@LH_LINUX:~$ cat /proc/cpuinfo
    vendor_id	: GenuineIntel	// CPU制造商
    cpu family	: 6 			// CPU产品代号
    model		: 165			// CPU属于其系列当中的哪一个代号
    model name	: Intel(R) Core(TM) i7-10875H CPU @ 2.30GHz // CPU属于的名称、编号、主频
    stepping	: 2				// CPU属于制作更新版本
    cpu MHz		: 2303.999		//CPU实际使用主频
    cache size	: 16384 KB		//CPU二级缓存
    physical id	: 0				//单个CPU的标号
    siblings	: 2				//单个CPU逻辑物理核数
    core id		: 0				//当前物理核在其所处的CPU中编号
    cpu cores	: 2				//逻辑核所在CPU的物理核数
    apicid		: 0				//用来区分不同逻辑核的编号
    bogomips : 4607.99 			//系统内核启动时测算的CPU速度
    clflush size : 64			//每次刷新缓存的大小单位
    cache_alignment : 64 		//缓存地址空间对齐单位
    address sizes : 45 bits physical. 48 bits virtual // 可以访问的地址空间位数
    
  • 通过cat/proc/meminfo输出系统架构内存分布情况,具体如下

    lh@LH_LINUX:~$ cat /proc/meminfo
    MemTotal: 12165668 kB 		//所有可用内存空间的大小
    MemFree: 10151616 kB 		//系统还没有使用内存
    MemAvailable: 10570548 kB	//真正系统可用内存
    Buffers: 52596 kB 			//专用用来给块设备做缓存的内存
    Cached: 575008 kB 			//分配给文件缓冲区的内存
    SwapCached: 0 kB 			//被高速缓冲缓存使用的交换空间大小
    Active: 1158808 kB 			//使用高速缓冲存储器页面文件大小
    Inactive: 345196 kB 		//没有经常使用的高速缓存存储器大小
    Active(anon): 870720 kB 	//活跃的匿名内存
    Inactive(anon)12504 kB 	//不活跃的匿名内存
    Active(file): 288088 kB 	//活跃的文件使用内存
    Inactive(file): 332692 kB 	//不活跃的文件使用内存
    Unevictable: 16kB			//不能被释放的内存页
    Mlocked: 16 kB 			//系统调用mlock允许程序在物理内存上锁住部分或全部地址空间
    SwapTotal: 2097148 kB 		//交换空间总内存大小
    SwapFree: 2097148 kB 		//交换空间空闲的内存大小
    Dirty: 24 kB 				//等待被写回到磁盘
    Writeback: 0 kB 			//正在被写加的大小
    AnonPages: 876420 kB 		//未映射页的内存/映射到用户空间的非文件页表大小
    Kipped: 255420 kB 			//映射文件内存
    Shmem: 13896 kB 			//已经被分配的共享内存
    KReclaimabie: 70884 kB 		//可回收的slab内存
    Slab: 151976 kB				//内存数据结构缓存大小
    CommitLimit: 8179980 kB 	//系统实际可以分配内存
    Committed_AS: 4649264 kB 	//系统当前已经分配的内存
    VmallocTotal: 34359738367 kB//预留虚拟内存的总量
    VmallocUsed: 27836 kB 		//已经被使用的虚拟内存
    VmallocChunk: 0 kB 			//可分配的最大逻辑地址连续的虚拟内存
    
  • Linux内核动态内存分配通过系统接口实现

    • alloc_pages/_get_free_page:以页为单位分配
    • vmalloc:以字节为单位分配虚拟地址连续的内存块
    • kmalloc:以字节为单位分配物理地址连续的内存块,它是以slab为中心
  • 我们也可以通过vmalloc分配的内存将它统计输出,具体如下:
    在这里插入图片描述

  • ARM64架构采用48位物理寻址方式,最大可寻找256TB的物理地址空间。对于目前应用完全足够,不需要扩展到64位。虚拟地址也同样最大支持48位寻址。Linux内核在大多数体系结构上将地址空间划为:用户空间和内核空间。

    • 用户空间(User space) : 0x0000_0000_0000_00000x0000_FFFF_FFFF_FFFF
    • 内核空间(Kernel space) : 0xFFFF_0000_0000_00000xFFFF_FFFF_FFFF_FFFF
      在这里插入图片描述
      • KASAN (影子区):它是一个动态检测内存错误的工具,原理利用额外的内存标记可用内存的状态(将1/8内存作为影子区);
      • modules:内核模块使用的虚拟地址空间;
      • vmallocvmalloc函数使用的虚拟地址空间
      • .text:代码段
      • .init:模块初始化数据
      • .data:数据段
      • bss:静态内存分配段
      • fixed:固定映射区域
      • PCI I/OPCI设备的I/O地址空间
      • vmemmap:内存的物理地址如果不连续的话,就会存在内存空洞(稀疏内存)vmemmap就用来存放稀疏内存的page结构体的数据的虚拟地址空间
      • memory:线性映射区域
    • 我们可以打印出ARM64体系结构的Linux内存布局(Linux内核初始化完成后,整体布局稳定。通过Vexpress平台输出即可,因为我们暂时没有环境,所以先通过源码分析打印流程。
      start_kernel() ==> mm_init() ==>mem_init() ==> printk(...)

二、堆管理

  • 堆是进程中主要用于动态分配变量和数据的内存区域,堆的管理对应程序员不是直接可见的。malloc和内核之间的经典接口是brk系统调用,负责拓展/收缩堆。堆是一个连续的内存区域,在拓展时自下至上增长。其中mm_struct结构,包含堆在虚拟地址空间中的起始和当前结束地址(start_brkbrk)。

    struct mm_struct{...unsigned long start_brk,brk,start_stack;...
    }
    
  • brk系统调用指定堆在虚拟地址空间中新的结束地址(如果堆将要收缩,当然可以小于当前值)。brk系统调用动态分配,具体Linux内核源码分析如下

    SYSCALL_DEFINE1(brk, unsigned long, brk){...
    }
    
  • Linux系统当中有两个方法可以创建堆:

    • brk()是系统调用,实际是设置进程数据段的结束地址,将数据段的结束地址向高地址移动。
    • mmap()向操作系统申请一段虚拟地址空间(使用映射到某个文件)。当不用此空间来映射到某个文件时,这块空间称为匿名空间可以用来作为堆空间。
  • per-cpu计数器,引入它用来加速SMP系统上计数器工作,Linux具体内核源码如下:

    #ifdef CONFIG_SMPstruct percpu_counter {spinlock_t lock;s64 count;
    #ifdef CONFIG_HOTPLUG_CPUstruct list_head list;	/* All percpu_counters are on a list */
    #endifs32 *counters;
    };
    
    • 采用per-cpu变量有下列好处:所需数据很可能存在于处理器的缓存中,因此可以更快速地访问。如果在多处理器系统中使用可能被所有CPU同时访问的变量,可能会引发一些通信方面的问题,采用上述概念刚好绕过了这些问题。

相关文章:

Linux内核源码分析 (B.1)内核内存布局和堆管理

Linux内核源码分析 (B.1)内核内存布局和堆管理 文章目录 Linux内核源码分析 (B.1)内核内存布局和堆管理一、Linux内核内存布局二、堆管理 一、Linux内核内存布局 64位Linux一般使用48位来表示虚拟地址空间,45位表示物理地址。通过命令:cat/proc/cpuinfo。…...

Python---函数

函数定义: """ def 函数名(传入参数):函数体return 返回值 """ 函数调用: """ 函数名(传入参数) """ 例子: # 不带参 def check():print("欢迎光临\n请进") che…...

Myvatis关联关系映射与表对象之间的关系

目录 一、关联关系映射 1.1 一对一 1.2 一对多 1.3 多对多 二、处理关联关系的方式 2.1 嵌套查询 2.2 嵌套结果 三、一对一关联映射 3.1 建表 ​编辑 3.2 配置文件 3.3 代码生成 3.4 编写测试 四、一对多关联映射 五、多对多关联映射 六、小结 一、关联关系映射 …...

算法通关村第十四关:黄金挑战-数据流的中位数

黄金挑战-数据流的中位数 1.数据流中中位数的问题 LeetCode295 https://leetcode.cn/problems/find-median-from-data-stream/ 思路分析 中位数的问题,我们一般都可以用 大顶堆小顶堆 来求解 小顶堆(minHeap):存储所有元素中…...

【2023集创赛】国家集创中心杯三等奖:不对称轻失配运算放大器

本文为2023年第七届全国大学生集成电路创新创业大赛(“集创赛”)国家集创中心杯三等奖作品分享,参加极术社区的【有奖征集】分享你的2023集创赛作品,秀出作品风采,分享2023集创赛作品扩大影响力,更有丰富电…...

手写Mybatis:第18章-一级缓存

文章目录 一、目标:一级缓存二、设计:一级缓存三、实现:一级缓存3.1 工程结构3.2 一级缓存类图3.3 一级缓存实现3.3.1 定义缓存接口3.3.2 实现缓存接口3.3.3 创建缓存KEY3.3.4 NULL值缓存key 3.4 定义缓存机制、占位符和修改配置文件3.4.1 定…...

哈夫曼编码实现文件的压缩和解压

程序示例精选 哈夫曼编码实现文件的压缩和解压 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《哈夫曼编码实现文件的压缩和解压》编写代码,代码整洁,规则&#xff0…...

解决六大痛点促进企业更好使用生成式AI,亚马逊云科技顾凡采访分享可用方案

亚马逊云科技大中华区战略业务发展部总经理顾凡在接受21世纪经济报道记者专访时表示,生成式人工智能将从四个方面为企业带来机遇:第一是创造全新的客户体验;第二是提高企业内部员工的生产力;第三是帮助企业提升业务运营效率&#…...

Qt 定时器放在线程中执行,支持随时开始和停止定时器。

前言:因为项目需要定时检查网络中设备是否能连通,需要定时去做ping操作,若是网络不通,则ping花费时间比较久(局域网大概4秒钟才能结束,当然如果设置超时时间啥的,也能很快返回,就是会…...

java 过滤器 接口(API)验证入参,验签(sign) Demo

java 过滤器 接口(API)验证入参,验签(sign) Demo 一、思路 1、配置yml文件; 2、创建加载配置文件类; 3、继承 OncePerRequestFilter 重写方法 doFilterInternal; 4、注册自定义过滤器; 二、步骤 1、配置yml文件; ###系…...

独家!微信正在灰测一款全新消金产品

来源 | 镭射财经(leishecaijing) 「镭射财经」独家获悉,微信将推出一款名为“微信分期”的新消费信贷产品,目前该产品正处于小范围灰测阶段,还未正式上线。上线后,微信将运营微信分付和微信分期两款自营消…...

阿秀C++笔记-学习记录

81.C中的组合和继承相比的优缺点 在C中组合一对象系用描述对象包对象系组一个拥对象例其变合类的含的现。这的量类当有员被创建。 以下一个示例,展示了在C中如何实现组合关系: class Engine {// Engine class definition... };class Car {Engine engi…...

前端入门到入土?

文章目录 前言http和https的区别,https加密的原理是?区别https的加密原理 TCP为什么要三次握手?proxy代理的原理?内存泄漏?什么是内存泄漏?为什么会有内存泄漏?内存泄漏的情况?如何防…...

架构设计基础设施保障IaaS之网络

目录 1 DNS运用1.1 DNS功能作用1.2 DNS配置实践 2 DNS生产最佳实践方案2.1 全球加速功能2.2 不同运营商的加速方案2.3 全球业务高可用方案2.4 跨地域负载均衡 3 DNS域名劫持解决方案4 CDN剖析4.1 CDN原理4.2 缓存过期配置处理流程4.3 缓存配置规则 5 CDN运用6 CDN最佳实践方案6…...

zabbix安装部署

前期准备:安装mysql数据库和nginx 一、下载zabbix rpm -Uvh https://repo.zabbix.com/zabbix/4.4/rhel/7/x86_64/zabbix-release-4.4-1.el7.noarch.rpm yum-config-manager --enable rhel-7-server-optional-rpms yum install epel-release numactl yum install…...

零碎的C++

构造函数和析构函数 构造函数不能是虚函数,而析构函数可以是虚函数。原因如下: 构造函数不能是虚函数,因为在执行构造函数时,对象还没有完全创建,还没有分配内存空间,也没有初始化虚函数表指针。如果构造…...

模糊测试面面观 | 模糊测试是如何发现异常情况的?

协议模糊测试是一种用于评估通信协议、文件格式和API实现系统安全性和稳定性的关键技术。在模糊测试过程中,监视器扮演着关键角色,它们能够捕获异常情况、错误响应、资源利用等,为测试人员提供有价值的信息,有助于发现潜在漏洞和问…...

C#备份数据库文件

c#备份数据库文件完整代码 sqlServer 存储过程: USE [PSIDBase] GO /****** Object: StoredProcedure [dbo].[sp_BackupDB] Script Date: 2023/8/31 16:49:02 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GOALTER procedure [dbo].[sp_BackupDB]…...

行军遇到各种复杂地形怎么处理?

行军遇到各种复杂地形怎么处理? 【安志强趣讲《孙子兵法》第30讲】 【原文】 凡军好高而恶下,贵阳而贱阴,养生而处实,军无百疾,是谓必胜。 【注释】 阳,太阳能照到的地方。阴,太阳照不到的地方。…...

Python Number(数字).............................................

Python Number 数据类型用于存储数值。 数据类型是不允许改变的,这就意味着如果改变 Number 数据类型的值,将重新分配内存空间。 以下实例在变量赋值时 Number 对象将被创建: var1 1 var2 10您也可以使用del语句删除一些 Number 对象引用。 del语句…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

数据库分批入库

今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

多元隐函数 偏导公式

我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式,给定一个隐函数关系: F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 🧠 目标: 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z​、 …...

轻量级Docker管理工具Docker Switchboard

简介 什么是 Docker Switchboard ? Docker Switchboard 是一个轻量级的 Web 应用程序,用于管理 Docker 容器。它提供了一个干净、用户友好的界面来启动、停止和监控主机上运行的容器,使其成为本地开发、家庭实验室或小型服务器设置的理想选择…...

raid存储技术

1. 存储技术概念 数据存储架构是对数据存储方式、存储设备及相关组件的组织和规划,涵盖存储系统的布局、数据存储策略等,它明确数据如何存储、管理与访问,为数据的安全、高效使用提供支撑。 由计算机中一组存储设备、控制部件和管理信息调度的…...