linux上面的一个习题
以80x86微处理器内存寻址为例,说明可访问三种不同类型地址,
以及这三种不同类型地址之间的转换过程。三种不同类型地址?
是哪三种啊?还有就是具体怎么解答啊??
------解决方案--------------------内存地址
程序员偶尔会引用内存地址作为访问内存单元的一种方式,但是,使用X86处理器时,我们必须区分以下三种不同的地址:
逻辑地址:每一个逻辑地址都是由一个段和偏移量组成,偏移量指明了从段开始的地方到实际地址之间的距离。
线性地址:也称虚拟地址,是一个32位无符号整数,可以用来表示4GB的地址,值范围从0x00000000到0xffffffff。
物理地址:用于芯片级单元寻址。它们与微处理器的地址引脚发送到内存总线上的电信号相对应。物理地址由32位或36位无符号整数表示。
内存控制单元MMU通过一种称为分段单元的硬件电路把一个逻辑地址转换成线性地址,接着第二个称为分页单元的硬件电路把线性地址转换成一个物理地址。
逻辑地址——分段单元——线性地址——分页单元——物理地址。
------解决方案--------------------楼上解释正确!
通俗的讲,举例:
①cs : ip = 0x7c00:0x0 ->叫虚拟地址 其中 ip中的值 0x0叫逻辑地址 (它们可以统称逻辑地址)
②进入保护模式之后,cs变为选择子 这时候cs的值代表者你所要访问地址的基地址在GDT表中的偏移值,基地址+ip之后就叫 线性地址
③之后如果没开分页机制,线性地址就是最终的物理地址
如果开了此机制,此时线程地址分成三部分(一般情况,具体根据硬件情况),通过三部分来进行寻址,最后是物理地址
转换过程大致是这样,如果还不明白的话可参考<linx 0.12内核完全剖析>第四章保护模式编程的内容