fromnight
驱动牛犊
驱动牛犊
  • 注册日期2002-10-14
  • 最后登录2004-09-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:4127回复:29

82分奉送,操作系统如何区分内核模式和用户模式的代码

楼主#
更多 发布于:2002-11-19 11:01
操作系统如何判断哪些code可以访问核心资源,哪些code不能访问核心资源?
我知道cpu从硬件角度指定了某些指令可以访问某些核心资源(如某些寄存器需要特定的指令访问),而某些指令不能访问。但是如果我在用户模式的应用程序里加入这个指令,是不是就能够直接访问这些寄存器呢?
这个问题其实也就是操作系统如何区分内核模式的code与用户模式的code。

最新喜欢:

baiyuanfanbaiyua...
xxxxx xxxxx x x x xxxx xxxx x x x x x x
ydyuse
驱动老牛
驱动老牛
  • 注册日期2002-07-25
  • 最后登录2005-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-19 11:43

当CPU运行于内核模式时,一切都可运行。任务可以执行特权级指令,对任何I/O设备有全部的访问权,
还能够访问任何虚地址和控制虚拟内存硬件。这种模式对应于INTEL 80X86上0级环(RING0)

在用户模式中,硬件防止特权指令的执行,并进行内存和I/O空间的引用的检查。这就允许操作
系统限制任务对各种I/O操作的访问,并捕捉违反系统完整性的任何行为。在用户模式中,运行的代码
如果不通过操作系统的某种门机制,就不能进入内核模式。这种模式对应于INTEL 80X86上3级环(RING3)

能不能直接访问,要看系统是否限制。


[编辑 -  11/19/02 by  ydyuse]
生命驱动,活力无限!
magicx
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2014-08-18
  • 粉丝1
  • 关注0
  • 积分-14分
  • 威望13点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-19 11:56

当CPU运行于内核模式时,一切都可运行。任务可以执行特权级指令,对任何I/O设备有全部的访问权,
还能够访问任何虚地址和控制虚拟内存硬件。这种模式对应于INTEL 80X86上0级环(RING0)

在用户模式中,硬件防止特权指令的执行,并进行内存和I/O空间的引用的检查。这就允许操作
系统限制任务对各种I/O操作的访问,并捕捉违反系统完整性的任何行为。在用户模式中,运行的代码
如果不通过操作系统的某种门机制,就不能进入内核模式。这种模式对应于INTEL 80X86上3级环(RING3)

能不能直接访问,要看系统是否限制。


[编辑 -  11/19/02 by  ydyuse]


这些我想他都应该知道。。。

但是。。。
[color=red]大头鬼! :P[/color]
seaquester
驱动大牛
驱动大牛
  • 注册日期2002-05-22
  • 最后登录2016-06-16
  • 粉丝0
  • 关注0
  • 积分500分
  • 威望115点
  • 贡献值0点
  • 好评度107点
  • 原创分0分
  • 专家分52分
地板#
发布于:2002-11-19 12:38
通过Code段的CPL可以判断。
每个存储器段都与一个特权级别相联系。特权级别限制是指,只有足够级别的程序,才可对相应的段进行访问。在任何时候,一个任务总是在四个特权级之一下运行,任务在特定时刻的特权级称为当前特权级 (Current Privilege level),标记为CPL,即当前运行程序的特权级。每当一个程序试图访问一个段时,就把CPL与要访问的段的特权级进行比较,以决定是否允许这一访问。对给定CPL执行的程序,允许访问同一级别或外层级别的数据段。
八风舞遥翩,九野弄清音。 鸣高常向月,善舞不迎人。
sipu
驱动牛犊
驱动牛犊
  • 注册日期2002-05-13
  • 最后登录2005-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-11-19 12:52
内部具体的实现不清楚,以下仅是自己的推测:

操作系统的内存管理系统将地址空间分为内核模式和用户模式,如果你在用户空间访问内核模式的资源,它能够很简单地通过判定你的目的地址来确定你是否有这个权限。从而导致访问权限错误(5)。和用户态调试中的ASSERT宏类似。

你如果想知道得更清楚,看看linux源代码,或者在google新闻组中搜一下。
sipu
驱动牛犊
驱动牛犊
  • 注册日期2002-05-13
  • 最后登录2005-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-11-19 12:58
哈,

seaquester的回答更深入,到汇编的层次上了。

但是原理和我的理解应该类似的,即通过代码的地址来判定操作权限。
taosa
驱动牛犊
驱动牛犊
  • 注册日期2002-07-29
  • 最后登录2005-01-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-11-19 12:59
80386体系结构
看一看,什么都知道了
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-11-19 13:27
这种问题我觉得太大了,不是一句话就能说清楚的,建议看看x86保护模式方面的书。
msystem
驱动牛犊
驱动牛犊
  • 注册日期2002-11-11
  • 最后登录2003-03-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-11-19 14:25
我觉得通过Code段的CPL来判断它对设备的权限应该是各种保护方式中的一种吧。楼上的回答似乎只涉及到x86芯片,据我所知,其它类型的芯片也有相应的保护方式。比如power PC 就有user-level指令和supervisor-level指令,不知道操作系统有没有与此相关的一些功能。
寻找IT的新动力!
seaquester
驱动大牛
驱动大牛
  • 注册日期2002-05-22
  • 最后登录2016-06-16
  • 粉丝0
  • 关注0
  • 积分500分
  • 威望115点
  • 贡献值0点
  • 好评度107点
  • 原创分0分
  • 专家分52分
