【Linux内核】进程地址空间

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

概述

1.所谓进程地址空间,就是从进程的视角看到的地址空间

2.在Linux中,每个进程都有自己独立的虚拟地址空间,在32位模式下它是4GB的内存块

3.Linux内核进程和用户进程所占虚拟内存比例是1:3

4.用户空间的进程只能访问整个虚拟地址空间0-3GB的部分,不能访问3GB-4GB的部分

5.当进程地址空间被共享的时候,就是多线程了

内存描述符

1.mm_struct表示了进程地址空间的全部信息,叫做内存描述符,其中两个最重要的属性:

  • mm_users,如果有两个线程共享该地址空间,就是2
  • mm_count,引用计数,如果是0,就说明没有指向内存描述符的应用了

2.内存描述符被进程描述符的mm域指向,每一个进程都有唯一一个mm_struct,一个mm_struct可以被多个进程共享,这种其实就是线程

3.内核线程没有进程地址空间,也没有内存描述符,所以内核线程的进程描述符mm域为空

虚拟内存区域

1.vm_area_struct表示的是进程地址空间其中的一个区间,它也称为线性区描述符,也叫VMA

2.进程所拥有的线性区从来不重叠,并且内核尽力把新分配的线性区与紧邻的现有线性区进行合并。如果两个相邻区的访问权限相匹配,就能把他们合并在一起。

3.内存区域有很多属性,其中最重要的是读,写,执行权限

4.每个不同质的虚拟内存区域功能和内部机制都不同,因此一个进程使用多个vm_area_struct结构来分别表示不同类型的虚拟内存区域。各个vm_area_struct结构使用链表或者树形结构链接,方便进程快速访问

在这里插入图片描述

4.我们可以在/proc中查看到进程全部的内存区域

5.内核操作内存区域

  • find_vma 一个地址属于哪个内存区域
  • insert_vm_struct 插入新的vma
  • vma_merge 将一个新的VMA和附近VMA合并

用户空间常用的操作

  • mmap 它把文件内容映射到一段内存上(准确说是虚拟内存上),通过对这段内存的读取和修改,实现对文件的读取和修改,如果在内核空间,内核使用的是do_mmap

  • mummap 该调用可以看作是mmap的一个逆过程.它将进程中从start开始length长度的一段区域的映射关闭,如果该区域不是恰好对应一个vma,则有可能会分割几个或几个vma,如果在内核空间,内核使用的是do_mummap

页表

1.虚拟地址需要先转换成物理地址,处理器才能解析地址访问请求

2.地址转换工作需要查询页表,每个进程都有各自的页表,线程共享页表

3.Linux中使用的是三级页表,另外还有一个TLB缓存器

linux内核--进程地址空间(三) 引言:上篇博文中,我们简单的介绍了Linux虚拟存储器的概念及组成情况,下面来分析分析进程的创建和终结及跟进程地址空间的联系。 这里首先介绍一个比较重要的概念:存储器映射 在Linux系统中,通过将一个虚拟存储器区域与一个磁盘上的对象关联起来,以初始化这个虚拟存储器区域的内容,这个过程称为存储器映射。存储器映射为共享数据、创建新的进程以及加载程序提供了一种高效的机制。 虚拟存储器区域可以映射 阅读详情

相关推荐

AI人工智能领域多模态大模型的数字孪生应用

本文旨在系统性地介绍多模态大模型在数字孪生领域的最新应用进展,探讨其技术原理、实现方法和应用价值。内容范围涵盖从基础概念到前沿技术,从理论分析到实践案例。文章首先介绍多模态大模型和数字孪生的基本概念,然后深入分析两者的结合点,接着通过具体案例展示应用实践,最后探讨未来发展趋势和挑战。多模态大模型:能够同时处理和融合多种数据模态(如文本、图像、视频、音频等)的大型人工智能模型数字孪生:物理实体或系统的虚拟副本,通过实时数据同步实现虚实交互跨模态融合:将不同数据模态的信息进行有效整合和关联的技术。

