Chinaunix

标题: 请教保护模式和实模式de问题!! [打印本页]

作者: vikingrex    时间: 2007-10-28 20:38
标题: 请教保护模式和实模式de问题!!
对二者的概念不太理解。查了写帖子得到些信息。
理解他们最大的区别是寻址的不同,一个被分成64K的段,而另一个段的大小可以变化。
是不是还有其他关键的区别。??
另外,感觉不到这中差别的威力究竟有多大。
请大侠解释一下。
为什么把实模式的寻址整成1M?
有32根地址线啊,不可以都用上吗?
可能都用上就是保护模式了.
为什么系统刚启动的时候不能以保护模式启动呢?
请大侠指教!!
谢谢。
作者: vikingrex    时间: 2007-10-28 21:22
是不是可以这样理解。
之所以采用保护模式是因为保护模式可以有更大的地址空间。
为什么可以有更大的地址空间呢,实模式为什么就不可以有更大的地址空间呢?
实模式也是可以有更大的地址空间的!
为什么这样说呢。因为有32根地址线,都用上不就有更大的地址空间了!
但是为什么没有都用上呢?
因为cpu使用了分段机制和分页机制。如果采用刚开始的实模式采都用了32位地址,就无法采用分段机制了。
当然采用分段机制的威力是很明显的。。。
嘿嘿。。

以上纯粹是跟人理解。。
有不妥,请高手指教。。
作者: scutan    时间: 2007-10-28 21:25
>>是不是还有其他关键的区别。??
其它关键的区别就是在访问时的权限的检查. 因为INTEL处理器是分为了四个权限级别的.
>>为什么把实模式的寻址整成1M?
因为实模式是在8086的时候就已经出来了的, 当时的地址总线是20位的. 所以说是1M的寻址空间.
>>有32根地址线啊,不可以都用上吗?
在保护模式的时候就用上了!
>>为什么系统刚启动的时候不能以保护模式启动呢?
做任何事情总有一个先后顺序吧, 就好比上楼, 总得一层楼一层楼的上吧.
作者: vikingrex    时间: 2007-10-28 21:29
原帖由 scutan 于 2007-10-28 21:25 发表
>>是不是还有其他关键的区别。??
其它关键的区别就是在访问时的权限的检查. 因为INTEL处理器是分为了四个权限级别的.
>>为什么把实模式的寻址整成1M?
因为实模式是在8086的时候就已经出来了的, 当时的地址 ...


非常感谢。

是不是可以这样理解。
之所以采用保护模式是因为保护模式可以有更大的地址空间。
为什么可以有更大的地址空间呢,实模式为什么就不可以有更大的地址空间呢?
实模式也是可以有更大的地址空间的!
为什么这样说呢。因为有32根地址线,都用上不就有更大的地址空间了!
但是为什么实模式没有都用上呢?
因为cpu使用了分段机制和分页机制。如果采用刚开始的实模式采都用了32位地址,就无法采用分段机制了。
当然采用分段机制的威力是很明显的。。。

是不是这样理解??
作者: vikingrex    时间: 2007-10-28 21:33
原帖由 scutan 于 2007-10-28 21:25 发表
>>是不是还有其他关键的区别。??
其它关键的区别就是在访问时的权限的检查. 因为INTEL处理器是分为了四个权限级别的.
>>为什么把实模式的寻址整成1M?
因为实模式是在8086的时候就已经出来了的, 当时的地址 ...



按照你说的,当时有20根地址线,实模式是20为的,
既然现在已经有32为的地址线了,为什么不可以在实模式的时候都用上?
作者: scutan    时间: 2007-10-28 21:45
INTEL是一个产品, 它要做到后面的产品与前面的产品兼容
80386之后的处理器与8086处理器表面上看来是处理器位数的变化, 实质上是处理器体系结构的变化, 即由实模式到保护模式的转变, 保护模式就为运行现代操作系统提供了很好的硬件支持. 不过为了兼容, 它保留了实模式寻址的这种机制.
作者: vikingrex    时间: 2007-10-28 22:05
原帖由 scutan 于 2007-10-28 21:45 发表
INTEL是一个产品, 它要做到后面的产品与前面的产品兼容
80386之后的处理器与8086处理器表面上看来是处理器位数的变化, 实质上是处理器体系结构的变化, 即由实模式到保护模式的转变, 保护模式就为运行现代操作系 ...


保护模式的分的一个页大小多少?
一页用到的地址线的个数,是不是和实模式用到的地址线的个数?
。。。。
作者: mik    时间: 2007-10-28 22:40
原帖由 vikingrex 于 2007-10-28 22:05 发表


