您的位置:首页 > 运维架构 > Linux

linux内存寻址解析 (一)

2016-05-14 10:29 316 查看
1.内存地址

1.逻辑地址:每一个逻辑地址都有一个段和偏移量组成。

2.线性地址:也叫虚拟地址,是一个32位无符号整数,可以用来表示高达4GB的地址,值得范围从0x00000000到0xffffffff。

3.物理地址:用于内存芯片级内存单元寻址

内存控制单元(MMU)将逻辑地址转化成线性地址,再转化成物理地址。


2.硬件中的分段

1.段选择符(段寄存器 )

?包括:索引、TI、RPL

?存放段描述符在段表中的索引号(段编号),TI标志用于说明是是GDT还是LDT表,RPL标志权限。

2.段描述符:段描述符表中的一项,表示一段的信息:

?段的基地址(Base Address):在线性地址空间中段的起始地址。

?段的界限(Limit):即段大小,在虚拟地址空间中,段内可以使用的最大偏移量。

?段的保护属性(Attribute): 表示段的特性。例如,该段是否可被读出或写入,或者该段是否作为一个程序来执行,以及段的特权级等等。

3.段描述符放在全局描述符表GDT,或局部描述符表LDT中。能够保存在GDT中的段描述符的最大数目是8191个。

4.段寻址过程(得到线性地址)

   (1.判断指令类型,确定使用哪个段寄存器

   (2.读段寄存器的内容,找到存放段描述信息的数据结构。(GDTR、LDTR)

①通过TI标志,判断本次操作所用段是到全局段描述表中找,还是到局部段描述表中找

②读GDTR或LDTR寄存器中存放的地址,找到描述表的首地址

③根据段寄存器中记录的索引号从描述表首址处偏移,找到第n个描述符,既是要找的段信息。

   (3.得到基地址

   (4.指令地址做偏移,判断是否长度越界

   (5.根据指令性质及段描述符中的访问权限判断是否越权

   (6.将基地址与指令中的偏移地址相加得到实际的内存地址,完成地址映射。

 


5.保护的表现

(1.界限保护

?越界判断:段长参数

?特权指令:新增的GDTR或LDTR寄存器不存在与旧指令兼容问题,访问他们的指令设定为特权指令,段寄存器的访问属性仍然同以往一样无特权,既保持了兼容,又保证了程序无法故意修改段描述进行越界。

(2.权限保护

?根据段的保护属性判断是否具有访问权限。如,只读段中不允许写入。

?系统态、用户态分离。段寄存器中的后两位RPL表示请求者操作要求的特权级。GDTR或LDTR中的dpl字段设定了段的访问权限。指令段rpl标志要求的权限应不低于dpl规定的级别。特权指令只能在系统态执行。


3.Linux中的分段

1.linux中的四个段

运行在用户态的所有linux进程使用一对相同的段来对指令和数据寻址,即用户代码段和用户数据段;运行在内核态的所有linux进程也使用一对相同的段来对指令和数据寻址,即内核代码段和内核数据段。

G
S
DPL
P
0x00000000
0xfffff
10
1
用户数据段
1
1
3
1
0x00000000
0xfffff
10
1
内核数据段
1
1
0
1<span "="" style="word-wrap: break-word;">
 

2.linux段机制

他们都是从0开始,即意味着用户态和内核态下的所有进程使用相同的逻辑地址。因为段机制就是将逻辑地址转化为线性地址,也就是说在linux中分段机制并没有起到实际的作用,只是走一下过程,而linux下的逻辑地址就等于线性地址。

3.GDT和LDT

每个cpu对应一个GDT,所有的GDT都存放在cpu_gdt_table数组中,而所有GDT的地址和他们的大小被存放在cpu_gdt_descr数组中。每个GDT包含18个段描述符和14个空的。

Linux中基本不使用LDT。


4.硬件中的分页

为了效率起见,线性地址分成以固定长度为单位的组,称为页。

分页单元把所有的RAM分成固定长度的页框(也叫物理页),每个页框包含一个页,也就是说一个页框的长度与一个页的长度一致。页框是主存的一部分,也是一个存储区域。页只是一个数据块,可以存放在任何页框或磁盘中。分页单元把线性地址转化成物理地址。

把线性地址映射到物理地址的数据结构称为页表。页表放在主存中,并在启用分页单元之前必须由内核对页表进行适当的初始化。

1.常规分页:

分页单元处理4KB的页。32位的线性地址分成3个域:目录(最高10位)、页表(中间10位)、偏移量(最低12位)。

每个活动的进程必须有一个分配给它的页目录。但没有必要马上为进程所有的页表都分配RAM。正在使用的页目录的物理地址存在寄存器cr3中。线性地址中的目录字段决定页目录中的目录项,而目录项指向适当的页表。地址的页表字段又决定页表中的表项,而表项含有页所在页框的物理地址。偏移量字段决定页框内的相对位置。每一页含有4096个字节。

页目录和页表都可以多大1024项,所以一个页目录可以寻址高达1024*1024*4096=2^32.这和32位地址所期望的一样。



 

或者下图:



 



2.扩展分页:

它允许页框大小为4MB。目录字段10位,偏移量字段为22位。



3.物理地址扩展(PAE)分页机制:

32位的物理地址,由于用户进程线性地址空间的需要,内核不能直接对1GB以上的RAM进行寻址。而许多服务器需要大于4GB的RAM来运行数以千计的进程。所以Intel将管教数增加到36,现在处理器的寻址能力为2^36=64GB.

4.硬件高速缓存:

高速缓存单元插在分页单元和内存之间。

在linux设置中,对于所有的页框都启用高速缓存,对于写操作总是采用回写策略。

5.转换后援缓冲器TLB:

除硬件缓存外,还采用TLB的高速缓存来用于加快线性地址的转换。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux mm