有关操作系统 一些迷惑的问题 未完 持续更新ing

目录

物理地址、逻辑地址、有效地址、线性地址、虚拟地址的区别

在实模式下,“段基址+段内偏移地址”经过段部件的处理,直接输出的就是物理地址,CPU 可以直接用此地址访问内存。

而在保护模式下,“段基址+段内偏移地址” 称为线性地址,不过,此时的段基址已经不再是真正的地址了,而是一个称为选择子的东西。它本质是个索引,类似于数组下标,通过这个索引便能在GDT 中找到相应的段描述符,在该描述符中记录了该段的起始、大小等信息,这样便得到了段基址。

  • 若没有开启地址分页功能,此线性地址就被当作物理地址来用,可直接访问内存。
  • 若开启了分页功能,此线性地址又多了一个名字,就是虚拟地址虚拟地址、线性地址在分页机制下都是一回事)。虚拟地址要经过 CPU 页部件转换成具体的物理地址,这样 CPU 才能将其送上地址总线去访问内存。

无论在实模式或是保护模式下,段内偏移地址又称为有效地址,也称为逻辑地址,这是程序员可见的地址。这是因为,最终的地址是由段基址和段内偏移地址组合而成的。

段基址已经有默认的了,要么是在实模式下的默认段寄存器中,要么是在保护模式下的默认段选择子寄存器指向的段描述符中,所以只要给出段内偏移地址就行了,这个地址虽然只是段内偏移,但加上默认的段基址,依然足够有效。

在这里插入图片描述

cs、ds这类sreg段寄存器,位宽是多少

无论在实模式还是保护模式,这些寄存器的位宽都是16位

cpu内部的段寄存器如下:

  • CS——代码段寄存器(code segment register),其值为代码段的段基值
  • DS——数据段寄存器(Data segment register),其值为数据段的段基值
  • ES——附加段寄存器(Extra segment register),其值为附加数据段的段基值,称为“附加”是因为此段寄存器用途不像其他sreg那样固定,可以额外作他用
  • FS——附加段寄存器(Extra segment register),其值为附加数据段的段基值,称为“附加”是因为此段寄存器用途不像其他sreg那样固定,可以额外作他用
  • GS——附加段寄存器(Extra segment register),其值为附加数据段的段基值,称为“附加”是因为此段寄存器用途不像其他sreg那样固定,可以额外作他用
  • SS——代码段寄存器(stack segment register),其值为堆栈段的段值

32 位 CPU 有两种不同的工作模式:实模式和保护模式。

每种模式下,段寄存器中值的意义是不同的,但不管其为何值,在段寄存器中所表达的都是指向的段在哪里。

  • 在实模式下,CS、DS、ES、SS 中的值为段基址,是具体的物理地址,内存单元的逻辑地址仍为 “段基值:段内偏移量” 的形式。
  • 在保护模式下,装入段寄存器的不再是段地址,而是 “段选择子” (Selector),当然,选择子也是数值,其依然为 16 位宽度。

可见,在 32 位 CPU 中,sreg 无论是工作在 16 位的实模式,还是 32 位的保护模式,用的段寄存器都是同一组,并且在 32 位下的段选择子是 16 位宽度,排除了段寄存器在 32 位环境下是 32 位宽的可能,综上,sreg 都是 16 位宽。

其他的迷惑问题,待续 补充 … …

发布了23 篇原创文章 · 获赞 13 · 访问量 2997

猜你喜欢

转载自blog.csdn.net/qq_29856169/article/details/104378921
今日推荐