保护模式的分的一个页大小多少?
一页用到的地址线的个数,是不是和实模式用到的地址线的个数?
。。。。


page: 4K/2M/4M 三种 size

在 non-PAE 模式下,32 位物理地址,
在 PAE 模式下,Intel 的处理器是 36 位,而 AMD 可以达到:40 位、52 位之多



另:回答你“为什么一开机不进入保护模式”的问题。

一方面,也是主要的原因:为了兼容。

一方面,基于 X86 保护模式机制的特点予盾所示:   
假如 CPU 复位后就进入保护模式的话,那么,CPU 此时处理于 user 级别权限好,还是处理于 supervisor 级别的权限好呢?
若处于 supervisor 权限的话,x86 CPU 是不能从高权限级别向低权限转移的,除了调用返回外。这样的话,CPU 永远处于 supervisor 权限级别。
若处于 user 权限级别的话,X86 CPU 的某些指令是不能运行的,如:mov CRn, XX、 LGDT、LLDT 等等,这样也就永远无法产生保护模式的环境。

当然,主要问题是为了兼容,至于这样机制予盾,若选择不兼容的话,Intel 可以作出适当的修改。
作者: zx_wing    时间: 2007-10-29 00:36
标题: 回复 #7 vikingrex 的帖子
保护模式和实模式的区别,主要还是在特权级检查。
其次,实模式可以访问4G的地址空间。但是这是一种很特殊的情况,称为big real mode,它需要先进到保护模式后再切换回实模式。
其三,不直接进入保护模式,我认为还是兼容问题。mik版主提到的supervisor/user问题我认为不准确,因为u/s是对于paging来说的,mmu根据当前的cpl级别和页表中的u/s位来判断当前程序时候拥有访问对应内存的权限。执行权限还是由cpl决定的ring级别确定。
作者: mik    时间: 2007-10-29 12:43
原帖由 zx_wing 于 2007-10-29 00:36 发表
mik版主提到的supervisor/user问题我认为不准确,因为u/s是对于paging来说的,mmu根据当前的cpl级别和页表中的u/s位来判断当前程序时候拥有访问对应内存的权限。执行权限还是由cpl决定的ring级别确定。


呵呵~ 偶提到的 supervisor/user 是非常正确的。

Intel 已经明文规定: 0、1 以及 2 级别的权限就是 supervisor。 3 级为 user

这里要分清楚 page 所需的权限,以及 CPL 权限两个问题。

PDE 以及 PTE 定义的 u/s 是属于访问所需的权限,CPL 是 CPU 当前权限。

page 只区别 supervisor 和 user 。并不定义具体的哪个级别
若 PTE 定义为 supervisor 权限,CPL 为 0, 1 以及 2 都具有访问权限。3 不行。
作者: bluesky_jxc    时间: 2007-10-29 13:22
原帖由 mik 于 2007-10-29 12:43 发表


呵呵~ 偶提到的 supervisor/user 是非常正确的。

Intel 已经明文规定: 0、1 以及 2 级别的权限就是 supervisor。 3 级为 user

这里要分清楚 page 所需的权限,以及 CPL 权限两个问题。

PDE 以及  ...

你说的概念没有错
但并不代表不能直接开机进入保护模式

linux启动的时候也是在特权级别下初始化gdt、idt等等,等启动完毕再回到用户级别,因此没有理由说明不能从特权级别向用户级别跳转。

开机进入保护模式应该有几个条件,一个就是reset时,cs、ds等段寄存器必须包含默认的选择子,gdt 表里面对应描述符里面的线性地址域需要指向EEPROM区域

这并不困难,因为x86下面reset后执行的第一条指令是位于0xFFFFFFE0,只要在对应cs默认值的描述符里面默认值为这个地址即可。

只要执行了第一条指令,后续的事情当然可以继续完成
作者: zx_wing    时间: 2007-10-29 15:36
原帖由 mik 于 2007-10-29 12:43 发表


呵呵~ 偶提到的 supervisor/user 是非常正确的。

Intel 已经明文规定: 0、1 以及 2 级别的权限就是 supervisor。 3 级为 user

这里要分清楚 page 所需的权限,以及 CPL 权限两个问题。

PDE 以及  ...

所以我认为应该用CPL表示,或者说当前运行在ringX更为准确。
例如我们做段检查都是比较CPL、DPL、RPL等,对于操作系统来说,更为准确的应该用当前的ring级别来描述它的特权级。我认为之所以有supervisor和user这个说法,是因为在页表里面只有1bit来表示特权级,所以只能区分两个特权级。如果页表里面有2bit来表示特权级,则根本不会产生supervisor和user这个概念,用CPL或ring就概括了所有。
正是如此,我认为s/u是和paging相关并由此引申出来的概念,我们在描述特权级的时候应该用ring或CPL,只有当牵涉到访问页表时候的权限时,才提u/s

