首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux进程学习【进程地址

---- 前言 对于 C/C++ 来说,程序中的内存包括这几部分:区、堆区、静态区 等,其中各个部分功能都不相同,比如函数的帧位于 区,动态申请的空间位于 堆区,全局变量和常量位于 静态区 ,区域划分的意义是为了更好的使用和管理空间...还需要一套完整的 ‘‘翻译’’ 机制进行程序寻址,如 Linux 中的 页表 + MMU ️页表+MMU 页表 本质上就是一张表,操作系统 会为每个 进程 分配一个 页表,该 页表 使用 物理地址 存储...后续对这块进行写入操作时,会直接拒绝 对于这种机制感兴趣的同学可以点击下面这几篇文章查看详细内容: Linux的虚拟内存详解(MMU、页表结构) ARM体系架构——MMU 逻辑地址、页表、MMU等...️写时拷贝 Linux 中存在一个很有意思的机制:写时拷贝 这是一种 赌bo 行为,OS 此时就赌你不会对数据进行修改,这样就可以 使多个 进程 在访问同一个数据时,指向同一块空间,当发生改写行为时...可以让进程以统一的视角看待自己的代码和数据 ---- 总结 以上就是本篇关于 Linux进程学习【进程地址】的全部内容了,我们从一个有趣的小问题切入,见识到了 虚拟地址空间 与 物理地址空间 的奇妙关系

16420

Linux进程——进程地址空间

前言:在讲完环境变量后,相信大家对Linux有更进一步的认识,而Linux进程概念到这也快接近尾声了,现在我们了解Linux进程中的地址空间!...本篇主要内容: 了解程序地址空间 理解进程地址空间 探究页表和虚拟地址空间 1....&s.c } 注意:区是整体向下增长,局部想上使用的,就是地址最低处,依次往上放后面的元素 但是如果我们将代码更改还能运行过去嘛? char *str = "Hello, Linux!"...二、存在虚拟地址空间,可以有效的进行进程访问内存的安全检查 三、将进程管理和内存管理进行解耦 四、保证进程的独立性 通过页表让进程虽然虚拟地址一样但是映射到不同的物理内存处,从而实现进程的独立性...结束进程地址空间,我们的Linux进程概念到这里也结束了,后面我将带大家走进进程控制。 谢谢大家支持本篇到这里就结束了

11010
您找到你想要的搜索结果了吗?
是的
没有找到

Linux进程地址空间

文章目录 一、前言 二、什么是进程地址空间 三、进程地址空间如何进行管理 四、为什么会存在进程地址空间 五、进程地址空间区域的严格划分 一、前言 学习Linux系统编程一共要翻越三座大山 – 进程地址空间...Linux中,三者的意思是一样的,都表示虚拟地址,大家不用过于区分。...Linux 中 mm_struct 源码如下: 可以看到,进程地址空间其实也是进程属性的一种,我们可以通过进程的 task_struct 来找到/管理进程对应的地址空间。...进程地址空间如何进行区域划分以及区域调整 我们知道进程地址空间被划分为很多个区域,其中我们熟知的有堆区、区、已初始化全局数据区、未初始化全局数据区、代码段,那么操作系统如何对这些区域进行划分和管理呢?...---- 五、进程地址空间区域的严格划分 我们上面讲的地址空间的区域划分其实是一种粗略的划分,严格的区域划分如下: 其中,我们之前熟悉的代码段、全局数据区、区、堆区、共享区,再加上一个命令行参数将变量被统称为用户空间

3.8K00

Linux进程地址空间

显示相同地址,却是不同的值 下面在Linux上验证 创建test.c文件 st.c  ⮀...,CPU会自动根据页表将虚拟地址转化为物理地址 创建子进程,就要创建子进程的PCB,及地址空间和页表结构 子进程的相关内核数据结构的属性字段会继承父进程 大富翁 A有个儿子是E,A跟E说,我们家有10...个亿是你爷爷的,所以E要继承给他10亿的大饼 所以子进程在虚拟地址处也有对应的地址 正常来说,子进程要对value对修改,把value变成200,父进程通过映射关系找到value,读到200 但因为进程具有独立性...进程地址空间+页表的意义: 1.防止地址随意访问,保护物理内存与其他进程 若没有地址空间的存在,则直接使用cPU调用物理地址,会有野指针的问题存在 2.将进程管理和内存管理进行解耦合 因为有虚拟地址和页表的存在...,所以不关心进程对应的物理地址所处位置

3K10

Linux进程地址空间

