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

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

进程的地址有三种,分别是虚拟地址逻辑地址)、线性地址、物理地址。在分析之前先讲一下进程执行的时候,地址的解析过程。...然后根据cs的值选择idt表格中的一项,从而得到代码段的基地址和限长,用基地址加上ip指向的偏移得到一个线性地址,这个线性地址分为三个部分,分别是页目录索引,页表索引,物理地址偏移。...然后到页目录吧和页表中找到物理地址地址,再加线性地址中的偏移部分,得到物理地址。下面我们看看这些内容是怎么设置的,使得执行的时候能正确找到我们想要的地址去执行代码。我们从fork函数开始。...用线性地址的首地址加上ip 中的偏移,得到线性地址,然后再通过页目录和页表得到物理 地址,物理地址还没有分配则进行缺页异常等处理。...这就是linux0.11版本中进程地址管理的实现。下面是fork后的结构图。 ?

1.4K60

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): 逻辑地址和物理地址

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

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

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

4K40

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

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

3K00

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

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

1.9K00

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

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

2.4K30

Linux 考古笔记

2 流程分析 2.1 引导内核阶段 2.2 内核启动阶段 2.3 init 进程启动 2.4 shell 命令执行 Linux0.11 考古笔记 最近读完《Linux 内核完全注释》和《品读 Linux0.11...核心代码》,大致理解下 Linux0.11 内核的全貌。...从软件的视角,内核通过分段将进程逻辑地址变成CPU线性地址,再通过分页机制转换成物理内存地址,这样做的其中一个目的是让进程认为自己拥有独立的逻辑地址空间,达到空间的隔离性。...2 流程分析 根据《品读 Linux0.11 核心代码》这个专栏,它是按照系统启动到运行的时间顺序结合 Linux0.11 源码来展开的,我根据专栏的内容进行二次整理。...其中将 bootsect.s 搬到 0x9000 地址, setup.s 程序( 2~5 扇区)加载到 0x90200 地址,将 system 模块( 240 个扇区)加载到 0x10000 地址

1.1K30

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

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

57210

linux信号处理源码分析(基于linux0.11

具体的分析可以看linux0.11系统调用过程和fork源码解析这篇文章。下面贴一下代码。...es movl $0x17,%edx # fs points to local data space mov %dx,%fs // 根据参数,从系统表格里找到对应的函数,每个函数地址...4个字节 call _sys_call_table(,%eax,4) // 系统调用的返回值,压栈保存,因为下面需要用eax pushl %eax // 把当前进程的pcb地址赋值给...cs, long eflags, unsigned long * esp, long ss) { unsigned long sa_handler; // 系统调用返回时下一句代码的地址...iret指令会弹出ip寄存器的值,在do_signal函数里,已经把这ip的值改为sa_handler的地址(有点缓冲区溢出攻击的感觉),所以结束系统调用后,会执行sa_handler函数。

4.6K20

linux0.11看一个进程的诞生

,挂载线性地址地址和限长到ldt,赋值页目录项和页表 执行进程的时候,tss选择子被加载到tss寄存器,然后把tss里的上下文 也加载到对应的寄存器,比如cr3,ldt选择子。...tss信息中的ldt索引首先从gdt找到进程ldt 结构体数据的首地址,然后根据当前段的属性,比如代码段, 则从cs中取得选择子,系统从ldt表中取得进程线性空间 的首地址、限长...用线性地址的首地址加上ip 中的偏移,得到线性地址,然后再通过页目录和页表得到物理 地址,物理地址还没有分配则进行缺页异常等处理。...挂载tss和ldt地址到gdt,nr << 1即乘以2,这里算出的是第nr个进程距离第一个tss描述符地址的偏移, 单位是8个字节,即选择描述符大小,_LDT是偏移的大小,单位是1,这里是...从ldt第二项中找出基地址和限长。基地址+ip得到线性地址的值。然后再根据页目录和页表就能得到物理值。

1.4K11

linux0.11系统调用过程和fork源码解析

movl $0x17,%edx # fs points to local data space mov %dx,%fs // 根据参数,从系统表格里找到对应的函数,每个函数地址...个字节 call _sys_call_table(,%eax,4) // 系统调用的返回值,压栈保存,因为下面需要用eax pushl %eax // 把当前进程的pcb地址赋值给...,挂载线性地址地址和限长到ldt,赋值页目录项和页表 执行进程的时候,tss选择子被加载到tss寄存器,然后把tss里的上下文 也加载到对应的寄存器,比如cr3,ldt选择子。...tss信息中的ldt索引首先从gdt找到进程ldt 结构体数据的首地址,然后根据当前段的属性,比如代码段, 则从cs中取得选择子,系统从ldt表中取得进程线性空间 的首地址、限长...用线性地址的首地址加上ip 中的偏移,得到线性地址,然后再通过页目录和页表得到物理 地址,物理地址还没有分配则进行缺页异常等处理。

1.4K40

linux copy on write源码分析(基于linux0.11

比如进程fork的时候,父子进程对应的物理地址都一样,这时候会在页表项中记录该物理地址是只读的,有一个进程写的时候,就会触发写保护异常。执行写时复制。...一个在系统栈中的错误码,一个在cr2寄存器中保存的引起异常的线性地址。错误码一般会告诉系统这些信息。 ——P 标志表明异常是由于一个不存在页(0)还是访问权限违例或是使用了保留位(1)。..., address>>10 = address>>12<<2,得到页表项的地址, address>>20 = address>>22<<2,得到页目录项地址,...页目录项里存着页表地址+页表偏移得到页表项地址 */ un_wp_page((unsigned long *) (((address>>10) & 0xffc) + (0xfffff000...; // table_entry是页表项地址,算出该页的物理首地址 old_page = 0xfffff000 & *table_entry; // LOW_MEM以下是内核使用的内存

2.2K20
领券