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_0000至0x0000_FFFF_FFFF_FFFF - 内核空间(Kernel space) :
0xFFFF_0000_0000_0000至0xFFFF_FFFF_FFFF_FFFF
KASAN(影子区):它是一个动态检测内存错误的工具,原理利用额外的内存标记可用内存的状态(将1/8内存作为影子区);modules:内核模块使用的虚拟地址空间;vmalloc:vmalloc函数使用的虚拟地址空间.text:代码段.init:模块初始化数据.data:数据段bss:静态内存分配段fixed:固定映射区域PCI I/O:PCI设备的I/O地址空间vmemmap:内存的物理地址如果不连续的话,就会存在内存空洞(稀疏内存)vmemmap就用来存放稀疏内存的page结构体的数据的虚拟地址空间memory:线性映射区域
- 我们可以打印出ARM64体系结构的Linux内存布局(
Linux内核初始化完成后,整体布局稳定。通过Vexpress平台输出即可,因为我们暂时没有环境,所以先通过源码分析打印流程。
start_kernel()==>mm_init()==>mem_init()==>printk(...)
- 用户空间(User space) :
二、堆管理
-
堆是进程中主要用于动态分配变量和数据的内存区域,堆的管理对应程序员不是直接可见的。
malloc和内核之间的经典接口是brk系统调用,负责拓展/收缩堆。堆是一个连续的内存区域,在拓展时自下至上增长。其中mm_struct结构,包含堆在虚拟地址空间中的起始和当前结束地址(start_brk和brk)。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名片,由专业技术人员远程协助! 前言 这篇博客针对《哈夫曼编码实现文件的压缩和解压》编写代码,代码整洁,规则࿰…...
解决六大痛点促进企业更好使用生成式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语句…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
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 &…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