su.JPG (37.29 KB, 下载次数: 52)

su.JPG

作者: zx_wing    时间: 2007-10-29 15:37
原帖由 bluesky_jxc 于 2007-10-29 13:22 发表

你说的概念没有错
但并不代表不能直接开机进入保护模式

linux启动的时候也是在特权级别下初始化gdt、idt等等,等启动完毕再回到用户级别,因此没有理由说明不能从特权级别向用户级别跳转。

开机进入保 ...

所以我认为开机进入实模式的唯一原因只是兼容,技术上没有太大问题。
作者: mik    时间: 2007-10-29 18:46
原帖由 bluesky_jxc 于 2007-10-29 13:22 发表

你说的概念没有错
但并不代表不能直接开机进入保护模式

linux启动的时候也是在特权级别下初始化gdt、idt等等,等启动完毕再回到用户级别,因此没有理由说明不能从特权级别向用户级别跳转。

开机进入保 ...


在现今 x86 的保护模式下,是绝对不能从高权限向低权限转移的,原因就是: 从安全方面考虑,从高权限往低权限代码跳转时,是非常危险的。
这些可以查看 Intel 的文档关于 protection 的章节

gdt 、idt 是进入保护模式之前必须初始化的。

CPU rest/INIT 后, 建立相应的保护模式环境(置GDT/IDT 相应的值)是可行的办法之一。

所以偶前面的贴子已经说明白了:主要的为了兼容,若不需兼容,Intel 可以作出相的修改。
作者: mik    时间: 2007-10-29 19:01
原帖由 zx_wing 于 2007-10-29 15:36 发表

所以我认为应该用CPL表示,或者说当前运行在ringX更为准确。
例如我们做段检查都是比较CPL、DPL、RPL等,对于操作系统来说,更为准确的应该用当前的ring级别来描述它的特权级。我认为之所以有supervisor和us ...


偶提到 supervisor / user 这个说法,是由“开机为什么不直接进入保护模式”而引发的一个问题:复位后 CPU 该处于哪个权限级别合适呢?
用了 supervisor / user 这两个概念比用 ring 0、ring 1、ring2 以及 ring3 这几个术语更能把问题描述清楚! 并不是说在 segment/paging 机制中的权限检查中使用这 supervisor/user 两个概念。

事实上,Intel 之所以在 PDE/PTE 里只设置了 1 位来表示权限,是经过考虑的。X86 的分段时已经有很严格的一层层的检查。每一个ringN的访问都有严格的检查。才到 paging 这一关。

事实上,Intel 若在 PDE/PTE 里设 2 位来表示权限是相当容易的事情。没有这样做,恐怕是认为没必要吧!!
作者: folklore    时间: 2007-10-29 22:58
这个问题本身错了。INTEL的CPU一开机或复位,进入的是保护模式,经第一条JMP指令,进入实模式。(为什么不是一开机复位就进入实模式,问INTEL公司,大约是为了CPU的效率吧?也就是说实模式是建立在保护模式的基础上的,它只是一种假象)。
然后,...,由操作系统编程再进入保护模式。
PS:RING0到RING123的问题,版主的确没理解清楚。
据我所知,操作系统就绪后,RING0的执行上下文就不再需要了。为什么LINUZ要把main movetousermode????,不理解中。事实上只要jmp schedule,就能达到相同的效果。jmp后,该代码会被调度出去,并再也不会被调度回来了,因为它没有自已的TSS,INTEL说,切换后的临时TSS以后可移为它用
作者: zx_wing    时间: 2007-10-29 23:03
原帖由 mik 于 2007-10-29 19:01 发表


偶提到 supervisor / user 这个说法,是由“开机为什么不直接进入保护模式”而引发的一个问题:复位后 CPU 该处于哪个权限级别合适呢?
用了 supervisor / user 这两个概念比用 ring 0、ring 1、ring2 以及 ...

