linux内存寻址实例,Linux原理解析——内存寻址

①内存地址表示方法

内存地址分为三种,分别为逻辑地址、线性地址(虚拟地址)、物理地址

逻辑地址:由段地址与偏移地址表示。偏移地址的表示方法直接是32bit的数值表示。而段地址的表示需要由段选择符、段描述表来表示。具体见《深入理解Linux内核,CN版》45页。

线性地址:可以从0x00000000表示到0xffffffff的虚拟地址,每一个进程,以及内核都有自己的线性地址,线性地址可以通过一定的方式转化为物理地址,方法在后面详细解释。

物理地址:是内存中具体的地址空间。

②三种地址的关系

在硬件层,可以通过内存控制单元(MMU)将逻辑地址转化为线性地址,再将线性地址转化为分页地址。

从逻辑地址转化为线性地址的过程中需要cs/ds寄存器去保存段选择符,用gdtr寄存器去保存段描述表的位置,然后再加上offset偏移地址就可以算出线性地址。其中段描述表在整个内存中仅有一张。(仅考虑了全局段描述表)

从线性地址转化为物理地址的过程,首先需要寄存器cr3来保存页目录的地址,然后页目录中保存了页表的地址,以及一些其他的信息。页表中的数据+offset就是物理地址。具体见《深入理解Linux内核,CN版》52页。

③内核页表

内核有自己的页表,它在计算机启动时就进行分配。具体过程如下。

由于在计算机启动时,在内存中不存在页表,但是在计算机启动过程中需要执行指令/访问数据,这都需要用到地址空间,因此在计算机启动时会使用一种叫实模式的内存访问方式(与保护模式相对)其原来就是直接利用物理地址进行查找内存。

而在Linux内核的代码段中,有个固定位置的临时全局目录,我们可以将其装入内存中,然后通过pagetable_init()函数建立起页表项。具体见《深入理解Linux内核,CN版》75页。这样就建立起了内核页表。之后就可以进入保护模式通过内核页表与虚拟地址来访问数据了。

④以上内容中理解的核心点。

内存虚拟化是如何实现的?

对于进程来说,每一个进程都有一个cr3的值,通过cr3这个值,以及建立的页目录,页表就可以进行对进程进行内存的虚拟化。实现方法如下,当一个进程在运行时,cr3寄存器就保存着这个进程的cr3的值,当需要访问内存空间时,线性地址可以通过存在的页目录与页表来访问到物理地址,简单来说,通过这个cr3,以及页目录,页表,就是完成线性地址到物理地址的映射。并且每个进程都有自己的cr3,因此每个进程都可以从0x00000000~0xffffffff映射到自己的物理地址中。

如果每个进程都有4G的内存空间,那么物理地址不就会发生空间不够的情况吗?

线性地址到物理地址的映射是动态分配的,也就是说。虽然线性地址都有4G的空间,但是如果4G的内存空间均没有使用,那么其对应的物理地址也就会很少。

对于每种计算机架构都有逻辑地址到线性地址的转换吗?

仅有80x86架构才会有。Linux并不喜欢内存的分段模式。

如果实现实模式与保护模式的无缝对接?

在实模式下,0x0000000-0x007fffff对应的物理地址为0x0000000-0x007fffff,在保护模式下0xc0000000-0xc07fffff对应的物理地址为0x0000000-0x007fffff。即实现了二对一的情况,因此在实模式与保护模式的过度阶段,无论直接使用物理地址还是使用线性地址都可以对于与相同的地址空间,从而实现了无缝对接。

内存工作原理 1.内存寻址 首先,内存从CPU获得查找某个数据的指令,然后再找出存取资料的位置时(这个动作称为“寻址”),它先定出横坐标(也就是“列地址”)再定出纵坐标(也就是“行地址”),这就好像在地图上画个十字标记一样,非常准确地定出这个地方。对于电脑系统而言,找出这个地方时还必须确定是否位置正确,因此电脑还必须判读该地址的信号,横坐标有横坐标的信号(也就是RAS信号,Row Address Strobe)纵坐标有纵坐标的信号(也就是CAS信号,Column Address Strobe),最后再进行读或写的动作。因此,内存在读写时至少必须有五个步骤:分别是画个十字(内有定地址两个操作以及判读地址两个信号,共四个操作)以及或读或写的操作,才能完成内存的存取操作。 2.内存传输 为了储存资料,或者是从内存内部读取资料,CPU都会为这些读取或写入的资料编上地址(也就是我们所说的十字寻址方式),这个时候,CPU会通过地址总线(Address Bus)将地址送到内存,然后数据总线(Data Bus)就会把对应的正确数据送往微处理器,传回去给CPU使用。 3.存取时间 所谓存取时间,指的是CPU读或写内存内资料的过程时间,也称为总线循环(bus cycle)。以读取为例,从CPU发出指令给内存时,便会要求内存取用特定地址的特定资料,内存响应CPU后便会将CPU所需要的资料送给CPU,一直到CPU收到数据为止,便成为一个读取的流程。因此,这整个过程简单地说便是CPU给出读取指令,内存回复指令,并丢出资料给CPU的过程。我们常说的6ns(纳秒,秒-9)就是指上述的过程所花费的时间,而ns便是计算运算过程的时间单位。我们平时习惯用存取时间的倒数来表示速度,比如6ns的内存实际频率为1/6ns=166MHz(如果是DDR就标DDR333,DDR2就标DDR2 667)。 4.内存延迟 内存的延迟时间(也就是所谓的潜伏期,从FSB到DRAM)等于下列时间的综合:FSB同主板芯片组之间的延迟时间(±1个时钟周期),芯片组同DRAM之间的延迟时间(±1个时钟周期),RAS到CAS延迟时间:RAS(2-3个时钟周期,用于决定正确的行地址),CAS延迟时间 (2-3时钟周期,用于决定正确的列地址),另外还需要1个时钟周期来传送数据,数据从DRAM输出缓存通过芯片组到CPU的延迟时间(±2个时钟周期)。一般的说明内存延迟涉及四个参数CAS(Column Address Strobe 行地址控制器)延迟,RAS(Row Address Strobe列地址控制器)-to-CAS延迟,RAS Precharge(RAS预冲电压)延迟,Act-to-Precharge(相对于时钟下沿的数据读取时间)延迟。其中CAS延迟比较重要,它反映了内存从接受指令到完成传输结果的过程中的延迟。大家平时见到的数据3—3—3—6中,第一参数就是CAS延迟(CL=3)。当然,延迟越小速度越快。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值