AI云原生与云计算技术学院 1279

内存管理

本节思考: 在系统启动时,ARM Linux内核如何知道系统中有多大的内存空间? 在32bit Linux内核中,用户空间和内核空间的比例通常是3:1,可以修改成2:2吗? 物理内存页面如何添加到伙伴系统中,是一页一页添加,还是以2的几次幂来加入呢? 在内存管理的上下文中, 初始化(initialization)可以有多种含义.在许多CPU上,必须显式设置适用于Linux内核的内存模型.在x86_32上需要切换到保护模式, 然后内核才能检测到可用内存和寄存器. 在初始化过程中, 还必须建立内存管理的数据结构

sunshineywz的博客 479

5步搞定ABB机器人RobotStudio与S7-1500PLC的Profinet通讯(附PLCSIM调试技巧)

本文详细介绍了如何利用RobotStudio与TIA Portal软件,结合PLCSIM Advanced仿真器,在零硬件条件下实现ABB机器人与西门子S7-1500 PLC之间的Profinet通讯虚拟调试。通过五个核心步骤,从环境搭建、网络配置、信号映射到联合仿真与高级调试,帮助工程师在项目前期高效验证逻辑、压缩现场调试周期,并掌握实用的PLCSIM调试技巧。

weixin_29188043的博客 459

linux虚拟内存布局

Linux 内核给每个进程都提供了一个独立的虚拟地址空间,并且这个地址空间是连续的。这样,进程就可以很方便地访问内存,更确切地说是访问虚拟内存。虚拟地址空间的内部又被分为内核空间和用户空间两部分。

ARM-Linux 899

Linux进程地址空间

最后,对于物理地址和虚拟地址做一个总结,首先操作系统先从磁盘加载数据到物理地址上,然后就知道它占多大空间了,所以在虚拟地址空间开辟相同大小的空间,然后把双方的地址一一填入页表组成映射关系。那么现在,物理地址有没有划分已经不重要了,就算它是乱存的,爱存哪存哪都不会影响我们了,因为我们的虚拟地址空间会通过页表的映射关系,把它从无序变为有序。而野指针就是只有虚拟地址但是没有对应的物理地址,找不到所以野指针。

qq_51777557的博客 839

Linux进程地址空间(一)

当我们定义一个全局变量,并且用fork()创建一个子进程,在子进程中改变这个全局变量,我们发现,父子进程,输出地址是一致的,但是变量内容不一样!能得出如下结论:变量内容不一样,所以父子进程输出的变量绝对不是同一个变量但地址值是一样的,说明,该地址绝对不是物理地址!在Linux地址下,这种地址叫做虚拟地址我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理,OS必须负责将 虚拟地址 转化成 物理地址。

m0_62767273的博客 235

linux 匿名物理内存,linux 内存管理问题汇总

思考问答1.在系统启动时,ARM Linux内核如何知道系统中有多大的内存空间?1)uboot 通过命令行传过来 mem=x2) dts 文件2. 在32bit Linux内核中,用户空间和内核空间的比例通常是3:1,可以修改成2:2吗?可以,make menuconfig 中可以配置3. 物理内存页面如何添加到伙伴系统中,是一页一页添加,还是以2的几次幂来加入呢?2的幂加入的,2.6版本的...

weixin_33345697的博客 200

Linux内核-进程地址空间

进程地址空间进程可寻址的虚拟内存组成,最为重要的是内核允许进程使用这种虚拟内存中的地址。

affrewg的博客 743

Linux内核——进程地址空间

一.概述 当内核函数请求内存时,内核不会对该请求进行推迟,会立刻得到。而对于用户态进程内核会认位其请求不是十分紧迫的(因为进程开始运行时并不会立刻访问其地址空间中的全部内存),且内核不信任用户代码,需要捕获并处理用户态进程引起的寻址错误,因而当用户进程请求动态内存时,并未获得请求的页框,而仅仅获得对一个新的线性地址区间的使用权,即这一线性地址成为进程地址空间的一部分,真正分配页框会推...