呵呵,个人还是认为用ring级别清楚些。因为通常讲操作系统的时候用ring比较多。当然,这也只是个概念问题,不影响实质。
对于u/s只有1bit的问题,以前也请教过别人,觉得应该是个历史问题。假设有一个操作系统用到了4个ring级别,但u/s只能表示两种特权级,感觉就不方便了。
mik知道我对x86不是很了解哈,很多东西我都是猜想的,具体是不是就不知道了,说错勿怪哈
作者: mik    时间: 2007-10-31 00:14
标题: 回复 #16 folklore 的帖子
>> INTEL的CPU一开机或复位,进入的是保护模式,经第一条JMP指令,进入实模式
这个观点挺新颖,但是不成立。CPU 在 INIT/REST 后,CR0.PE 为 0,是实模式。
实模式和保护模式的硬件资源是一样的。实模式的 segment descriptor 的 limit 被指定为 0xFFFF 且不能修改。实模式不能使用的 segmentation/paging 的保护机制外,其它是并没有什么区别。

>> 至于,你说的 ring0 到 ring123 的问题。
Intel 文档里是说明不能 jmp /call 的低权限的代码。须 CPL >= DPL (数字上)
偶现在也有些混乱了,或许偶真的理解错误了。偶再仔细了解了解吧。
若你找到可以 jmp/call 的低权限的文字说明,麻请贴出来看看
作者: zx_wing    时间: 2007-10-31 10:30
原帖由 mik 于 2007-10-31 00:14 发表
>> INTEL的CPU一开机或复位,进入的是保护模式,经第一条JMP指令,进入实模式
这个观点挺新颖,但是不成立。CPU 在 INIT/REST 后,CR0.PE 为 0,是实模式。
实模式和保护模式的硬件资源是一样的。实模式的 se ...

班门弄斧一下了。
我想mik可能想混淆了。可能只想到了direct jmp/call这种方式了。
对于direct jmp/call,x86确实不允许高特权级向低特权级跳转,跳转只能发生在同特权级之间,这是对于conforming code来说的。。例外的情况是,如果code是conforming code(实在不知道这个怎么翻译),是可以从低特权级跳转到高特权级的,这个时候程序本身的CPL并不改变,栈也不会切换,程序虽然运行的是高特权级的code,但不能访问高特权级的数据,通常用于一些数学库之类的模块。
但对于开机进入了高特权级,我们完全可以自己伪造一个中断栈,通过一个iret指令从高特权级回到低特权级,就像linux0.11中起第一进程那样
作者: zx_wing    时间: 2007-10-31 10:31
原帖由 mik 于 2007-10-31 00:14 发表
>> INTEL的CPU一开机或复位,进入的是保护模式,经第一条JMP指令,进入实模式
这个观点挺新颖,但是不成立。CPU 在 INIT/REST 后,CR0.PE 为 0,是实模式。
实模式和保护模式的硬件资源是一样的。实模式的 se ...

>>这个观点挺新颖,但是不成立。CPU 在 INIT/REST 后,CR0.PE 为 0,是实模式。
同意,没听说过开机要通过jmp到实模式
作者: folklore    时间: 2007-10-31 10:36
1.开机后经第一条指令的说法,我也只有一个印象,但我找到这个,做了佐证:
(当然,无论如何,对操作系统编程人员来说,都可以认为开机后进入的是实模式)

10.2.3 First Instructions
After RESET, address lines A{31-20} are automatically asserted for
instruction fetches. This fact, together with the initial values of CS:IP,
causes instruction execution to begin at physical address FFFFFFF0H. Near
(intrasegment) forms of control transfer instructions may be used to pass
control to other addresses in the upper 64K bytes of the address space. The
first far (intersegment) JMP or CALL instruction causes A{31-20} to drop
low, and the 80386 continues executing instructions in the lower one
megabyte of physical memory. This automatic assertion of address lines
A{31-20} allows systems designers to use a ROM at the high end of
the address space to initialize the system.

2.这个问题,看来是我对问题的理解有误。版主说的是直接JMP。据我所知,在INTEL的机器上,最好只在相同的RING上JMP,不然SS出错的机率是非常大的。当然,我想也没有操作系统的设计者会在不同的RING间JMP。
就问题本身而言,虽然我们无法直接JMP,但JMP TSS却是可以的,它会使得SS,DS,CS都有一样的DPL。当然前提是你正确地设置LDT。
_________________________________________________________________
此外,版主的确十分了解INTEL的CPU,在下十分感服。不过,在下是“应用主义”一族的。只有没有立即用到,我是不会关心技术问题的。我发表的论点大多数只是借于经验。若有不慎之处,还请见谅。此外,版主所提到的:

  1. Intel 文档里是说明不能 jmp /call 的低权限的代码。须 CPL >= DPL (数字上)
复制代码

是对的。不过和我说的是两回事。也就是说,是我没把问题说请楚。

[ 本帖最后由 folklore 于 2007-10-31 10:40 编辑 ]




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2