逻辑地址线性地址物理地址三个地址有什么联系

合集下载

内存寻址的三种模式

内存寻址的三种模式

内存寻址的三种模型1. 地址的种类首先明确一下逻辑地址和线性地址这两个概念:1. 逻辑地址2. 线性地址3. 物理地址1.1 逻辑地址:逻辑地址是编译器生成的,我们使用在linux环境下,使用C语言指针时,指针的值就是逻辑地址。

对于每个进程而言,他们都有一样的进程地址空间,类似的逻辑地址,甚至很可能相同。

1.2 线性地址:线性地址是由分段机制将逻辑地址转化而来的,如果没有分段机制作用,那么程序的逻辑地址就是线性地址了。

1.3 物理地址物理地址是CPU在地址总线上发出的电平信号,要得到物理地址,必须要将逻辑地址经过分段,分页等机制转化而来。

2. 三种寻址模型x86体系结构下,使用的较多的内存寻址模型主要有三种:1. 实模式扁平模型real mode flat model2. 实模式分段模型real mode segment model3. 保护模式扁平模型protected mode flat model下面是对这三种模型的描述实模式和保护模式相对,实模式运行于20位地址总线,保护模式则启用了32位地址总线,地址使用的是虚拟地址,引入了描述符表;虽然二者都引入了段这样一个概念,但是实模式的段是64KB固定大小,只有16KB个不同的段,CS,DS等存储的是段的序号(想想为什么?)。

保护模式则引入了GDT和LDT段描述符表的数据结构来定义每个段。

扁平模型和分段模型相对,区别在于程序的线性地址是共享一个地址空间还是需要分成多个段,即为多个程序同时运行在同一个CS,DS的范围内还是每个程序都拥有自己的CS,DS:前者(flat)指令的逻辑地址要形成线性地址,不需要切换CS,DS;后者的逻辑地址,必须要经过段选择子去查找段描述符,切换CS,DS,才能形成线性地址。

3. 实模式扁平模型该模式只有在386及更高的处理器中才能出现!80386的实模式,就是指CPU可用的地址线只有20位,能寻址0~1MB的地址空间。

Intel80386CPU

Intel80386CPU

Intel80386CPUIntel 80386 CPU簡單了解運⾏模式⼀般CPU只有⼀种运⾏模式,能够⽀持多个程序在各⾃独⽴的内存空间中并发执⾏,且有⽤户特权级和内核特权级的区分,让⼀般应⽤不能破坏操作系统内核和执⾏特权指令。

80386处理器有四种运⾏模式:实模式、保护模式、SMM模式和虚拟8086模式。

这⾥对涉及ucore的实模式、保护模式做⼀个简要介绍。

实模式:这是个⼈计算机早期的8086处理器采⽤的⼀种简单运⾏模式,当时微软的MS-DOS操作系统主要就是运⾏在8086的实模式下。

80386加电启动后处于实模式运⾏状态,在这种状态下软件可访问的物理内存空间不能超过1MB,且⽆法发挥Intel 80386以上级别的32位CPU的4GB内存管理能⼒。

实模式将整个物理内存看成分段的区域,程序代码和数据位于不同区域,操作系统和⽤户程序并没有区别对待,⽽且每⼀个指针都是指向实际的物理地址。

这样⽤户程序的⼀个指针如果指向了操作系统区域或其他⽤户程序区域,并修改了内容,那么其后果就很可能是灾难性的。

保护模式:保护模式的⼀个主要⽬标是确保应⽤程序⽆法对操作系统进⾏破坏。

实际上,80386就是通过在实模式下初始化控制寄存器(如GDTR,LDTR,IDTR与TR等管理寄存器)以及页表,然后再通过设置CR0寄存器使其中的保护模式使能位置位,从⽽进⼊到80386的保护模式。

当80386⼯作在保护模式下的时候,其所有的32根地址线都可供寻址,物理寻址空间⾼达4GB。

在保护模式下,⽀持内存分页机制,提供了对虚拟内存的良好⽀持。

保护模式下80386⽀持多任务,还⽀持优先级机制,不同的程序可以运⾏在不同的特权级上。

特权级⼀共分0~3四个级别,操作系统运⾏在最⾼的特权级0上,应⽤程序则运⾏在⽐较低的级别上;配合良好的检查机制后,既可以在任务间实现数据的安全共享也可以很好地隔离各个任务。

內存架構地址是访问内存空间的索引。

