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

虚拟地址(VA,virtual address)物理地址(PA, ,physical address)转换

在系统层面上,虚拟地址产生原因之一也是因为软件应用地址空间远大于实际物理空间。这个时候系统上硬件或者软件除了需要完成业务,还要进行VAPA转换,让业务访问到实际物理地址空间。...虚拟地址产生另外一个原因就是给软件减负,在撸代码时候不会关心变量具体存在那里,会不会和其它地址范围发生冲突。 ?...为了实现虚拟地址物理地址转换,那么就需要硬件具有格外资源存储VA2PA转换关系,即页表。 ? 那么这个时候就会涉及粒度问题,对,就是最近互联网黑话“颗粒度”中“粒度”。...如果是4KB粒度,VA低12bit就等于PA低12bit;如果是16KB粒度,VA低14bit就等于PA低14bit;如果是64KB粒度,VA低16bit就等于PA低16bit,这也是数字芯片中业务需求和硬件资源中一种权衡...页表中除了保存着VAPA转换关系,还可以保存着相应存储空间各种属性(比如可执行、可读和可写属性)。

1.7K50

通过linux0.11源码理解进程虚拟地址线性地址物理地址

进程地址有三种,分别是虚拟地址(逻辑地址)、线性地址物理地址。在分析之前先讲一下进程执行时候,地址解析过程。...然后根据cs值选择idt表格中一项,从而得到代码段地址和限长,用基地址加上ip指向偏移得到一个线性地址,这个线性地址分为三个部分,分别是页目录索引,页表索引,物理地址偏移。...然后到页目录吧和页表中找到物理地址地址,再加线性地址偏移部分,得到物理地址。下面我们看看这些内容是怎么设置,使得执行时候能正确找到我们想要地址去执行代码。我们从fork函数开始。...用线性地址地址加上ip 中偏移,得到线性地址,然后再通过页目录和页表得到物理 地址物理地址还没有分配则进行缺页异常等处理。...接着计算一个在全局描述符GDT中一个索引,这个索引是ldt选择子。后面会讲到。然后计算进程代码和数据线性地址地址和限长,写到ldt描述符中。接着复制页表,但是不分配物理地址

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

    手动玩转虚拟地址物理地址转化

    我们这次来根据dump动手来实际转化一个虚拟地址物理地址,此次地址不是线性地址映射。...,而我们努力方向就是物理地址:0xC549F000。...根据TTBR(0/1)寄存器获取到页表地址 页表基地址+PGD_Index获取PGD表中一项,此项就是PMD表地址 根据PDM基地址+PMD_Index获取PMD中一项,此项就是PTE表地址...根据PTE基地址+PTE_Index获取直接页表地址 根据直接页表地址+offset就可以获取真正物理地址 转化之前先确认是此地址是属于用户空间还是内核空间。...present意思是页是否是有效,无效代表虚拟物理地址之间转化无效,当访问虚拟地址时候就会page fault protection :权限之类,是否读写执行权限之类

    2.3K20

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

    物理地址属于比较好理解物理地址就是内存中每个内存单元编号,这个编号是顺序排好物理地址大小决定了内存中有多少个内存单元,物理地址大小由地址总线位宽决定!...当我们要对物理地址做操作时比如if语句要根据CPU状态标志寄存器来做不同跳转,那么这个时候就要对CPU额状态寄存器做操作了就必须知道它物理地址,内存中有一个电子元件叫MMU负责从操作系统已经初始化好内存映射表里查询与虚拟地址对应物理地址转换...,并将其转换成真正实际物理地址,然后在对这个实际物理地址给CPU,在由CPU去执行对应命令,相反CPU往内存里读数据时比如A进程要读取内存中某个虚拟地址数据,A进程里指令给是虚拟地址,MMU...首先会检查CPU分页状态寄存器标志位是否被设置,如果被设置MMU会捕获这个虚拟地址并将其转换成相应物理地址然后提交给CPU,在由CPU内存中去取数据!...后面3位包含一些硬件细节,如图(转载百度百科): image.png 逻辑地址即程序中地址,比如说0x10x4为一个页面,那么0x1-0x4之间地址称为逻辑地址,逻辑地址可以通过内存中段数组里寻找段选择符

    3.2K00

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

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

    1.9K00

    物理地址和虚拟地址分布

    Linux物理地址和虚拟地址关系 ? Linux 将 4G 线性地址空间分为2部分,0~3G 为 user space,3G~4G 为 kernel space。...由于开启了分页机制,内核想要访问物理地址空间的话,必须先建立映射关系,然后通过虚拟地址来访问。为了能够访问所有的物理地址空间,就要将全部物理地址空间映射到 1G 内核线性空间中,这显然不可能。...于是,内核将 0~896M 物理地址空间一对一映射到自己线性地址空间中,这样它便可以随时访问 ZONE_DMA 和 ZONE_NORMAL 里物理页面;此时内核剩下 128M 线性地址空间不足以完全映射所有的...ZONE_HIGHMEM,Linux 采取了动态映射方法,即按需将 ZONE_HIGHMEM 里物理页面映射到 kernel space 最后 128M 线性地址空间里,使用完之后释放映射关系...虽然这样存在效率问题,但是内核毕竟可以正常访问所有的物理地址空间了。 这里我们应该知道了 Linux 是如何用虚拟地址来映射物理地址,最后我们用一张图来总结一下: ?

    2.1K31

    物理地址和虚拟地址分布

    Linux物理地址和虚拟地址关系 ? Linux 将 4G 线性地址空间分为2部分,0~3G 为 user space,3G~4G 为 kernel space。...由于开启了分页机制,内核想要访问物理地址空间的话,必须先建立映射关系,然后通过虚拟地址来访问。为了能够访问所有的物理地址空间,就要将全部物理地址空间映射到 1G 内核线性空间中,这显然不可能。...于是,内核将 0~896M 物理地址空间一对一映射到自己线性地址空间中,这样它便可以随时访问 ZONE_DMA 和 ZONE_NORMAL 里物理页面;此时内核剩下 128M 线性地址空间不足以完全映射所有的...ZONE_HIGHMEM,Linux 采取了动态映射方法,即按需将 ZONE_HIGHMEM 里物理页面映射到 kernel space 最后 128M 线性地址空间里,使用完之后释放映射关系...虽然这样存在效率问题,但是内核毕竟可以正常访问所有的物理地址空间了。 这里我们应该知道了 Linux 是如何用虚拟地址来映射物理地址,最后我们用一张图来总结一下: ?

    2.1K111

    linux内核空间进程为什么无论如何切换,内核地址空间转换物理地址关系是永远不变

    Linux内核中,无论如何切换进程,内核地址空间转换物理地址关系是永远不变,主要原因是内核地址空间在所有进程中是共享。这种设计有几个关键点: 1....内核地址空间共享 在Linux操作系统中,每个进程都有自己独立用户空间地址范围,但内核空间地址范围对所有进程是共享。...内核地址空间映射 内核地址空间直接映射到物理内存某个范围内,这种映射在系统启动时就已经建立,并且在系统运行期间保持不变。也就是说,内核空间虚拟地址总是映射到相同物理地址。 3....页表和地址转换 在x86架构中,内核和用户空间地址转换通过页表来实现。每个进程都有自己页表用于转换用户空间地址物理地址。然而,所有进程共享同一个内核空间,因此这些页表中内核空间部分是相同。...总结 由于内核地址空间在所有进程中是共享,并且在系统启动时已经建立了固定映射关系,内核地址空间转换物理地址关系在整个系统运行期间保持不变。

    12310

    Linux下内存空间分配、物理地址与虚拟地址映射

    一、Linux内核动态内存分配与释放 1.1 kmalloc函数 Kmalloc分配是连续物理地址空间。...IO地址; size:要映射空间大小; flags:要映射IO空间和权限有关标志; phys_addr:是要映射物理地址 size:是要映射长度,单位是字节 头文件:#include <linux...执行单元发出后,都会首先被MMU拦截并转换物理地址,然后再发送给内存。...MMU中VAPA映射最小单位称为页(Page),映射最低粒度是单个虚拟页物理页,页大小通常是4K,即一次最少要把4K大小VA页块整体映射到4KPA页块(从0开始4K对齐划分页块),页内偏移不变...ARM cpu地址转换涉及三种地址:虚拟地址(VA,Virtual Address),变换后虚拟地址(MVA,Modified Virtual Address),物理地址(PA,Physical Address

    3.4K31

    深入理解虚拟 物理地址转换,页表--基于ARMV8

    页表转换寄存器描述符 1.1,页表/页目录结构 基于前言中内核配置,内核采用39位虚拟地址,因此可寻址范围为2^39 = 512G,采用(linux 默认为五级页表,另外还有PUD,P4D,由于本文只配置三级...,该宏就产生这个对应项,即页表线性地址 2....b,可变大小内存块地址(如果为块地址,其还需要加上va[offset]才能构成物理地址,所以称可变大小)。 c,可以标记为Fault或Invalid(无效条目)。...2.3 用户/内核PGD表基地址 基于之前分析可知,用户虚拟地址和内核虚拟地址转换物理地址时候使用不同页表基地址寄存器(TTBRx),因此他们转换是基于不同全局页目录表PGD。...页表查询,因此在进程切换时,TTBR0中值(task_struct.mm.pgd)是要同时改变,这也与linux中每一个进程都独占整个虚拟(此为512G)地址空间相对应; 三、转换流程 据此可以画出如下转换框图

    43400

    【计算物理地址】计算存储器操作数物理地址时候如何选择DS还是SS

    先看例题 DS=3000H,ES=4000H,SS=5000H,BX=0300H,BP=0050H,SI=0200H计算下列指令中存储器类型操作数物理地址。...(1)MOV AL,[BP+5] (2)ADD AL,5[BX+SI] (3)MOV BP,[2000H](4)ADD [BP][SI]+20H,AX并详细解释如何选择DS还是SS 要计算给定指令中存储器类型操作数物理地址...ADD [BP][SI]+20H,AX 段寄存器:因为涉及BP寄存器,所以段寄存器为SS。...总结 MOV AL,[BP+5]: 物理地址 = 50055H (使用SS) ADD AL,5[BX+SI]: 物理地址 = 30505H (使用DS) MOV BP,[2000H]: 物理地址 = 32000H...(使用DS) ADD [BP][SI]+20H,AX: 物理地址 = 50270H (使用SS) 在计算物理地址时,选择DS还是SS关键在于是否使用了BP寄存器:如果使用BP,则默认使用SS;否则使用

    6010

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

    本文是关于操作系统中逻辑地址物理地址之间区别。计算机操作系统中内存使用两种不同类型地址物理地址是内存实际地址,如RAM,虚拟地址只是缓存和RAM之间逻辑地址映射。...在操作系统中,我们使用 32 位体系结构中 32 位地址空间和0xFFFFFFFF形式十六进制数,从 0x000000000xFFFFFFFF。...然而,内存单元存储在由物理地址(用户未知)访问主内存中,我们所知道只是进程逻辑地址。那么当我们需要访问进程时候我们将如何访问物理地址呢?...图1.2:逻辑地址物理地址映射 这个内存管理单元对逻辑地址物理地址执行所有必需映射。由MMU执行非常基本映射是由一种称为界限和基址方案执行。这是执行映射可以使用最简单方法。...2.2、基址和界限法 图1.3:基地址和边界地址转换 在基于界限和基址方法中,每个 MMU 单元都有两个寄存器,称为基址寄存器和界限寄存器。

    2.7K30

    给你系统增加对物理地址验证

    给你系统增加对物理地址验证 我们开发出一个系统之后,经常有很多方法来保护我们系统不受别人非法使用,比如说采用注册码,根据IP地址进行限制等。...,因为电脑物理地址已经改变,所以原来所使用注册码将失效,这样可以防止了系统非法拷贝。...开发原理 其中这个原理比较简单,首先我们是根据用户提供物理地址制作出一个license文件(或者是注册码,这个注册码是根据保护了物理地址信息,不过最好是要先通过编码),就是通过系统命令来获得电脑物理地址...,比如说windows系统“ipconfig /all”命令,这样就可以获得该电脑物理地址;然后我们根据这个物理地址跟注册码中获得物理地址进行比较,如果相同的话,就允许使用系统,否则,不允许使用系统...接下来我们就要对这个信息跟注册码里面的信息进行比较了,不过这里有个问题,就是不同系统获得物理地址命令是不同,windows系统是采用ipconfig /all命令,而linux和unix系统是采用

    49820

    用户态进程如何得到虚拟地址对应物理地址

    一般我们不需要从用户态得到进程虚拟地址对应物理地址,因为一般来说用户进程是完全不关心物理地址。 少数应用场景下,用户可能会关心,比如在用户态做DMA场景(如DPDK之类)。...还有一些场景,比如想调试剖析每一页内存占用情况,是否swap出去了等。 从用户态得到虚拟地址对应物理地址,我们不可能去walk进程page table,也没有权限。...在/proc/pid/下面有个文件叫pagemap,它会每个page,生成了一个64bit描述符,来描述虚拟地址这一页对应物理页帧号或者SWAP里面的便宜,详见文档: linux/Documentation...下面我们忽略swap影响(假设关闭了swap或者page一直是pin状态),从DPDK抄一段虚拟地址转换物理地址代码: #define phys_addr_t uint64_t #define...得到这页起始物理地址,之后加上virtaddr % page_size页内偏移,得到最终物理地址

    3.8K21

    Linux 内核 内存管理】内存映射原理 ① ( 物理地址空间 | 外围设备寄存器 | 外围设备寄存器物理地址 映射到 虚拟地址空间 )

    文章目录 一、物理地址空间 二、外围设备寄存器 三、外围设备寄存器物理地址 映射到 虚拟地址空间 一、物理地址空间 ---- " 物理地址空间 “ 是 CPU 处理器 在 ” 总线 " 上 访问内存地址..., RISC 处理器 只能访问 物理地址空间 , 系统 外围设备 与 物理内存 都使用 统一物理地址空间 访问 ; RISC 全称 " Reduced Instruction Set Computer..." , 精简指令集计算机 ; 分配给 " 外围设备 " 物理地址 , 又称为 " 设备内存 " ; ARM64 架构系统中 , 物理地址空间 分为 2 类 : ① 正常内存 : Normal..., 三、外围设备寄存器物理地址 映射到 虚拟地址空间 用户空间 应用进程 , 访问 " 外围设备寄存器 " 只能通过 " 虚拟地址 " 实现 , Linux 内核 提供了 相关 API 函数 , 将..." 外围设备寄存器 “ 对应物理地址 “ 映射到了 ” 虚拟地址空间 " 中 ;

    3.2K20

    80386分段机制、分页机制和物理地址形成

    在80386 段机制中,逻辑地址由两部分组成,即段部分(选择符)及偏移部分。 段是形成逻辑地址线性地址转换基础。如果我们把段看成一个对象的话,那么对它描述如下。...(3)段属性(Attribute): 表示段特性。例如,该段是否可被读出或写入,或者该段是否作为一个程序来执行,以及段特权级等。 1、逻辑地址线性地址物理地址 ?...每个段地址为0,因此,逻辑地址线性地址映射保持不变,也就是说,偏移量就是线性地址,我们以后所提到逻辑地址(或虚拟地址)和线性地址也就是同一地址。...分页机制通过把线性地址空间中页,重新定位物理地址空间来进行管理,因为每个页面的整个4K 字节作为一个单位进行映射,并且每个页面都对齐4K 字节边界,因此,线性地址低12 位经过分页机制直接地作为物理地址低...由于每个页面为4K 个字节,所以,存储器大小正好最多为4GB。 当访问一个操作单元时,如何由分段结构确定32 位线性地址通过分页操作转化成32位物理地址呢?

    1K30

    80386分段机制、分页机制和物理地址形成

    在80386 段机制中,逻辑地址由两部分组成,即段部分(选择符)及偏移部分。 段是形成逻辑地址线性地址转换基础。如果我们把段看成一个对象的话,那么对它描述如下。...(3)段属性(Attribute): 表示段特性。例如,该段是否可被读出或写入,或者该段是否作为一个程序来执行,以及段特权级等。 1、逻辑地址线性地址物理地址 ?...每个段地址为0,因此,逻辑地址线性地址映射保持不变,也就是说,偏移量就是线性地址,我们以后所提到逻辑地址(或虚拟地址)和线性地址也就是同一地址。...分页机制通过把线性地址空间中页,重新定位物理地址空间来进行管理,因为每个页面的整个4K 字节作为一个单位进行映射,并且每个页面都对齐4K 字节边界,因此,线性地址低12 位经过分页机制直接地作为物理地址低...由于每个页面为4K 个字节,所以,存储器大小正好最多为4GB。 当访问一个操作单元时,如何由分段结构确定32 位线性地址通过分页操作转化成32位物理地址呢?

    1.3K50
    领券