qq_34228327的博客 562

Linux进程概念——下】验证进程地址空间的基本排布 | 理解进程地址空间 | 进程地址空间如何映射至物理内存(页表的引出) | 为什么要存在进程地址空间 | Linux2.6内核进程调度队列

文章目录【写在前面】一、程序地址空间二、进程地址空间三、 【写在前面】 一、程序地址空间 这个概念比较重要,之前我们也涉及过 —— 我们在语言上定义的各种变量等在内存中的分布情况,如果没有听说过,那么你的 C/C++ 是不可能学好的。 其实对于这块,我们一直是有误区的。 二、进程地址空间 三、 ...

DanceBit的博客 1635

linux内核分析之进程地址空间

本文主要介绍linux内核进程地址空间的数据结构描述,包括mm_struct/vm_area_struct。进程线性地址区间的分配流程,并对相应的源代码做了注释。  内核中的函数以相当直接了当的方式获得动态内存。当给用户态进程分配内存时,情况完全不同了。进程对动态内存的请求被认为是不紧迫的,一般来说,内核总是尽量推迟给用户态进程分配内存。由于用户进程时不可信任的,因此,内核必须能随时准备捕获用

bullbat的专栏 3437

Linux内核进程地址空间

Linux内核进程地址空间 内核中的函数以相当直接了当的方式获得动态内存: __get_free_pages 或 alloc_pages从分区页框分配器中获得页框; kmem_cache_alloc或kmalloc使用slab分配器为专用或通用对象分配块; vmalloc获得一块非连续的内存块; 返回一个页描述符地址或线性地址; 内核是操作系统中优先级最高的成分; 内核信任自己;...

angbao4913的博客 145

Linux内核原理之进程地址空间

文章目录进程地址空间简介进程虚拟地址空间进程地址空间的布局内存映射的原理数据结构树和链表虚拟内存区域的表示优先查找树对区域的操作address_space内存映射创建映射删除映射反向映射数据结构建立逆向映射 进程地址空间 用户层进程的虚拟地址空间Linux的一个重要抽象:它向每个运行进程提供了同样的系统视图,使得多个进程可以同时运行,而不会干扰其他进程内存中的内容 简介 本章主要关注用户管理虚拟地址空间的方法 每个应用程序都有自身的地址空间,与所有其他应用程序分隔开 在巨大的线性结构地址空间中,只有很少

Making-It 755

linux进程地址空间内核,Linux进程内核地址空间

一、 Linux采用了虚拟内存管理技术,使得每个进程都有独立的进程地址空间,该空间是大小为3G,用户看到和接触到的都是虚拟地址。利用这虚拟地址,不但能保护操作系itongde作用,更重要的是用户程序可使用比实际物理地址内存更大的地址空间。二、inux将4G的虚拟地址空间划分为2部分---用户空间与内核空间用户空间从0到0xbfffffff,内核空间从3G到4G,用户进程通常情况下只能访问用户空间的...

weixin_39592315的博客 156

可重入内核进程地址空间--深入理解linux内核

可重入内核,是指多个进程可以同时处于内核态下,也就是说可以多个进程可以并发的执行内核代码。对于但处理器来说某一时刻只能有一个进程被CPU处理,其他处于内核态的进程处于阻塞或者挂起等待状态。 对于linux来说,可重入内核代码包含可重入函数和非可重入函数。可重入函数是指运行时只改变局部数据结构,不改变全局数据结构;不可重入函数是指运行该函数时也需要改变全局数据结构。 所以,如果有多个进程进入不可重

j123kaishichufa的专栏 2175

Linux】——进程地址空间 && Linux2.6内核进程调度队列