⼀般⽽⾔,内存地址有两个:⼀个是CPU通过总线访问物理内存⽤到的物理地址,⼀个是我们编写的应⽤程序所⽤到的逻辑地址(也有⼈称为虚拟地址)。

计算机操作系统第四章-存储器管理

计算机操作系统第四章-存储器管理

第四章存储器管理第0节存储管理概述一、存储器的层次结构1、在现代计算机系统中,存储器是信息处理的来源与归宿,占据重要位置。

但是,在现有技术条件下,任何一种存储装置,都无法从速度、容量、是否需要电源维持等多方面,同时满足用户的需求。

实际上它们组成了一个速度由快到慢,容量由小到大的存储装置层次。

2、各种存储器•寄存器、高速缓存Cache:少量的、非常快速、昂贵、需要电源维持、CPU可直接访问;•内存RAM:若干(千)兆字节、中等速度、中等价格、需要电源维持、CPU可直接访问;•磁盘高速缓存:存在于主存中;•磁盘:数千兆或数万兆字节、低速、价廉、不需要电源维持、CPU 不可直接访问;由操作系统协调这些存储器的使用。

二、存储管理的目的1、尽可能地方便用户;提高主存储器的使用效率,使主存储器在成本、速度和规模之间获得较好的权衡。

(注意cpu和主存储器,这两类资源管理的区别)2、存储管理的主要功能:•地址重定位•主存空间的分配与回收•主存空间的保护和共享•主存空间的扩充三、逻辑地址与物理地址1、逻辑地址(相对地址,虚地址):用户源程序经过编译/汇编、链接后,程序内每条指令、每个数据等信息,都会生成自己的地址。

●一个用户程序的所有逻辑地址组成这个程序的逻辑地址空间(也称地址空间)。

这个空间是以0为基址、线性或多维编址的。

2、物理地址(绝对地址,实地址):是一个实际内存单元(字节)的地址。

●计算机内所有内存单元的物理地址组成系统的物理地址空间,它是从0开始的、是一维的;●将用户程序被装进内存,一个程序所占有的所有内存单元的物理地址组成该程序的物理地址空间(也称存储空间)。

四、地址映射(变换、重定位)当程序被装进内存时,通常每个信息的逻辑地址和它的物理地址是不一致的,需要把逻辑地址转换为对应的物理地址----地址映射;地址映射分静态和动态两种方式。

1、静态地址重定位是程序装入时集中一次进行的地址变换计算。

物理地址= 重定位的首地址+ 逻辑地址•优点:简单,不需要硬件支持;•缺点:一个作业必须占据连续的存储空间;装入内存的作业一般不再移动;不能实现虚拟存储。

习题7答案——精选推荐

习题7答案——精选推荐

习题7答案1、存储管理的主要功能是什么?解内存分配、存储保护、地址变换、存储共享、存储扩充2、什么是地址空间、存储空间、逻辑地址、物理地址?解:1)地址空间:⼀个程序可以访问的地址是有限的,这个程序可以访问的地址范围我们称为地址空间,或者说是指程序⽤来访问信息所⽤的地址单元的集合。

2)存储空间:所谓存储空间是指能够访问的主存的范围。

⼀个数据在主存中的位置称为物理地址或绝对地址。

3)逻辑地址:地址空间单元的编号。

4)物理地址:存储空间单元的编号。

3、采⽤可变式分区存储管理时,能否实现虚拟存储,为什么?解:不能。

可变式分区⽅式虽然分成程序的⼤⼩可以变化,但是要求整个程序都装⼊内存才能运⾏,这样⽆法进⾏逻辑上扩充内存。

4、可变分区管理有哪⼏种存储分配算法?解:1)⾸次适应算法(First-Fit)。

这种策略总是从链表的开头开始查找。

⼀旦找到了⾜够⼤的、能满⾜给定的请求的第⼀个空闲分区,就停⽌查找。

2)下次适应算法(Next-Fit)。

⼜称为循环⾸次适应算法。

对⾸次适应算法的⼀个简单改动就是每次要从上次查找停⽌的位置开始查找,也就是前次分配后的空闲分区。

3)最佳适应算法(Best-Fit)。

这种策略的直观想法是,总是给内存请求者分配最适合它⼤⼩的空闲分区,提⾼内存的利⽤率。

5、什么是地址重定位?有哪⼏种常⽤的地址重定位⽅法?解:由于将作业装⼊到与其地址空间不⼀致的存储空间所引起的对有关地址部分的调整过程称为地址重定位。

常⽤的重定位⽅法有两种,静态重定位和动态重定位。

