linux内存寻址解析 (一)
2016-05-14 10:29
316 查看
1.内存地址
1.逻辑地址:每一个逻辑地址都有一个段和偏移量组成。
2.线性地址:也叫虚拟地址,是一个32位无符号整数,可以用来表示高达4GB的地址,值得范围从0x00000000到0xffffffff。
3.物理地址:用于内存芯片级内存单元寻址
内存控制单元(MMU)将逻辑地址转化成线性地址,再转化成物理地址。
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规定的级别。特权指令只能在系统态执行。
1.linux中的四个段
运行在用户态的所有linux进程使用一对相同的段来对指令和数据寻址,即用户代码段和用户数据段;运行在内核态的所有linux进程也使用一对相同的段来对指令和数据寻址,即内核代码段和内核数据段。
2.linux段机制
他们都是从0开始,即意味着用户态和内核态下的所有进程使用相同的逻辑地址。因为段机制就是将逻辑地址转化为线性地址,也就是说在linux中分段机制并没有起到实际的作用,只是走一下过程,而linux下的逻辑地址就等于线性地址。
3.GDT和LDT
每个cpu对应一个GDT,所有的GDT都存放在cpu_gdt_table数组中,而所有GDT的地址和他们的大小被存放在cpu_gdt_descr数组中。每个GDT包含18个段描述符和14个空的。
Linux中基本不使用LDT。
为了效率起见,线性地址分成以固定长度为单位的组,称为页。
分页单元把所有的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的高速缓存来用于加快线性地址的转换。
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 socket 初步
- Linux Kernel 4.0 RC5 发布!
- linux lsof详解
- linux 文件权限
- Linux 执行数学运算
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程
- Linux 下无损图片压缩小工具介绍