首页
学习
活动
专区
圈层
工具
发布

「linux」物理地址,虚拟地址,内存管理,逻辑地址之间的关系

物理地址: 这里说的物理地址是内存中的内存单元实际地址,不是外部总线连接的其他电子元件的地址!...物理地址属于比较好理解的,物理地址就是内存中每个内存单元的编号,这个编号是顺序排好的,物理地址的大小决定了内存中有多少个内存单元,物理地址的大小由地址总线的位宽决定!...,虚拟内存里的所有地址都是不直接的,所以你有时候可以看到一个虚拟地址对应不同的物理地址,比如A进程里的call函数入口虚拟地址是0x001,而B也是,但是它俩对应的物理地址却是不同的,操作系统采用这种内存管理方法...逻辑地址: 逻辑地址由两部份组成,段标识符和段内偏移量。段标识符是由一个16位长的字段组成,称为段选择符。其中前13位是一个索引号。...后面3位包含一些硬件细节,如图(转载百度百科): image.png 逻辑地址即程序中的段地址,比如说0x1到0x4为一个页面,那么0x1-0x4之间的段地址称为逻辑地址,逻辑地址可以通过内存中的段数组里寻找段选择符

3.9K00

「linux」物理地址,虚拟地址,内存管理,逻辑地址之间的关系2