静态重定位是指在程序运⾏之前由链接装⼊程序进⾏的重定位。

动态重定位是在程序运⾏过程中,通过重定位寄存器来进⾏地址转换。

6、在某系统中,采⽤固定分区分配⽅式,内存分区(单位:字节)情况如下图左所⽰。

现有⼤⼩为4KB、18KB、50KB、85KB的多个作业要求进⼊内存,试画出它们进⼊内存后的空间分配情况,并说明主存浪费有多⼤。

解:从图中可以看出该系统共有4个分区,第⼀个分区的⼤⼩为10KB,第⼆个分区的⼤⼩为30KB,第三个分区的⼤⼩为80KB,第四个分区的⼤⼩为100KB。

逻辑地址与物理地址

逻辑地址与物理地址

逻辑地址与物理地址物理地址是外部连接使用的、唯一的,它是“与地址总线相对应”;而逻辑地址是内部和编程使用的、并不唯一。

在内存中的实际地址就是所谓的“物理地址”,而逻辑地址就是逻辑段管理内存而形成的。

例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址(偏移地址),不和绝对物理地址相干。

只有在Intel实模式下,逻辑地址才和物理地址相等(因为实模式没有分段或分页机制,Cpu不进行自动地址转换),逻辑地址也就是在Intel 保护模式下程序执行代码段限长内的偏移地址(假定代码段、数据段如果完全一样)。

8086体系的CPU一开始是20根地址线, 寻址寄存器是16位, 16位的寄存器可以访问64K的地址空间, 如果程序要想访问大于64K的内存, 就要把内存分段, 每段64K, 用段地址+偏移量的方法来访问。

386CPU出来之后, 采用了32条地址线, 地址寄存器也扩为32位, 这样就可以不用分段了, 直接用一个地址寄存器来线性访问4G的内存了. 这就叫平面模式.将逻辑地址中的段地址左移4位,加上偏移地址就得到20位物理地址。

这里左移的4位是二进制位;如果用十六进制表达地址就是左移一位。

左移4位还可以表达为乘以16,即:段地址×16+偏移地址。

同一个物理地址可以对应多个逻辑地址形式。

所以物理地址转换为逻辑地址,需要明确段基地址或偏移地址,然后同上原则确定另一个地址。

逻辑地址1460H : 0100H 或1380H : 0900H物理地址14700H于是,对于主存14700H单元,我们可以描述为在1460H(或1380H)段的0100H(或0900H)单元,或者说主存1460H : 0100H(或1380H : 0900H)单元。

存储单元的地址可以用段基值和段内偏移量来表示,段基值确定它所在的段居于整个存储空间的位置,偏移量确定它在段内的位置,这种地址表示方式称为逻辑地址。

什么是物理地址 逻辑地址

什么是物理地址 逻辑地址

什么是物理地址逻辑地址网络中的地址分为物理地址和逻辑地址两类,与网络层的IP地址传输层的端口号以及应用层的用户名相比较,局域望网的MAC层地址是由硬件来处理的,叫做物理地址或硬件地址.IP地址传输层的端口号以及应用层的用户名是逻辑地址一由软件处理.我认为你说的MAC地址应该就是物理地址.大多数局域网通过为网卡分配一个硬件地址来标识一个联网的计算机或其他设备.所谓物理地址是指固化在网卡EPROM中的地址,这个地址应该保证在全网是唯一的.IEEE注册委员会为每一个生产厂商分配物理地址的前三字节,即公司标识.后面三字节由厂商自行分配.即一个厂商获得一个前三字节的地址可以生产的网卡数量是16777216块.即一块网卡对应一个物理地址.也就是说对应物理地址的前三字节可以知道他的生产厂商.如果固化在网卡中的地址为002514895423,那么这块网卡插到主机A中,主机A的地址就是002514895423,不管主机A是连接在局域网1上还是在局域网2上,也不管这台计算机移到什么位置,主机A的物理地址就是002514895423 .它是不变的,而且不会和世界上任何一台计算机相同.当主机A发送一帧时,网卡执行发送程序时,直接将这个地址作为源地址写入该帧.当主机A接收一帧时,直接将这个地址与接收帧目的地址比较,以决定是否接收.物理地址MAC(Media Access Control, 介质访问控制)地址是识别LAN(局域网)节点的标识。

网卡的物理地址通常是由网卡生产厂家烧入网卡的EPROM(一种闪存芯片,通常可以通过程序擦写),它存储的是传输数据时真正赖以标识发出数据的电脑和接收数据的主机的地址。