9楼#
发布于:2002-11-19 14:44
我觉得通过Code段的CPL来判断它对设备的权限应该是各种保护方式中的一种吧。楼上的回答似乎只涉及到x86芯片,据我所知,其它类型的芯片也有相应的保护方式。比如power PC 就有user-level指令和supervisor-level指令,
---------------------------
是的,其他种类的CPU可能方法不一样,我不太了解
八风舞遥翩,九野弄清音。 鸣高常向月,善舞不迎人。
fromnight
驱动牛犊
驱动牛犊
  • 注册日期2002-10-14
  • 最后登录2004-09-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-11-19 15:54
给分了,感谢各位的回答。过两天再将剩下的分给出来。
xxxxx xxxxx x x x xxxx xxxx x x x x x x
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-11-19 16:03
问题本身感觉有点词不搭意
猜测fromnight是想做一些用户态不能做的事,却以为用户态不能做是因为操作系统识别了用户态,让能做此事的指令不能执行。故而有了“哪些code可以访问核心资源,哪些code不能访问核心资源”“这个问题其实也就是”“操作系统如何区分内核模式的code与用户模式的code”这种不相干的联系。

尽量简化地说,先看看“操作系统如何区分内核模式的code与用户模式的code”:运行在什么态就是什么态,区分做什?要说区分,系统有些地方,比如系统服务中,会判断“先前的模式”--即请求该服务的程序运行的级别,以确定自己的行为。

“哪些code可以访问核心资源,哪些code不能访问核心资源”:涉及面过大,举两个例子。用户态程序不能访问系统空间内存----系统将该空间对应的页目录与页表中U/S清零,然后等着收页异常就是了(用户态访问时),这是利用硬件安全功能“守株待兔”,此位其一。  程序可否访问一个对象,系统的处理就是主动出击了:前面说过的“先前的模式”为核心态,不接受安全检查,pass;为用户态则检查其token及对象的ACL,行则pass。
msystem
驱动牛犊
驱动牛犊
  • 注册日期2002-11-11
  • 最后登录2003-03-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-11-21 14:32
楼上都是做软件的吧。
实际上这个是由操作系统和硬件共同完成的。
系统运行在内核模式的时候,由操作系统将cpu的状态寄存器中的某一位设为0,这个时候user-level and supervisor-level 的指令都可以运行。系统运行在用户模式时,该位设为1,这时,只有user-level的指令能够运行,一些只能在内核模式下访问的address也不能访问。
寻找IT的新动力!
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-11-21 14:40
楼上都是做软件的吧。
-------------------------------------------
of course not




实际上这个是由操作系统和硬件共同完成的。
-------------------------------------------
上面每个人都说了这个意思,不必“实际上”




系统运行在内核模式的时候,由操作系统将cpu的状态寄存器中的某一位设为0,这个时候user-level and supervisor-level 的指令都可以运行。系统运行在用户模式时,该位设为1,这时,只有user-level的指令能够运行,一些只能在内核模式下访问的address也不能访问。
---------------------------------------------
上面都针对x86平台,ysy的后半句话比较适用于你。某种机器的体系结构不是靠猜的。
msystem
驱动牛犊
驱动牛犊
  • 注册日期2002-11-11
  • 最后登录2003-03-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-11-21 14:45
对不起,忘了说了,我指的不是x86,x86有四种模式,但一般也就只用了ring0和ring3两种。
寻找IT的新动力!
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-11-21 15:15
不管怎么说都不该说太刺耳的话,抱歉,最近心情不好
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-11-21 15:23
不管怎么说都不该说太刺耳的话,抱歉,最近心情不好

怎么了,跟老婆吵架了?
msystem
驱动牛犊
驱动牛犊
  • 注册日期2002-11-11
  • 最后登录2003-03-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-11-21 16:15
没什么,这很正常!
寻找IT的新动力!
hfyhl
驱动小牛
驱动小牛
  • 注册日期2002-11-08
  • 最后登录2005-10-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-11-23 07:58
仅以IN, OUT指令举例.
在保护模式下,每个代码段都有一个描述表优先级(cpl),存放在描述表中
每个代码段同时也有一个I/O优先级,也存放在描述表中(iopl).当该代码段中出现I/O指令时,操作系统比较cpl和iopl,若cpl<iopl, 则执行,否则启动二级保护机制.若最终指令未被执行,VMM会收到消息并把这个消息交给注册的驱动程序处理.
其他特权指令应该也有类似的过程
 
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-11-23 11:00
[quote]
>>仅以IN, OUT指令举例.
>>在保护模式下,每个代码段都有一个描述表优先级(cpl),
                                             (dpl。cpl是隐含的)

>>存放在描述表中
>>每个代码段同时也有一个I/O优先级,也存放在描述表中(iopl).
                                          EFLAGS
>>当该代码段中出现I/O指令时,操作系统比较
                            处理器
>>cpl和iopl,若cpl<iopl,
                 <=
>>则执行,否则启动二级保护机制.若最终指令未被执行,VMM会收到消息并把这个消息交给注册的驱动程序处理.
#GP发生后的处理因操作系统而异
>>其他特权指令应该也有类似的过程
IN,OUT不是特权指令,是“敏感”指令

if((PE == 1) && ((CPL > IOPL) || (VM == 1))){
//Protected mode with CPL > IOPL or virtual-8086 mode
        if(Any I/O Permission Bit for I/O port being accessed == 1)
              #GP(0);//I/O operation is not allowed

        else do;//I/O operation is allowed
}
else//Real Mode or Protected Mode with CPL <= IOPL
        do;//I/O operation


怪癖,不习惯re过的贴子有自己觉得的error,有不同意见尽可re。 :cool:
上一页
游客

返回顶部