我对以下问题感到困惑,因为根据这个问题,一个段可以在一个段中包含8kb大小的数据,但是在Processor7的段中,该问题中的段0中大于8kb,例如97 kb? ? Plz消除了困惑?
问题:
假设一个16位系统正在使用细分,并且目前有 内存中有6个孔,如下所示: 174 KB内存位置180处的孔, b。 306 KB内存位置810 c中的孔。 245 KB内存孔 地点1287 d。 456 KB内存位置1912中的孔e。 596 KB孔,位于 内存位置2800 f。内存位置144 KB的孔4256系统 每个进程最多允许8个段。现在,有一个流程P7, 具有5个大小为97 KB(段0),256 KB,384 KB,217 KB的段 和186 KB(第4段)。考虑到这种情况,有多少位 从CPU生成的逻辑地址中?需要多少位 细分索引?访问一个单词需要多少位 段?段的最大大小是多少?
答案 0 :(得分:0)
没有足够的信息来回答问题。
例如:
a)如果它是“ 16位系统”,那是什么意思?是说所有段偏移都是16位,还是整数运算(加,减,...)是16位,而寻址/段偏移使用的大小却完全不同?
b)如果段偏移量是16位,则最小粒度是多少?例如。如果其字节可寻址,则有用的最大段大小不能超过64 KiB(例如,通过在偏移量0xFFFF处访问16位值,您将能够访问“ 64 KiB +一个额外的字节”)。但是,如果它是“可寻址的字”,则可能更像是“地址= segment.base +偏移量* word_size”,并且(具有16位字长)您将可以拥有“ 128 KiB +一个额外的字节”。 / p>
c)“有用的最大分段大小”和“支持的最大分段大小”之间有区别吗?例如,“ 64 KiB +一个额外的字节”在理论上可能有用,但是在实践中,您可能希望(为了方便/更快地进行段限制检查),CPU会将最大段大小限制为64 KiB。但是没有什么可说的是,CPU没有使用完全任意的最大段大小(16 KiB,32 KiB,12345字节,26 GiB等),而段偏移的大小没有任何意义。
d)如果逻辑地址计算是“(segment.base +偏移量*比例)&((1 << max_bits)-1)”,其中segment.base的大小未知并且可以是任何大小,则该大小偏移量未知,可以是任意值,小数位数未知,可以是任意值,max_bits未知,可以是任意值;那么就不可能确定逻辑地址的大小。但是,我们甚至不知道逻辑地址的计算是什么(我只是选择了一种“通用形式”,其中某些部分可以被禁用-例如,“ scale = 1”,如果其字节可寻址)。
e)访问段中的单词所需的位数取决于您如何计算它们以及CPU支持什么。例如,也许有一条特殊的“在隐含/默认数据段的开头获取16位”指令,您可以在其中根本不使用任何位来访问段中的一个字(第一个字)。再举一个例子,也许CPU支持的唯一寻址模式涉及使用两个16位寄存器(例如“ address = segment.base +((reg1 << 16)| reg2)”),在这里您必须使用32位来访问一个字。