世上有两种耀眼的光芒,一种是正在升起的太阳,一种是正在努力学习编程的你!一个爱学编程的人。各位看官,我衷心的希望这篇博客能对你们有所帮助,同时也希望各位看官能对我的文章给与点评,希望我们能够携手共同促进进步,在编程的道路上越走越远!提示:以下是本篇文章正文内容,下面案例可供参考联想你上学期间与同桌的三八线。用计算机语言来进行描述:要管理地址空间,要先对地址空间进行描述。地址空间本质是内核的一个struct结构体!内部很多的属性都是表示start,end的范围。

2301_79585944的博客 1222

linux进程地址空间内核,Linux内核辨析 之 进程地址空间(一)

Linux内核剖析 之 进程地址空间(一)绪论内核获取内存方式——直接了当:1.从分区页框分配器获取内存(__get_free_pages()或alloc_pages());2.使用slab分配器为专用或通用对象分配内存(kmem_cache_alloc()或kmalloc());3.使用vmalloc或vmalloc_32获取一块非连续内存区。如果申请的内存得以满足,这些函数返回一个页描述...

weixin_34593388的博客 318

Linux进程地址空间内核空间

本文介绍了操作系统中的内核空间和时钟中断机制。内核空间是操作系统内核在虚拟内存中的专属区域,所有进程共享同一内核空间但用户程序无法直接访问。用户程序通过系统调用与内核交互,触发CPU从用户态切换到内核态。内核空间具有高特权级,运行在Ring0级别,能直接访问硬件资源。时钟中断是操作系统的核心机制,它周期性地触发中断处理程序,实现进程调度、时间维护和资源统计。每次中断都会强制CPU执行内核代码,检查时间片并可能切换进程。这两个机制共同保障了系统的安全性、多任务处理能力和资源管理效率。

wefg1的博客 774

进程地址空间Linux内核源码分析)

背景之前写过关于内存管理源码分析的博客。大体介绍了什么是页、区、slab缓存,以及内核获取、释放页的接口,分配、释放slab缓存的接口。进程地址空间简单的说就是用户空间中进程的内存,我们叫这内存为进程地址空间。本篇博客借助linux源码大体分析进程地址空间的相关知识。进程控制块既然我们要聊一聊进程地址空间,那么不可避免的就要先聊一下进程控制块,进程控制块的概念想必大家不会陌生。一个进程是由一个进程

hty46565的博客 2954

linux内核进程虚拟地址空间管理

内核线程没有运行时,active_mm为空,当内核线程运行时,借用上一个进程的内存描述符,在被借用进程的用户虚拟地址空间的上方运行,进程描述符的成员active_mm指向借用的内存描述符,假设被借用的内存描述符所属的进程不属于线程组,那么内存描述符的成员mm_users不变,仍然是1,成员mm_count加1变成2。如果两个进程属于同一个线程组,每个进程进程描述符的成员mm和active_mm都指向同一个内存描述符,内存描述符的成员mm_users是2、成员mm_count是1。

wwwlyj123321的博客 1981

linux内核进程地址空间

这里的每个内存区域指的的单个进程中不同的内存区域,例如,代码区、全局变量区等,具体见上面的地址空间。内存寻址缓冲器,TLB作为一个将虚拟地址映射到物理地址的硬件缓存,当请求访问一个虚拟地址时,处理器将首先检查TLB中是否缓存了该虚拟地址到物理地址的映射,如果在缓存直接命中,物理地址立即返回,否则,就需要再通过页表搜索需要的物理地址。在多数体系结构中,搜索页表的工作是由硬件完成的,虽然通常操作中,很多使用页表的工作都可以通过硬件来执行,但是只有在内核正确设置页表的前提下,硬件才能方便地操作它们。

抱猫人的博客 777
上一篇: 【Linux内核】块IO层
下一篇: 【Linux内核】页高速缓存和页回写
菜丸子
博客等级 码龄11年 283粉丝 171原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值