Linux进程地址空间是学习Linux的过程中,我们遇见的第一个难点,也是重中之重的重点。虽然它很难,但是,等我们真正懂得了这样设计的原理,我们不禁会感叹:这真的是太妙了。...但是,堆区和区的增长的方向是怎样呢?这个好办;方向是比对出来的,我们只需要多申请几次堆空间和空间,然后比较地址大小变化。...printf("heap addr/堆区地址: %p\n", heap4); printf("stack addr地址: %p\n", &heap1); printf("stack addr...地址: %p\n", &heap2); printf("stack addr地址: %p\n", &heap3); printf("stack addr地址: %p\n", &heap4...,brk是当前堆的结束地址,start_stack是的起始地址 unsigned long arg_start,arg_end,env_start,env_end; //参数段的开始

2000

Linux进程地址空间

因此,这个地址只能是虚拟地址(线性地址)。在Linux中,特殊情况,我们将这种地址也成为逻辑地址。 2.感性的理解虚拟地址空间 从前有一个大富翁,他有10亿美元的资产。...3.现象的具体解释 父进程和子进程都有自己独立的进程地址空间,也有独立的页表结构。子进程由父进程创建,因此子进程进程地址空间是拷贝父进程进程地址空间。...对于磁盘内编译过的可执行程序中的地址不叫虚拟地址,而是叫做逻辑地址。当然对于Linux而言,虚拟地址、线性地址、逻辑地址都是一样的。...(PCB中的一个属性mm_struct) 区域划分和调整 地址空间有很多区域:区、堆区、数据段、代码段等,那么进程地址空间是如何进行区域划分的呢?...本文作者目前也是正在学习Linux相关的知识,如果文章中的内容有错误或者不严谨的部分,欢迎大家在评论区指出,也欢迎大家在评论区提问、交流。

19020

Linux系统-进程地址空间

Linux进程地址空间 零、前言 一、程序内存空间 二、进程地址空间 1、引入及概念 2、进程地址空间 3、相关问题 零、前言 本章主要讲解学习进程地址空间的知识 一、程序内存空间 在学习C/C...、函数参数、返回数据、 返回地址等,地址向下生长 共享区:储存文件映射,匿名映射,动态库 堆区:存放动态分配的变量,堆区地址向上生长 数据段(初始化数据/未初始化数据区):存放全局变量...,说明该地址绝对不是物理地址,因为是物理地址根本不会有这种事发生 2、进程地址空间 概念: 在Linux地址下,这种地址叫做 虚拟地址,我们在用C/C++语言所看到的地址,全部都是虚拟地址!...,随进程的创建而创建,随进程的退出而回收 进程地址空间的内容: 进程地址空间是由0x00000000到0xffffffff的线性地址空间,按照刻度被划分为各个区域,例如代码区、堆区、区等...在结构体mm_struct当中,便记录了各个边界刻度(对于堆向上增长以及向下增长实际就是改变mm_struct当中堆和的边界刻度) 示图: 注:在结构体mm_struct中各个刻度之间的每一个刻度都代表一个虚拟地址

3.8K30

Linux进程理解与学习Ⅳ-进程地址空间

环境:centos7.6,腾讯云服务器 Linux文章都放在了专栏:【 Linux 】欢迎支持订阅 相关文章推荐: 【Linux】冯.诺依曼体系结构与操作系统 【Linux...】进程理解与学习Ⅰ-进程概念 浅谈Linux下的shell--BASH 【Linux进程理解与学习Ⅱ-进程状态 【Linux进程理解与学习Ⅲ-环境变量 ---- 前言...但是,假如这里的地址是物理地址的话,同一块地址处却有不同的值,这肯定是不现实的。★因此,我们可以得出这样的结论: 我们在语言层面所看到的地址区、堆区、静态区...)...实际上进程地址空间就是操作系统喂给进程的一块“饼”,OS会跟每个进程说,你们有4G的内存空间(区、堆区、静态区...)可以使用,但实际上,只有当进程需要用的时候,OS才会分配空间给进程。...接下来谈一谈OS如何管理我们所说的进程地址空间(即我们所说的区、堆区等)? 答:先描述,再组织。实际上我们所说的进程地址空间本质上是一个内核数据结构,struct_mmstruct{}。

1.1K20

Linux 中的各种进程 线程 内核 中断