也就是说,在网络底层的物理传输过程中,是通过物理地址来识别主机的,它一般也是全球唯一的。

比如,著名的以太网卡,其物理地址是48bit(比特位)的整数,如:44-45-53-54-00-00,以机器可读的方式存入主机接口中。

以太网地址管理机构(IEEE)将以太网地址,也就是48比特的不同组合,分为若干独立的连续地址组,生产以太网网卡的厂家就购买其中一组,具体生产时,逐个将唯一地址赋予以太网卡。

进程管理_linux0.11

进程管理_linux0.11

Linux0.11的地址有3类地址需要区分清楚:1.程序(进程)的虚拟地址和逻辑地址虚拟地址(virtual address)指程序产生的有段选择符和段内偏移两部分组成的地址。

一个程序的虚拟地址空间有GDT映射的全地址空间和LDT映射的局部地址空间组成。

逻辑地址(logical address)指程序产生的段内偏移地址。

应用程序只与逻辑地址打交道,分段分页对应用程序来说是透明的。

也就是说C语言中的&,汇编语言中的符号地址,C中嵌入式汇编的”m”对应的都是逻辑地址。

2.CPU的线性地址线性地址(linear address)是逻辑地址到物理地址变换的中间层,是处理器可寻址空间的地址。

程序代码产生的逻辑地址加上段基地址就产生了线性地址。

3.实际物理内存地址物理地址(physical address)是CPU外部地址总线上的寻址信号,是地址变换的最终结果,一个物理地址始终对应实际内存中的一个存储单元。

对80386保护模式来说,如果开启分页机制,线性地址经过页变换产生物理地址。

如果没有开启分页机制,线性地址直接对应物理地址。

页目录表项、页表项对应都是物理地址。

Linux 0.11的内核数据段,内核代码段基地址都是0,所以对内核来说,逻辑地址就是线性地址。

又因为1个页目录表和4个页表完全映射16M物理内存,所以线性地址也就是物理地址。

故对linux0.11内核来说,逻辑地址,线性地址,物理地址重合。

个人总结:分段和分页的区别:分段可以给每个进程提供不同的线性地址分页可以把同一线性地址空间映射到不同的物理地址逻辑地址:线性地址:物理地址:逻辑地址-》分段单元-》线性地址-》分页单元-》物理地址Linux在使用的时候避开了Intel原先的设计意图,只是对段基址设置了0,这样逻辑地址和线性地址就一样了,再经过分页机制,就最后变成了物理地址了。

Linux2.4内核使用的空间中,虚拟地址和物理地址只是简单的相差了3G与80386段相关的宏定义set_seg_desc3123715/*****************************************************************************/ /* 功能: 设置存储段描述符,把指定属性的段描述符放入gate_addr 处 */ /* 参数: gate_addr 段描述符的目的地址 */ /* type 描述符中类型域,具体见80386基础一节中的表格 */ /* dpl 描述符中特权级 */ /* base 段基地址,这是线性地址 */ /* limit 段限长 */ /* 返回: (无) */ /*****************************************************************************/ #define _set_seg_desc(gate_addr,type,dpl,base,limit) {\ // 把段描述符的第4-7字节放入gate_addr 处 *((gate_addr)+1) = ((base) & 0xff000000) | \ // base 的31..24位放入gate_addr 的31..24位 (((base) & 0x00ff0000)>>16) | \ //base 的23..16位放入gate_addr 的7..0位 ((limit) & 0xf0000) | \ //limit 的19..16位放入gate_addr 的19..16位 ((dpl)<<13) | \ // dpl 放入gate_addr 的14..13位 (0x00408000) | \ // 把P 位和D 位设置位1,G 置为 0 ((type)<<8); \ // type 放入gate_addr 的11..8位 // 把段描述符的第0-3字节放入gate_addr+1处 *(gate_addr)= (((base) & 0x0000ffff)<<16) | \ //base 的15..0放入gate+1的31..15位 ((limit) & 0x0ffff); } //limit 的15..0位放入gate+1的15..0位set_tssldt_desc/*****************************************************************************/ /* 功能: 设置系统段描述符,把指定属性的段描述符放入GDT 中 */ /* 表项n 对应的地址处, */ /* 参数: n GDT 中表项n 对应的地址 */ /* addr 系统段的基地址,这是一个线性地址 */ /* type 描述符中类型域,具体见80386基础一节中的表格 */ /* 0x89表示386TSS 段描述符,0x82表示LDT 段 */ /* 这里8是为了设置P 位为1 */0 7 15 23 31/* 返回: (无) */ /*****************************************************************************/ // %0 寄存器eax addr// %1-%6 物理地址符号项n地址-n+7的地址#define _set_tssldt_desc(n,addr,type) \__asm__ ("movw $104,%1\n\t" \ // 把TSS的限长104字节放入n地址处,// 这样ldt的限长也定为104,这没有关系,因为linux0.11// 中一个任务的ldt只有3个表项"movw %%ax,%2\n\t" \ // 把addr的15..0位(在ax中)放入n+2处"rorl $16,%%eax\n\t" \ // 把addr的高16位(eax中)放入ax中"movb %%al,%3\n\t" \ //addr的23..16位放入n+4中"movb $" type ",%4\n\t" \ // 把type字段放入n+5中"movb $0x00,%5\n\t" \ // 把G置为0,说明粒度是字节。

