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

news2024/11/29 0:50:11

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

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

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

相关文章

HTML5-4-表单

文章目录 表单属性表单标签输入元素文本域(Text Fields)密码字段单选按钮(Radio Buttons)复选框(Checkboxes)按钮(button)提交按钮(Submit)label标签 文本框(textarea&am…

叉积方法,求点与线段的相对位置

叉积可以用来判断一个点在一条线段的哪个方向。 线段两个端点坐标为 A(x1, y1), B(x2, y2), 假设点 P 的坐标为 (px, py), 则向量 AP 和 BP 的坐标表示为: AP (px - x1, py - y1) BP (x2 - px, y2 - py) 叉积的计算公式为: (py…

基于jeecg-boot的flowable流程自定义业务退回撤回或驳回到发起人后的再次流程提交

更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: https://gitee.com/nbacheng/nbcio-boot 前端代码:https://gitee.com/nbacheng/nbcio-vue.git 在线演示(包括H5) : http://122.227.135.243:9888 主要…

神仙级python入门教程(非常详细),从0到精通,从看这篇开始!

毫无疑问,Python 是当下最火的编程语言之一。对于许多未曾涉足计算机编程的领域「小白」来说,深入地掌握 Python 看似是一件十分困难的事。其实,只要掌握了科学的学习方法并制定了合理的学习计划,Python 从 入门到精通只需要一个月…

骨传导和入耳式哪个危害大一点?入耳式和骨传导哪种好?

骨传导和入耳式这两种耳机虽然都存在一定的危害,但是入耳式耳机对人体的危害要更大一点。 入耳式耳机直接塞进耳朵这种佩戴方式,会阻塞外部声音的进入,长时间使用可能会导致耳道感染,还可能对听力造成损伤,而骨传导耳…

RecyclerView源码解析(二):结合LinearLayout分析绘制流程

RecyclerView源码解析(二):结合LinearLayout分析绘制流程 封面: 导言 上篇文章中主要已经介绍了RecyclerView的View的三大工作流程(onMeasure,onLayout,onDraw),实际上看了上篇文章…

数学思维导图怎么绘制?这个详细绘制方法了解一下

数学思维导图怎么绘制?数学思维导图是数学学习中的一种重要辅助工具。在复杂的数学问题中,思维导图可以帮助学生更好地理解和组织各个知识点,从而更好地解决问题。在绘制数学思维导图时,有很多工具可供选择,下面就给大…

港陆证券:政策累积效应催生A股普涨行情 北证50指数创最大单日涨幅

周一,在活泼资本商场政策继续推出、不断累积的布景下,A股商场迎来久别的普涨行情。金融、白酒与资源类板块集体发力,带动沪深主板指数高开高走。北交所商场体现更为亮眼,北证50指数收盘大涨5.92%,创该指数前史最大单日…

CSS中图片旋转超出父元素解决办法

下面的两种解决办法都会导致图片缩小&#xff0c;可以给图片进行初始化的宽高设置 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge">…

NIO原理浅析(三)

epoll 首先认识一下epoll的几个基础函数 int s socket(AF_INET, SOCK_STREAM, 0); bind(s, ...); listen(s, ...);int epfd epoll_create(...) epoll_ctl(epfd, ...); //将所有需要监听的socket添加到epfd中while(1) {int n epoll_wait(...);for(接受到数据的socket) {//处…

el-table 垂直表头

效果如下&#xff1a; 代码如下&#xff1a; <template><div class"vertical_head"><el-table style"width: 100%" :data"getTblData" :show-header"false"><el-table-columnv-for"(item, index) in getHe…

【javascript】禁止浏览器调试前端页面

目录 为啥要禁止&#xff1f;无限 debugger基础禁止调试解决对策 为啥要禁止&#xff1f; 由于前端页面会调用很多接口&#xff0c;有些接口会被别人爬虫分析&#xff0c;破解后获取数据&#xff0c;为了杜绝这种情况&#xff0c;最简单的方法就是禁止人家调试自己的前端代码 …

成都瀚网科技有限公司:抖店怎么开通直播?

随着互联网和移动支付的快速发展&#xff0c;越来越多的人选择开设自己的抖音商店。抖音作为国内最受欢迎的短视频平台之一&#xff0c;拥有庞大的用户基础&#xff0c;成为众多创业者青睐的平台。那么&#xff0c;如何经营自己的抖音店铺呢&#xff1f;下面将从几个方面为您介…

C# 中什么是重写(子类改写父类方法)

方法重写是指在继承关系中&#xff0c;子类重新实现父类或基类的某个方法。这种方法允许子类根据需要修改或扩展父类或基类的方法功能。在面向对象编程中&#xff0c;方法重写是一种多态的表现形式&#xff0c;它使得子类可以根据不同的需求和场景提供不同的方法实现。 方法重…

设计实现QSPI Flash的下载算法

mm32-2nd-bootloader技术白皮书&#xff08;3&#xff09;——设计实现QSPI Flash的下载算法 mm32-2nd-bootloader技术白皮书&#xff08;3&#xff09;——设计实现QSPI Flash的下载算法 | MCU加油站 cathy 发布于&#xff1a;周一, 03/20/2023 - 15:29 &#xff0c;关键词&a…

变压器智能在线监测

变压器智能在线监测是一种先进的变压器状态监测方式&#xff0c;采用了先进的技术手段&#xff0c;能够对变压器运行状态进行实时、在线、自动的监测和分析。可以在变压器运行过程中&#xff0c;对其电压、电流、温度、局放等参数进行实时监测&#xff0c;及时发现异常情况并进…

为何跨境界如此看重黑色星期五?这一点是关键

黑色星期五通常会利用折扣和独一无二的优惠为电子商务商店带来大量新客户。黑色星期五可能会给您的在线商店带来丰厚的利润&#xff0c;如果无法留住这些客户&#xff0c;您就会损失巨大。通过对电子商务客户服务策略进行一些调整&#xff0c;您可以将这些黑色星期五客户转变为…

2023最新多功能XL软件库APP源码+PHP后端系统源码/功能强大/软件库自带后台管理系统

2023最新多功能XL软件库APP源码PHP后端系统源码/功能强大/软件库自带后台管理系统31xl软件库最新可以正常使用版: https://url11.ctfile.com/d/25976711-57801726-b66bb0?p6724 &#xff08;访问密码&#xff1a;6724&#xff09; 多功能软件库&#xff0c;支持自定义对接易支…

LiveGBS流媒体平台GB/T28181功能-支持数据库切换为高斯数据库信创瀚高数据信创数据库

LiveGBS流媒体平台GB/T28181功能-支持数据库切换为高斯数据库信创瀚高数据信创数据库 1、如何配置切换高斯数据库&#xff1f;2、如何配置切换信创瀚高数据库&#xff1f;3、搭建GB28181视频直播平台 1、如何配置切换高斯数据库&#xff1f; livecms.ini -> [db]下面添加配…

JavaScript - 好玩的打字动画

效果预览&#xff1a; &#x1f680;HTML版本 <!DOCTYPE html> <html> <head><title>打字动画示例</title><style>.typewriter {color: #000;overflow: hidden; /* 隐藏溢出的文本 */white-space: nowrap; /* 不换行 */border-right: .…