Linux进程地址空间有个标准布局,地址空间中由各个不同的内存段组成 (Memory Segment),主要的内存段如下: 程序段 (Text Segment):可执行文件代码的内存映射 数据段 (...进程的初始化大小是由编译器和链接器计算出来的,但是的实时大小并不是固定的,Linux 内核会根据入情况对区进行动态增长(其实也就是添加新的页表)。...二、线程Linux 内核的角度来说,其实它并没有线程的概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分的统一到了 task_struct 中。...线程仅仅被视为一个与其他进程共享某些资源的进程,而是否共享地址空间几乎是进程Linux 中所谓线程的唯一区别。...对于 Linux 进程或者说主线程,其 stack 是在 fork 的时候生成的,实际上就是复制了父亲的 stack 空间地址,然后写时拷贝 (cow) 以及动态增长。

3.3K20

Linux进程>环境变量&&地址空间&&进程调度

环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性 1.2 常见环境变量 PATH : 指定命令的搜索路径 HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)...能得出如下结论: 变量内容不一样,所以父子进程输出的变量绝对不是同一个变量 但地址值是一样的,说明,该地址绝对不是物理地址!...在Linux地址下,这种地址叫做 虚拟地址 我们在用C/C++语言所看到的地址,全部都是虚拟地址!...物理地址,用户一概看不到,由OS统一管理 OS必须负责将 虚拟地址 转化成 物理地址 2.3 进程地址空间 所以之前说‘程序的地址空间’是不准确的,准确的应该说成 进程地址空间 说明: 上面的图就足矣说名问题...3.Linux2.6内核进程调度队列 上图是Linux2.6内核中进程队列的数据结构 3.1 一个CPU拥有一个runqueue 如果有多个CPU就要考虑进程个数的负载均衡问题 3.2 优先级

4710

Linux 中的各种进程 线程 内核 中断

