段表存储在哪里?

时间:2018-11-18 15:22:22

标签: memory-management operating-system memory-segmentation

在分段方案中,每次进行内存访问时,MMU都会通过查找分段表来将其转换为实际地址。

段表是存储在TLB内还是RAM中?

2 个答案:

答案 0 :(得分:0)

  

段表存储在TLB内还是RAM中?

这取决于CPU的类型和CPU的模式。

对于80x86,当加载段寄存器时,CPU将段的“基地址,限制和属性”存储在段寄存器的隐藏部分中。

对于实模式,virtual8086模式和系统管理模式,加载段寄存器时,CPU只会执行“隐藏的段基=段值* 16”,并且RAM中没有表。

对于保护模式和长模式,加载段寄存器时,CPU使用加载到段寄存器中的值作为RAM中表的索引,并且(在执行保护检查之后)加载“基地址,限制和属性”信息从相应的表条目到段寄存器的隐藏部分。

请注意,(对于保护模式)几乎没有人使用分段,因为分段寄存器的加载速度很慢(由于保护检查和表查找);因此,CPU制造商针对“无分段”对CPU进行了优化(例如,如果分段基数为零,则代替“线性地址=虚拟地址+分段基数”),现代CPU只会执行“线性地址=虚拟地址”,从而避免了不必要的添加和更快地开始缓存/内存查找),也不必费心优化段寄存器的负载;然后,当AMD设计长模式时,他们意识到没有人想要分段,并且大部分都禁用了64位代码(忽略大多数分段寄存器的分段基础以摆脱额外的增加,并忽略分段限制以消除分段成本极限检查)。但是,不使用分段的操作系统使用gsfs作为黑客手段来快速访问特定于CPU或特定于线程的数据(因为与某些其他CPU不同,80x86没有只能由主管代码修改的寄存器,为此目的将更加方便);因此AMD保留了这2个段寄存器的“线性地址=虚拟地址+段基”行为,并增加了修改gsfs的隐藏“基地址”部分的功能(通过MSR和swapgs),可以更轻松地将操作系统(Windows)移植到长模式。

换句话说,对于80x86,有3种不同的方式来设置段的信息(通过计算,通过表查找或通过MSR)。

还要注意,对于大多数指令(不包括段寄存器加载之类的东西),80x86 CPU并不关心段信息的设置方式,而仅使用段寄存器的隐藏部分。这意味着CPU不必在每次从cs获取代码以及每次从内存获取数据时都查阅表。这也意味着大多数CPU都不在乎CPU处于哪种模式(例如,mov eax,[ds:address]之类的指令仅取决于段寄存器的隐藏部分中的值,而与CPU模式无关) ;这就是为什么删除过时的CPU模式没有好处的原因(取消对实模式的支持不会减少CPU的大小或复杂性)。

对于其他CPU;大多数不支持分段(仅支持分页或什么都不支持),而且我不熟悉分段支持该分段的工作方式。但是我怀疑每次获取任何东西时,任何CPU都不会进行表查找(这太慢/太昂贵了,不实用);我希望对于所有支持分段的CPU,“当前使用中”分段的信息都以某种方式在内部存储。

答案 1 :(得分:-1)

无论何时使用内存,段表都是参考。因此,该表必须永久存储以备后用,因此要存储在物理地址(即RAM)中。