线性地址: 线性地址是逻辑地址到物理地址之间的一个中间层变换,程序代码会产生逻辑地址,或者说是段中的偏移地址,加上相应段的基地址就生成了一个线性地址,逻辑地址是如何知道自己的段基的址?...如果启用了分页机制,那么MMU内存管理单元会在内存映射表里寻找与线性地址对应的物理地址。若没有启用分页机制,那么线性地址直接就是物理地址。...7.内存中有一个叫MMU(内存管理单元)的电子元件负责从操作系统已经初始化好的内存映射表里查询与虚拟地址对应的物理地址并转换, 8.逻辑地址由两部份组成,段标识符和段内偏移量。...逻辑地址即程序中的段地址,比如说0x1到0x4为一个页面,那么0x1-0x4之间的段地址称为逻辑地址,逻辑地址可以通过内存中的段数组里寻找段选择符+段偏移地址轻易得到物理地址。...线性地址是逻辑地址到物理地址之间的一个中间层变换,程序代码会产生逻辑地址,或者说是段中的偏移地址,加上相应段的基地址就生成了一个线性地址。

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

    【Linux系统编程】(十六)揭秘 Linux 程序地址空间:从虚拟地址到内存管理的底层逻辑实战

    mm_struct、vm_area_struct)设计经典,没有后续高版本的复杂特性,更容易聚焦核心逻辑; 兼容性强,实操方便:32 位程序在现代 64 位 Linux 系统中可通过ia32-libs等库兼容运行...但这张图背后的逻辑的我们真的理解吗?为什么堆区向上增长、栈区向下增长?这些区域在内存中是连续的吗?我们先用 Bash 实操验证这张 “经典布局图”,用代码亲眼看看各个区域的地址分布。...3.3 虚拟地址的本质:进程的 “内存视角” 虚拟地址是操作系统为每个进程分配的 “逻辑地址”,每个进程都有自己独立的虚拟地址空间,就像每个程序员都有自己的 “代码笔记本”,笔记本上的页码...它不是物理内存的镜像,而是操作系统为进程构建的 “逻辑视图”—— 准确来说,应该叫做 “进程地址空间”,而不是 “程序地址空间”。...虚拟地址空间通过 “固定的逻辑布局” 解决了这个问题: 无论程序被加载到物理内存的哪个位置,其虚拟地址空间的布局都是固定的(代码区在 0x8048000,数据区在 0x804a000 等); 程序编译时使用的是虚拟地址

    12210

    WCF后续之旅(15): 逻辑地址和物理地址

    在WCF中,每个终结点都包含两个不同的地址——逻辑地址和物理地址。逻辑地址就是终结点Address属性表示的地址。...至于物理地址,对于消息发送放来讲,就是消息被真正发送的目的地址;而对于消息的接收放来讲,就是监听器真正监听的地址。 一、服务端的物理地址 在默认的情况下,终结点的逻辑地址和物理地址是同一个URI。...换句话说,终结的逻辑地址是必须的,如何物理地址没有指定的,默认使用逻辑地址作为物理地址。...implementedContract, Binding binding, Uri address, Uri listenUri); 16: } 17:  在下面的代码片断中,就为终结点指定了一个同于逻辑地址的物理地址...SOAP Message拦截、转发工具[上篇] WCF后续之旅(13):创建一个简单的SOAP Message拦截、转发工具[下篇] WCF后续之旅(14):TCP端口共享 WCF后续之旅(15): 逻辑地址和物理地址

    1.1K110

    浅析如何把逻辑地址转换为物理地址

    摘要:微信搜索【三桥君】 本文只讲逻辑地址转换为物理地址的计算方法 一、依据 (1)计算十六进制使用公式 逻辑地址=页号+页内地址 物理地址=块号+页内地址 【解析】 逻辑地址转换为物理地址其实就是页号转换为块号...(2)计算非十六进制使用公式 物理地址=块号*页内大小+页内地址 页号=逻辑地址/页面大小字节=(取整数) 页内地址=逻辑地址%页面大小字节=(取余数) 二、例题 1、十六进制 设某用户的编程空间共...请计算逻辑地址0A5CH所对应的物理地址。(要写出计算过程) 【分析】 逻辑地址为0A5CH; 页内地址的位数通过“每页为1KB”转换成2的n次幂去求解,n次幂=位数。...页号的位数通过逻辑地址的位数减去页内地址的位数,即16-页内地址的位数。...2、非十六进制 在采用分页存储管理的系统中,某作业J的逻辑地址空间为4页(每页2KB),且已知该作业的页面映像表(即页表)如下:试借助地址变换图求出有效逻辑地址4865所对应的物理地址。

    61710

    你真的懂物理地址和逻辑地址吗?

    好了,回归这题,本篇文章主要给大家讲述一下物理地址和逻辑地址的概念,以及它们之间的联系与区别。ps:本文以Intel8086处理器为例讲述。...以上过程中的[0001]就是我们所要说的物理地址,它是一个绝对的固定的地址。 ? 那假如我们指令中的地址用的是物理地址(绝对地址),会产生怎样的问题呢?...由此,便诞生了我们将要说的逻辑地址的概念,物理地址它是固定不变的,而逻辑地址会随着程序加载到内存中的位置而变化。好,我们接下来看一下什么是逻辑地址。 ?...,而引入逻辑地址的。...最后段地址+偏移地址=逻辑地址,也就是[0003]+[0000]=[0003],最后CPU会在[0003]这个逻辑地址中找到正确的数据。 如果数据段还是在[0001]开始的位置处呢?

    6.6K41

    【Linux】地址空间&&虚拟地址

    这个地址绝对不是物理地址,理论上修改了数据为300之后不可能在输出有100,访问一个地址怎么可能又是100也是300。这个地址在系统层面上称之为虚拟地址。...在32位和64位下的地址空间大小是不一样的,为了方便这里使用32位来表述。32位从低到高一个有4GB的地址空间范围,实际上这个地址空间当中打印出来的地址,是该空间内对应的地址。...其实PCB和地址空间都是在物理内存里面的,只不过要访问初始化全局数据的时候,不在地址空间上保存,地址空间只会提供线性连续地址,让用户之后通过虚拟地址的地址空间,将虚拟地址转化到为了物理内存中。...,所以在地址空间的初始化数据中就有它的地址虚拟地址,页表的左侧也有它的虚拟地址,在页表右侧就有它对应的物理地址。...所以虚拟地址相同而物理地址不同。 3. 进程调度 Linux中的nice值并不是能任意调度的,而是从-20到19,这40个数字之间变换。

    1.4K10

    【linux】地址空间

    在Linux地址下,这种地址叫做 虚拟地址 我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理 OS必须负责将 虚拟地址 转化成 物理地址 。...虚拟地址空间中的地址通过内存管理单元(MMU)映射到物理内存地址。 2. 地址空间的作用 隔离性:每个进程有自己的虚拟地址空间,其他进程不能直接访问。...程序内部使用的地址都是基于虚拟地址空间,页表负责将这些地址实时映射到实际的物理内存地址,为程序的正确执行提供支撑 03.Linux2.6内核进程调度队列 前面提到的nice值范围在[-20,19]...在 Linux 2.6 内核中,进程调度得到了很大的改进,以提高系统的效率、响应性和可扩展性。...Linux 2.6 使用了一种称为 Ø(1)调度器 的调度算法,这种算法通过使用多个调度队列来达到高效调度。

    1.9K10

    操作系统中逻辑地址和物理地址的区别

    本文是关于操作系统中逻辑地址和物理地址之间的区别。计算机操作系统中的内存使用两种不同类型的地址。物理地址是内存的实际地址,如RAM,虚拟地址只是缓存和RAM之间的逻辑地址映射。...在对地址以及为什么需要它们进行了快速讨论之后,我们现在将区分逻辑地址和物理地址。 1、逻辑地址简介 当我们谈论逻辑地址时,我们指的是CPU分配给每个进程的地址。...大多数操作系统在其程序中都定义了基地址,在生成逻辑地址时,CPU 生成一个地址,程序将基地址与 CPU 生成的地址相加得到逻辑地址,即 逻辑地址 = 基地址 + CPU 生成地址 一个逻辑地址空间是指CPU...产生的所有逻辑地址的集合。...下面给出了逻辑地址和物理地址的一般比较。

    3.6K30

    Linux进阶命令-逻辑或&逻辑与

    我们接下来将讲解一些进阶命令,主要从以下几个方面来讲解:一些系统操作,系统查看处理,Linux文本处理,逻辑判断,重定向,网络传输,服务启动,文件句柄等内容。...进阶命令-sort&wc Linux进阶命令-sed&split Linux进阶命令-awk&uniq Linux进阶命令-逻辑或&逻辑与(本章节) Linux进阶命令-重定向 Linux进阶命令-scp...逻辑或 and || 在 Linux 命令行中,逻辑“或”用于控制命令的执行流程。特别是在命令链中,它用于执行多个命令,其中只有在前一个命令失败时才会执行后一个命令。...具体来说,逻辑“或”运算符在 Linux 中的表现如下: || 操作符 语法: command1 || command2 功能: 如果 command1 执行失败(返回一个非零状态码),则 command2...总结 逻辑或和逻辑与是两个功能相反的命令,一个是前一个命令执行成功,则执行后面的命令;一个是前一个命令执行失败则执行后面的命令。 他们符号是一个是"||","&&" 。

    40510

    程序优化之”变量名长短”,内存逻辑地址,物理地址

    (一个空教室,小明已经坐了一个位置,其他同学不能坐在他大腿上了诶) 物理内存地址 上面这个概念就是物理内存地址,描述说明在硬件中实际的储存位置(好比 二排三列) 逻辑内存地址 那么我们的程序在编译完成之后...,怎么确定它在运行时到底使用哪一块内存地址呢?...使用的是相对的逻辑内存地址。 比如我们有以下一份PHP代码 <?...php $a = 1; $b = 3; 那么编译后的程序可能如下(用文字描述) Location = 向系统申请内存地址,并返回物理内存地址 申请一块内存,储存代码$a的值,对应的物理内存地址为 ·Location...+ 1· 申请一块内存,储存代码$b的值,对应的物理内存地址为 ·Location + 1 + 1· 这里用1来代表一个变量需要占用的大小(仅仅为了说明,每个语言的数据结构不同) 这就是相对的逻辑内存地址了

    76810

    Linux编程--地址计算

    // 获取第一个出现`-`位置的字符串 char *first_bar_pos = strchr(maps_line, '-'); // 计算maps中的地址大小...itself*/ +1/* space before privbit*/; // 如果当前内存页不可读,也不可执行的话,也就意味着不是我们要找的ELF文件的内存地址...= 'x') { continue; } } 在计算addr_size的时候,使用的两个(char *)的减进行运算,为何能得到地址的大小?...而first_bar_pos与maps_line则这是上面两个字符串的地址,那么这两个地址相减,就是5da215f000字符串的大小,正好是10个字节。 所以就认为计算出来的地址长度为10。...privbits 相应的,在获取到addr_size的大小之后,通过first_bar_pos+addr_size+1+1,获取到的字符数组首地址指向的就是r-xp这一段文本了。

    1.6K00

    Linux:进程地址空间

    实验: 我们会发现同一个地址竟然读到了不同的内容!! 如果变量的地址是一个物理地址,是绝对不可能出现这种情况的,因此我们的变量地址必然是不是物理地址!!...——>结论:我们平时C/C++里面使用的地址全都不是物理地址,而是虚拟地址! 用户是看不到物理地址的,而OS必须要负责将我们所看到的虚拟地址转化成物理地址!...所以地址空间就是地址总线排列组合形成的地址的范围【0,2^32】 3.2 如何理解地址空间的区域划分?  ...这是有Linux的内存模块去管理的,进程并不需要关心。 结论4:其实变量名在定义的时候就已经被转化成一个个虚拟地址了,而我们之所以有a和&a,本质上是为了区分想获取的是变量的值还是地址。...结论5:以前我们所学习的C内存管理,其实本质上是进程地址空间,而内存管理是由Linux替我们完成的,我们上层语言并不需要关心具体的细节,只需要正常去通过对应的线性地址去使用就行了。

    97510

    【Linux】进程地址空间

    首先我们可以肯定的是,这个地址一定不是物理地址!同一块物理地址访问到的值一定是一样的!...下面我们来讨论一下 二、进程地址空间 1、页表 我们在之前讲到的程序地址空间的说法其实是错误的,正确来说应该叫进程地址空间,上面我们所说的地址叫做虚拟地址,也叫做线性地址,既然叫做虚拟地址,那当然就不是真实的物理地址了...,也就是虚拟地址是相同的,我们不是复制出了两个地址空间,这里需要注意 内核空间中有父子进程的task_struct,它们里面有指向各自页表的指针 其中上方是父进程的地址空间,下方是子进程的地址空间,子进程直接复制父进程的地址空间...,然后再将g_val改成100,然后页表的物理地址指向该地址,这个过程是写时拷贝,我们前面提到过 其中MMU起到的作用是负责将进程虚拟地址转换为物理地址,当 CPU 需要访问内存时,会将虚拟地址发送给...,这个地址是可以直接被操作系统使用的,这是可以使用地址找到的最小单位,类似于bit这样的存储单元是没有地址的概念的 所以所谓的进程地址空间,本质上是一个描述进程可视范围的大小,地址空间内一定要存在各种区域的划分

    90510

    linux进程地址空间

    3.1地址空间简介 我们的程序存储区分为代码区,字符常量区,全局数据区,堆区,栈区等等几个部分,地址是有低地址到高地址进行增长的,我们把这个叫做地址空间; 在栈区定义的变量,这个先定义先入栈,后定义的变量后入栈...,怎么可能一个变量一个地址,但是这个变量的数值却不一样,这个就是因为这个打印的结果不是真实的物理地址,而是我们的虚拟地址; 3.3页表概念的引入 页表是一张显示这个虚拟地址和真真实的物理地址的关系的映射表...,这个虚拟地址子进程就是拷贝的父进程的,所以这个打印的结果是一样的,但是这个实际上的物理地址不是一样的; 3.4谈谈细节 到底什么是进程地址空间:数据总线排列组合形成的地址的范围[0,2^32); 进程地址空间实际上就是我们的进程的一个可以使用的范围...,我们可以在这个区域上面进行区域的划分,存放各种数据; 进程地址空间在内核里面就是一个内核对象结构体,这个结构体里面有地址区域的起始位置的地址start和终止位置的地址end; 3.5进程地址空间管理...; 因此这个里面存在缺页中断,就是这个虚拟地址空间没有对应的物理地址空间,就是这个页表上面的虚拟地址数量大于这个物理地址数量,就是因为这个物理空间不会一次性全部开辟,而是进行的惰性加载;实际上,我们之前介绍的这个写实拷贝

    71810

    初识Linux · 地址空间

    前言: 本文介绍的是有关地址空间,咱们的介绍的大体思路是,先直接看现象,通过现象我们引入地址空间的概念,然后是简单的介绍地址空间,如何理解地址空间等,在往后的学习中,我们大概会介绍地址空间3 - 4次,...由图我们知道,由堆区的地址,栈的地址,初始化数据的地址等,但是同时,不是所有的地址我们都是可以访问的,像内核空间的地址,我们知道,但是是无法访问的。一个空间里面充满了地址,可以用什么变量表示呢?...所以地址空间本质上就是结构体,进程通过地址空间的所有地址来找到物理内存中对应的数据。 那么问题又来了,里面不是都存的虚拟地址吗,怎么通过虚拟地址来找物理地址呢? 这时候,页表就该引入了。...page_table_lock, in other configurations by being atomic. */ struct mm_rss_stat rss_stat; struct linux_binfmt...这里对于虚拟地址也带一嘴,虚拟地址哪里来的呢?为什么地址空间一来就有地址呢?

    70510

    Linux进程地址空间

    Linux进程地址空间是学习Linux的过程中,我们遇见的第一个难点,也是重中之重的重点。虽然它很难,但是,等我们真正懂得了这样设计的原理,我们不禁会感叹:这真的是太妙了。...;环境变量的地址比命令行选项的地址大。...我们读取的地址是虚拟地址(也叫做逻辑地址)。虚拟地址空间就是操作系统内核中的一个名为mm_struct结构体。 1.mm_struct 每一个进程都只有1个内存描写符mm_struct。...arg_start,结束arg_end,环境段的开始env_start,结束env_end unsigned long saved_auxv[AT_VECTOR_SIZE]; struct linux_binfmt...2.父子两个进程修改同一变量的原理 写时拷贝技术 我们在取地址操作中得到的地址都是虚拟地址,虚拟地址通过一张表格和内存之间建立映射关系,进而通过虚拟地址找到真正的内存中的地址,得到代码和数据。

    91310

    【Linux】进程地址空间

    显示相同地址,却是不同的值 下面在Linux上验证 创建test.c文件 st.c  ⮀...假设是物理地址,不可能同一个变量的地址,而读取到不同的值 我们在语言层面用的地址,不是物理地址,而是虚拟地址或者线性地址、 2 ....1字节 定义一个整数相当于在内存中开辟4个字节,连续4个字节对应的起始地址对应整形变量的起始地址 一个整数4个字节,而每个字节都有自己的地址,所以一个整数要有四个地址,而正常来说会取首地址作为整数的地址...地址空间是一段线性范围,从全0到全FFFF(16进制),因为数字是线性的,每一个数字表示一个地址,每个地址对应一个字节 地址空间是线性结构的 4.确定地址空间 32位下地址空间默认为0-42亿多 假设空间范围为...对第一个问题的解答 直接用的是虚拟地址,找到地址不是目的,而是该地址所对应的内容 页表:将虚拟地址转化成物理地址,左侧填充虚拟地址,右侧填充物理地址 当有一个虚拟地址,通过特定的地址空间想访问特定的区域时

    3.8K10
    领券