Linux进程地址空间有个标准布局,地址空间中由各个不同的内存段组成 (Memory Segment),主要的内存段如下: 程序段 (Text Segment):可执行文件代码的内存映射 数据段 (...进程的初始化大小是由编译器和链接器计算出来的,但是的实时大小并不是固定的,Linux 内核会根据入情况对区进行动态增长(其实也就是添加新的页表)。...二、线程Linux 内核的角度来说,其实它并没有线程的概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分的统一到了 task_struct 中。...线程仅仅被视为一个与其他进程共享某些资源的进程,而是否共享地址空间几乎是进程Linux 中所谓线程的唯一区别。...对于 Linux 进程或者说主线程,其 stack 是在 fork 的时候生成的,实际上就是复制了父亲的 stack 空间地址,然后写时拷贝 (cow) 以及动态增长。

2.8K50

Linux进程地址空间、进程控制(一.进程创建、进程终止、进程等待)

上次介绍了环境变量:Linux进程概念(四.main函数的参数、环境变量及其相关操作) 1.程序地址空间 牵扯到内存,肯定有事这张图啦。...堆区是向上增长的,即分配的内存地址逐渐增加,地址比未初始化数据高。 区: 区用于存储函数的参数值、局部变量和函数调用返回地址等信息。...区是向下增长的,即地址逐渐减小,整体比堆区的地址要高。 上述空间排布结构是在内存吗?...对于32位系统,进程地址空间通常是从0到4GB,这个范围内包含了代码段、数据段、堆、等部分,用于存放程序的指令、数据以及动态分配的内存(就是我们上面那个图) 每个进程都有自己独立的地址空间,使得进程间可以互相隔离...复制父进程数据:新创建的子进程是父进程的副本,所以操作系统会复制父进程的部分数据结构内容到子进程,包括代码、数据、堆、等内容。

4800

Linux】对进程地址空间的理解

一、关于进程地址空间的简单理解 进程地址空间其实是分了很多个区域的,区域划分的本质就是区域内的各个地址都是可以使用的。...如同下面这个图所示: 无论是环境变量的地址还是环境变量表的地址,所存放的地址都在的上部。这里的已初始化数据和未初始化数据是指的全局变量,包括静态变量(静态变量默认被初始化为0)。...进程地址空间不是真实的物理内存,叫做虚拟内存。每一个进程都有自己独立的PCB,也有自己独立的地址空间。在32位机器下,进程地址空间的大小为[0,4GB]。...其中,PCB会记录一个进程的起始地址或基地址,这其实就是进程地址空间的首地址。...当子进程要对数据做修改时会发生写实拷贝,给子进程要修改的数据重新开辟一块物理空间,再将重新开辟的这块物理空间的地址填充入子进程的页表中,但此时页表中对应的虚拟地址并没有发生变化,所以可以看到父子进程访问同一个虚拟地址却打印出不同的内容

9810

Linux修炼】10.进程地址空间

深入学习进程地址空间并克服Linux学习的第一道险关:4.1中的3:统一性! 1....而我们知道堆和都有可能进行空间的扩大(malloc, new),本质上就是修改各个区域的start或者end。free空间的时候也就对应着缩小stack/heap。...地址空间的存在,可以更方便的进行进程进程的数据代码的解耦,保证了进程独立性这样的特征。 3:保证统一性(最难点) 接下来就要引入第三点,这一点也是从初学Linux到现在所碰到的第一个难关!...(在Linux下,虚拟地址和逻辑地址是一样的。) 先来个灵魂拷问:当我们写了一个程序在磁盘中,当他未载入到磁盘时,其内部的函数和变量有地址吗? 答案当然是肯定的。...**深思熟虑许久,我觉得可以同时从两个方面去理解:其一是因为在Linux系统中的指令,天然的CPU指令读取的自然是虚拟地址;其二是因为物理地址在这个过程中只有映射作用,也就是说程序加载到虚拟地址空间时,

1.1K00

一文搞懂 | Linux 中的各种进程 线程 内核 中断

Linux进程地址空间有个标准布局,地址空间中由各个不同的内存段组成 (Memory Segment),主要的内存段如下: 程序段 (Text Segment):可执行文件代码的内存映射 数据段 (...进程的初始化大小是由编译器和链接器计算出来的,但是的实时大小并不是固定的,Linux 内核会根据入情况对区进行动态增长(其实也就是添加新的页表)。...二、线程Linux 内核的角度来说,其实它并没有线程的概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分的统一到了 task_struct 中。...线程仅仅被视为一个与其他进程共享某些资源的进程,而是否共享地址空间几乎是进程Linux 中所谓线程的唯一区别。...对于 Linux 进程或者说主线程,其 stack 是在 fork 的时候生成的,实际上就是复制了父亲的 stack 空间地址,然后写时拷贝 (cow) 以及动态增长。

5K20

Linux】翻山越岭——进程地址空间

这里的地址实际上是虚拟地址(线性地址),Linux也有可能叫做逻辑地址。 我们可以感性地理解虚拟空间。 进程会认为自己是独占系统资源的,然而实际上并不是。...所以,对于我们刚开始的现象很好解释了: 父进程和子进程都有自己的独立的进程地址空间,且都有自己的页表结构,子进程由父进程创建,所以子进程地址空间是从父进程拷贝而来,刚开始的g_val经过映射指向同一个物理内存...;对于磁盘程序内部的地址称为逻辑地址,在Linux下,虚拟地址到线性地址、逻辑地址是一样的,但在其他地方,区分比较明确, ---- 二、为什么 了解了进程地址空间是什么了以后,那为什么存在进程地址空间呢...但是对于Linux而言,虚拟地址、线性地址、逻辑地址都是一样的。 ---- 三、怎么做 由操作系统管理进程地址空间。...区域划分和调整 地址空间有很多个区域,比如区、堆区、数据区、代码段,那进程地址空间是如何进行区域划分和区域调整的:把一个区域的end和start进行调整和维护内存区域 struct mm_struct

73330

Linux 进程虚拟地址空间布局

因为除了用户进程,操作系统会独占一部分虚拟内存空间,用户进程只能使用操作系统分配给进程地址空间,如果用户进程访问未经允许的地址空间,则会被操作系统判为非法请求,结果就是程序被操作系统强制结束。...比如 Windows 下的“进程因非法操作需要关闭” 和 Linux 下的 “Segmentation fault”,一般都是由于进程访问了非法的内存地址。...可执行文件载入内存运行时,在 Linux 环境下的虚拟地址空间由一般有代码段、初始化数据段、未初始化数据段、堆和构成,如果程序使用了内存映射文件(比如共享库、共享文件),那么包含映射段。...64bits的Linux默认大小为10MB,可通过命令ulimit -s临时修改。...在调用函数后,系统通常会清除上保存的信息。另外一个重要的特征是,它的地址空间“向下减少”,即当上保存的数据越多,地址就越低。

5K50

一文读懂 | Linux 中的各种进程 线程 内核 中断

Linux进程地址空间有个标准布局,地址空间中由各个不同的内存段组成 (Memory Segment),主要的内存段如下: 程序段 (Text Segment):可执行文件代码的内存映射 数据段 (...二、线程Linux 内核的角度来说,其实它并没有线程的概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分的统一到了 task_struct 中。...线程仅仅被视为一个与其他进程共享某些资源的进程,而是否共享地址空间几乎是进程Linux 中所谓线程的唯一区别。...对于 Linux 进程或者说主线程,其 stack 是在 fork 的时候生成的,实际上就是复制了父亲的 stack 空间地址,然后写时拷贝 (cow) 以及动态增长。...Linux 调度程序中并没有区分线程和进程,当调度程序需要唤醒”进程”的时候,必然需要恢复进程的上下文环境,也就是进程;但是线程和父进程完全共享一份地址空间,如果也用同一个那就会遇到以下问题。

1.6K20
领券