免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: vikingrex
打印 上一主题 下一主题

请教保护模式和实模式de问题!! [复制链接]

论坛徽章:
0
11 [报告]
发表于 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默认值的描述符里面默认值为这个地址即可。

只要执行了第一条指令,后续的事情当然可以继续完成

论坛徽章:
0
12 [报告]
发表于 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

论坛徽章:
0
13 [报告]
发表于 2007-10-29 15:37 |只看该作者
原帖由 bluesky_jxc 于 2007-10-29 13:22 发表

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

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

开机进入保 ...

所以我认为开机进入实模式的唯一原因只是兼容,技术上没有太大问题。

论坛徽章:
0
14 [报告]
发表于 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 可以作出相的修改。

论坛徽章:
0
15 [报告]
发表于 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 位来表示权限是相当容易的事情。没有这样做,恐怕是认为没必要吧!!

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
16 [报告]
发表于 2007-10-29 22:58 |只看该作者
这个问题本身错了。INTEL的CPU一开机或复位,进入的是保护模式,经第一条JMP指令,进入实模式。(为什么不是一开机复位就进入实模式,问INTEL公司,大约是为了CPU的效率吧?也就是说实模式是建立在保护模式的基础上的,它只是一种假象)。
然后,...,由操作系统编程再进入保护模式。
PS:RING0到RING123的问题,版主的确没理解清楚。
据我所知,操作系统就绪后,RING0的执行上下文就不再需要了。为什么LINUZ要把main movetousermode????,不理解中。事实上只要jmp schedule,就能达到相同的效果。jmp后,该代码会被调度出去,并再也不会被调度回来了,因为它没有自已的TSS,INTEL说,切换后的临时TSS以后可移为它用

论坛徽章:
0
17 [报告]
发表于 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不是很了解哈,很多东西我都是猜想的,具体是不是就不知道了,说错勿怪哈

论坛徽章:
0
18 [报告]
发表于 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 的低权限的文字说明,麻请贴出来看看

论坛徽章:
0
19 [报告]
发表于 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中起第一进程那样

论坛徽章:
0
20 [报告]
发表于 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到实模式
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP