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

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

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

1.4K60

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

物理地址: 这里说的物理地址是内存中的内存单元实际地址,不是外部总线连接的其他电子元件的地址!...物理地址属于比较好理解的,物理地址就是内存中每个内存单元的编号,这个编号是顺序排好的,物理地址的大小决定了内存中有多少个内存单元,物理地址的大小由地址总线的位宽决定!...,虚拟内存里的所有地址都是不直接的,所以你有时候可以看到一个虚拟地址对应不同的物理地址,比如A进程里的call函数入口虚拟地址是0x001,而B也是,但是它俩对应的物理地址却是不同的,操作系统采用这种内存管理方法...是防止程序对物理地址写数据造成一些不可必要的问题,比如知道了A进程的物理地址,那么向这个地址写入数据就会造成A进程出现问题,在虚拟内存中运行程序永远不知道自己处于内存中那一段的物理地址上!...+段偏移地址轻易得到物理地址

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

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

线性地址线性地址是逻辑地址物理地址之间的一个中间层变换,程序代码会产生逻辑地址,或者说是段中的偏移地址,加上相应段的基地址就生成了一个线性地址,逻辑地址是如何知道自己的段基的址?...如果启用了分页机制,那么MMU内存管理单元会在内存映射表里寻找与线性地址对应的物理地址。若没有启用分页机制,那么线性地址直接就是物理地址。...Intel 80386的线性地址空间容量为4G(2的32次方即32根地址总线寻址)。...逻辑地址即程序中的段地址,比如说0x1到0x4为一个页面,那么0x1-0x4之间的段地址称为逻辑地址,逻辑地址可以通过内存中的段数组里寻找段选择符+段偏移地址轻易得到物理地址。...线性地址是逻辑地址物理地址之间的一个中间层变换,程序代码会产生逻辑地址,或者说是段中的偏移地址,加上相应段的基地址就生成了一个线性地址

1.9K00

物理地址和虚拟地址的分布

物理地址空间布局 Linux系统在初始化时,会根据实际的物理内存的大小,为每个物理页面创建一个page对象,所有的page对象构成一个mem_map数组。...Linux物理地址和虚拟地址的关系 ? Linux 将 4G 的线性地址空间分为2部分,0~3G 为 user space,3G~4G 为 kernel space。...由于开启了分页机制,内核想要访问物理地址空间的话,必须先建立映射关系,然后通过虚拟地址来访问。为了能够访问所有的物理地址空间,就要将全部物理地址空间映射到 1G 的内核线性空间中,这显然不可能。...于是,内核将 0~896M 的物理地址空间一对一映射到自己的线性地址空间中,这样它便可以随时访问 ZONE_DMA 和 ZONE_NORMAL 里的物理页面;此时内核剩下的 128M 线性地址空间不足以完全映射所有的...虽然这样存在效率的问题,但是内核毕竟可以正常的访问所有的物理地址空间了。 到这里我们应该知道了 Linux 是如何用虚拟地址来映射物理地址的,最后我们用一张图来总结一下: ?

2K31

物理地址读写驱动

正文 没有用MmMapIoSpace,用了映射的方式对物理地址数据进行读写,之前测试MmMapIoSpace在win10较高版本用不了,貌似是不支持了。...用法和效果如下,加载驱动后,Read.exe用来读取物理地址的数据,限制为0x100字节大小,当然可以通过修改驱动代码来读取任意字节,我这里只是给了个demo;Write.exe则是对指定的物理地址进行写操作...注 不是驱动大佬,可能驱动代码写的并不是很好,如果有什么意见或者驱动存在了蓝屏的问题,欢迎指出和指导 /* function 读取物理地址,大小为FF argv MapAddress:物理地址映射出来的地址...; //存放物理地址 SIZE_T size = 0x2000; //映射大小 //打开内核对象 status = GetPhysicalHandle(); if (status < 0)...; //存放物理地址 SIZE_T size = 0x2000; //映射大小 //打开内核对象 status = GetPhysicalHandle(); if (status < 0)

2.4K40

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

一、Linux内核动态内存分配与释放 1.1 kmalloc函数 Kmalloc分配的是连续的物理地址空间。...interrupt_init); /*驱动入口*/ module_exit(interrupt_exit); /*驱动出口*/ MODULE_LICENSE("GPL"); 1.2 vmalloc 函数 分配的空间是线性的...phys_to_virt只是计算出某个已知物理地址所对应的虚拟地址。将内核物理地址转化为虚拟地址。 virt_to_phys :将内核虚拟地址转化为物理地址。...; size:要映射的空间的大小; flags:要映射的IO空间的和权限有关的标志; phys_addr:是要映射的物理地址 size:是要映射的长度,单位是字节 头文件:#include <linux...与虚拟地址空间和虚拟地址相对应的则是物理地址空间和物理地址,大多数时候我们的系统所具备的物理地址空间只是虚拟地址空间的一个子集。

2.9K31

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

在WCF中,每个终结点都包含两个不同的地址——逻辑地址物理地址。逻辑地址就是终结点Address属性表示的地址。...至于物理地址,对于消息发送放来讲,就是消息被真正发送的目的地址;而对于消息的接收放来讲,就是监听器真正监听的地址。 一、服务端的物理地址 在默认的情况下,终结点的逻辑地址物理地址是同一个URI。...换句话说,终结的逻辑地址是必须的,如何物理地址没有指定的,默认使用逻辑地址作为物理地址。...上面我们介绍了基于消息接收端终结点物理地址的指定,现在我们来介绍对于消息发送端的终结点,物理地址如何指定。...ClientViaBehavor定义的Uri代表该物理地址

775110

IP地址物理地址有什么区别

MAC(Media Access Control,介质访问控制)地址 (物理地址)是识别LAN(局域网)节点的标识。...就是你的电脑的身份证啦~这个地址是由网卡决定的,但是可以在注册表里面改动系统读取的网卡物理地址。...Mac地址就是在媒体接入层上使用的地址,通俗点说就是网卡的物理地址,现在的Mac地址一般都采用6字节48bit(在早期还有2字节16bit的Mac地址)。   ...MAC地址也叫物理地址、硬件地址或链路地址,由网络设备制造商生产时写在硬件内部。...IP地址是跟据现在的IPv4标准指定的,不受硬件限制比较容易记忆的地址,而Mac地址却是用网卡的物理地址,多少与硬件有关系,比较难于记忆。

1.4K10

【操作系统复习】物理地址虚拟地址

【操作系统复习】 物理地址虚拟地址 物理地址和虚拟地址的区别 物理地址 逻辑地址 线性地址 为什么要分成物理地址和虚拟地址 物理内存及虚拟内存定义 为什么要有虚拟内存 虚拟内存的实现(可以在页式或段式内存管理的基础上实现...虚拟地址转换为物理地址的过程 快表是存储在哪里的 物理地址和虚拟地址的区别 操作系统有物理地址、逻辑地址线性地址(也叫虚拟地址)三种地址 物理地址 在存储器里以字节为单位存储信息,为正确地存放或取得信息...逻辑地址由两个16位的地址分量构成,一个为段基值,另一个为偏移量。两个分量均为无符号数编码。 线性地址 线性地址(Linear Address)是逻辑地址物理地址变换之间的中间层。...至于线性地址,仅存在于段页式,逻辑地址查找段表得到线性地址线性地址查找页表得到物理地址 这就是 overfitting 32-bit x86 的坏处了,你提到的几个概念有些是 x86 特有的,别的体系结构里没有它...Linux 线性地址,逻辑地址和虚拟地址的关系?

2K20

物理地址和虚拟地址的分布

物理地址空间布局 Linux系统在初始化时,会根据实际的物理内存的大小,为每个物理页面创建一个page对象,所有的page对象构成一个mem_map数组。...Linux物理地址和虚拟地址的关系 ? Linux 将 4G 的线性地址空间分为2部分,0~3G 为 user space,3G~4G 为 kernel space。...由于开启了分页机制,内核想要访问物理地址空间的话,必须先建立映射关系,然后通过虚拟地址来访问。为了能够访问所有的物理地址空间,就要将全部物理地址空间映射到 1G 的内核线性空间中,这显然不可能。...于是,内核将 0~896M 的物理地址空间一对一映射到自己的线性地址空间中,这样它便可以随时访问 ZONE_DMA 和 ZONE_NORMAL 里的物理页面;此时内核剩下的 128M 线性地址空间不足以完全映射所有的...虽然这样存在效率的问题,但是内核毕竟可以正常的访问所有的物理地址空间了。 到这里我们应该知道了 Linux 是如何用虚拟地址来映射物理地址的,最后我们用一张图来总结一下: ?

2K111

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

好了,回归这题,本篇文章主要给大家讲述一下物理地址和逻辑地址的概念,以及它们之间的联系与区别。ps:本文以Intel8086处理器为例讲述。...以上过程中的[0001]就是我们所要说的物理地址,它是一个绝对的固定的地址。 ? 那假如我们指令中的地址用的是物理地址(绝对地址),会产生怎样的问题呢?...如果我们将[0001]当成物理地址的话,那么mov ax,[0001]这句指令读取到的将会是错误的内容。...由此,便诞生了我们将要说的逻辑地址的概念,物理地址它是固定不变的,而逻辑地址会随着程序加载到内存中的位置而变化。好,我们接下来看一下什么是逻辑地址。 ?...首先来看一下mov ax,[0001]这条指令,其实呢,我们的编译器会将其转化为mov ax,[0000],而并不是像上文所讲的那样,将[0001]看作一个物理地址然后直接去寻址,上文所讲只是为了说明其问题所在

4K40

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

本文是关于操作系统中逻辑地址物理地址之间的区别。计算机操作系统中的内存使用两种不同类型的地址物理地址是内存的实际地址,如RAM,虚拟地址只是缓存和RAM之间的逻辑地址映射。...虚拟地址也称为指向主存储器中实际或物理地址的引用或指针。...然而,内存单元存储在由物理地址(用户未知)访问的主内存中,我们所知道的只是进程的逻辑地址。那么当我们需要访问进程的时候我们将如何访问物理地址呢?...下面给出了逻辑地址物理地址的一般比较。...物理地址 逻辑地址 定义 物理内存地址 虚拟地址 空间 内存空间所在的实际内存地址 引用物理地址/实际地址,称为逻辑地址空间 可见性 只对开发人员可见,对程序员不可见 只对用户可见 访问 用户在任何情况下都无法访问

2.5K30

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

文章目录 一、物理地址空间 二、外围设备寄存器 三、外围设备寄存器物理地址 映射到 虚拟地址空间 一、物理地址空间 ---- " 物理地址空间 “ 是 CPU 处理器 在 ” 总线 " 上 访问内存的地址..., RISC 处理器 只能访问 物理地址空间 , 系统的 外围设备 与 物理内存 都使用 统一的物理地址空间 访问 ; RISC 全称 " Reduced Instruction Set Computer..., 参考 【Linux 内核 内存管理】Linux 内核内存布局 ④ ( ARM64 架构体系内存分布 | 内核启动源码 start_kernel | 内存初始化 mm_init | mem_init...映射到 虚拟地址空间 用户空间 的 应用进程 , 访问 " 外围设备寄存器 " 只能通过 " 虚拟地址 " 实现 , Linux 内核 提供了 相关 API 函数 , 将 " 外围设备寄存器 “ 对应的...” 物理地址 “ 映射到了 ” 虚拟地址空间 " 中 ;

3.1K20

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

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

3.5K21

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

原文博客 地址 程序如何确认内存地址 我们都知道,所有内存数据都是储存在我们硬件内存条上面的,那么它的空间是固定的,并且某个位置被占用的时候,应该是不能被其他程序使用的,否则将会内存冲突。...(一个空教室,小明已经坐了一个位置,其他同学不能坐在他大腿上了诶) 物理内存地址 上面这个概念就是物理内存地址,描述说明在硬件中实际的储存位置(好比 二排三列) 逻辑内存地址 那么我们的程序在编译完成之后...,怎么确定它在运行时到底使用哪一块内存地址呢?...使用的是相对的逻辑内存地址。 比如我们有以下一份PHP代码 <?...php $a = 1; $b = 3; 那么编译后的程序可能如下(用文字描述) Location = 向系统申请内存地址,并返回物理内存地址 申请一块内存,储存代码$a的值,对应的物理内存地址为 ·Location

57610

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

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

47820
领券