微型计算机技术及应用内部习题

微型计算机技术及应用内部习题

微型计算机技术及应用内部习题第一章作业1.主板主要由哪几部分组成?CPU插座、芯片组(北桥芯片、南桥芯片等)、BIOS芯片、系统时钟发生器芯片、总线(前端系统总线FSB、QPI总线、内存总线、图形总线AGP、外围设备总线PCI-E等)、接口(集成驱动电子设备接口IDE、通用串行设备接口USB、以太网接口LAN、音频接口AC’97、超级输入输出接口SIO等)。

2.微处理器、微型计算机和微型计算机系统三者之间有什么不同?微处理器是微型计算机的核心,是微型计算机的一部分。

它是集成在一块芯片上的CPU,由运算器和控制器组成。

微型计算机包括微处理器、存储器、I/O接口和系统总线,是微型计算机系统的主体。

微型计算机系统包括微型计算机、外设及系统软件三部分。

3.微型计算机的性能指标有哪些?CPU的位数、CPU的主频、内存容量和速度、硬盘容量。

第二章习题1.若(AL)=0C0H,(B某)=03523H,则执行指令ADDAL,BL之后(AL)=_____,(BL)=_____,标志位OF,SF,ZF,AF,CF,PF的状态对应为_____.2.设(SS)=2250H,(SP)=0140H,若在堆栈中放入5个数据,则栈顶的物理地址为___,如果又从堆栈中取出3个数据,则栈顶的物理地址为____.3.两个逻辑地址分别为2003H:1009H和2101H:0029H,它们对应的物理地址是多少?说明了什么?4.在8088/8086中,逻辑地址FFFF∶0001,00A2∶37F和B800∶173F的物理地址分别是多少?物理地址=段地址某10H+偏移地址所以FFFF:0001的物理地址是FFFFH某10H+0001H=FFFF1H00A2:37F的物理地址是00A2某10H+037FH=00D9FHB800:173F的物理地址是B800某10H+173F=B973FH5.在8088/8086中,从物理地址388H开始顺序存放下列三个双字节的数据,651AH,D761H和007BH,请问物理地址388H,389H,38AH,38BH,38CH和38DH6个单元中分别是什么数据?地址388H389H38AH38BH38CH38DH内容1AH65H61HD7H7BH00H6.已知当前(DS)=7F06H,在偏移地址为0075H的存储器中连续存放6个字节的数据:11H,22H,33H,44H,55H,66H。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

逻辑地址线性地址物理地址三个地址有什么联系
逻辑地址线性地址物理地址
一、逻辑地址转线性地址
我们写个最简单的helloworld程序,用gcc编译,再反汇编后
会看到以下指令:
mov0x80495b0,%eax
这里的内存地址0x80495b0就是一个逻辑地址,必须加上隐含的DS数据段的基地址,才能构成线性地址。

也就是说0x80495b0是当
前任务的DS数据段内的偏移。

在x86保护模式下,段的信息(段基线性地址、长度、权限等)即段描述符占8个字节,段信息无法直接存放在段寄存器中(段寄存器
只有2字节)。

Intel的设计是段描述符集中存放在GDT或LDT中,
而段寄存器存放的是段描述符在GDT或LDT内的索引值(index)。

这样的情况下Linux只用到了GDT,不论是用户任务还是内核任务,都没有用到LDT。

GDT的第12和13项段描述符是__KERNEL_CS
和__KERNEL_DS,第14和15项段描述符是__USER_CS和__USER_DS。

内核任务使用__KERNEL_CS和__KERNEL_DS,所有的用户任务共用
__USER_CS和__USER_DS,也就是说不需要给每个任务再单独分配段
描述符。

内核段描述符和用户段描述符虽然起始线性地址和长度都
一样,但DPL(描述符特权级)是不一样的。

__KERNEL_CS和
__KERNEL_DS的DPL值为0(最高特权),__USER_CS和__USER_DS的DPL值为3。

用gdb调试程序的时候,用inforeg显示当前寄存器的值:
cs0x73115
ss0x7b123
ds0x7b123
es0x7b123
可以看到ds值为0x7b,转换成二进制为0000000001111011,TI
字段值为0,表示使用GDT,GDT索引值为01111,即十进制15,对
应的就是GDT内的__USER_DS用户数据段描述符。

从上面可以看到,Linux在x86的分段机制上运行,却通过一个
巧妙的方式绕开了分段。

Linux主要以分页的方式实现内存管理。

二、线性地址转物理地址
前面说了Linux中逻辑地址等于线性地址,那么线性地址怎么对应到物理地址呢?这个大家都知道,那就是通过分页机制,具体的说,就是通过页表查找来对应物理地址。

准确的说分页是CPU提供的一种机制,Linux只是根据这种机制
的规则,利用它实现了内存管理。

在保护模式下,控制寄存器CR0的最高位PG位控制着分页管理
机制是否生效,如果PG=1,分页机制生效,需通过页表查找才能把
线性地址转换物理地址。

如果PG=0,则分页机制无效,线性地址就
直接做为物理地址。

分页的基本原理是把内存划分成大小固定的若干单元,每个单元称为一页(page),每页包含4k字节的地址空间(为简化分析,我们
不考虑扩展分页的情况)。

这样每一页的起始地址都是4k字节对齐的。

为了能转换成物理地址,我们需要给CPU提供当前任务的线性
地址转物理地址的查找表,即页表(pagetable)。

注意,为了实现每
个任务的平坦的虚拟内存,每个任务都有自己的页目录表和页表。

为了节约页表占用的内存空间,x86将线性地址通过页目录表和
页表两级查找转换成物理地址。

32位的线性地址被分成3个部分:
最高10位Directory页目录表偏移量,中间10位Table是页表偏移量,最低12位Offset是物理页内的字节偏移量。

页目录表的大小为4k(刚好是一个页的大小),包含1024项,每个项4字节(32位),项目里存储的内容就是页表的物理地址。

如果页目录表中的页表尚未分配,则物理地址填0。

页表的大小也是4k,同样包含1024项,每个项4字节,内容为最终物理页的物理内存起始地址。

每个活动的任务,必须要先分配给它一个页目录表,并把页目录表的物理地址存入cr3寄存器。

页表可以提前分配好,也可以在用到的时候再分配。

还是以mov0x80495b0,%eax中的地址为例分析一下线性地址转物理地址的过程。

前面说到Linux中逻辑地址等于线性地址,那么我们要转换的线性地址就是0x80495b0。

转换的过程是由CPU自动完成的,Linux所要做的就是准备好转换所需的页目录表和页表(假设已经准备好,给页目录表和页表分配物理内存的过程很复杂,后面再分析)。

内核先将当前任务的页目录表的物理地址填入cr3寄存器。

线性地址0x80495b0转换成二进制后是00001000000001001001010110110000,最高10位0000100000的十进制是32,CPU查看页目录表第32项,里面存放的是页表的物理地址。

线性地址中间10位0001001001的十进制是73,页表的第73项存储的是最终物理页的物理起始地址。

物理页基地址加上线性地址中最低12位的偏移量,CPU就找到了线性地址最终对应的物理内存单元。

我们知道Linux中用户进程线性地址能寻址的范围是0-3G,那么是不是需要提前先把这3G虚拟内存的页表都建立好呢?一般情况下,物理内存是远远小于3G的,加上同时有很多进程都在运行,根本无法给每个进程提前建立3G的线性地址页表。

Linux利用CPU的一个机制解决了这个问题。

进程创建后我们可以给页目录表的表项值都填0,CPU在查找页表时,如果表项的内容为0,则会引发一个缺页异常,进程暂停执行,Linux内核这时候可以通过一系列复杂的算法给分配一个物理页,并把物理页的地址填入表项中,进程再
恢复执行。

当然进程在这个过程中是被蒙蔽的,它自己的感觉还是正常访问到了物理内存。

看过“逻辑地址线性地址物理地址三个地址有什么联系”的人还看了:。

相关文档
最新文档