阅读:4124回复:29
82分奉送,操作系统如何区分内核模式和用户模式的代码
操作系统如何判断哪些code可以访问核心资源,哪些code不能访问核心资源?
我知道cpu从硬件角度指定了某些指令可以访问某些核心资源(如某些寄存器需要特定的指令访问),而某些指令不能访问。但是如果我在用户模式的应用程序里加入这个指令,是不是就能够直接访问这些寄存器呢? 这个问题其实也就是操作系统如何区分内核模式的code与用户模式的code。 |
|
最新喜欢:![]()
|
沙发#
发布于: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] |
|
|
板凳#
发布于:2002-11-19 11:56
这些我想他都应该知道。。。 但是。。。 |
|
|
地板#
发布于:2002-11-19 12:38
通过Code段的CPL可以判断。
每个存储器段都与一个特权级别相联系。特权级别限制是指,只有足够级别的程序,才可对相应的段进行访问。在任何时候,一个任务总是在四个特权级之一下运行,任务在特定时刻的特权级称为当前特权级 (Current Privilege level),标记为CPL,即当前运行程序的特权级。每当一个程序试图访问一个段时,就把CPL与要访问的段的特权级进行比较,以决定是否允许这一访问。对给定CPL执行的程序,允许访问同一级别或外层级别的数据段。 |
|
|
地下室#
发布于:2002-11-19 12:52
内部具体的实现不清楚,以下仅是自己的推测:
操作系统的内存管理系统将地址空间分为内核模式和用户模式,如果你在用户空间访问内核模式的资源,它能够很简单地通过判定你的目的地址来确定你是否有这个权限。从而导致访问权限错误(5)。和用户态调试中的ASSERT宏类似。 你如果想知道得更清楚,看看linux源代码,或者在google新闻组中搜一下。 |
|
5楼#
发布于:2002-11-19 12:58
哈,
seaquester的回答更深入,到汇编的层次上了。 但是原理和我的理解应该类似的,即通过代码的地址来判定操作权限。 |
|
6楼#
发布于:2002-11-19 12:59
80386体系结构
看一看,什么都知道了 |
|
7楼#
发布于:2002-11-19 13:27
这种问题我觉得太大了,不是一句话就能说清楚的,建议看看x86保护模式方面的书。
|
|
8楼#
发布于:2002-11-19 14:25
我觉得通过Code段的CPL来判断它对设备的权限应该是各种保护方式中的一种吧。楼上的回答似乎只涉及到x86芯片,据我所知,其它类型的芯片也有相应的保护方式。比如power PC 就有user-level指令和supervisor-level指令,不知道操作系统有没有与此相关的一些功能。
|
|
|
9楼#
发布于:2002-11-19 14:44
我觉得通过Code段的CPL来判断它对设备的权限应该是各种保护方式中的一种吧。楼上的回答似乎只涉及到x86芯片,据我所知,其它类型的芯片也有相应的保护方式。比如power PC 就有user-level指令和supervisor-level指令,
--------------------------- 是的,其他种类的CPU可能方法不一样,我不太了解 |
|
|
10楼#
发布于:2002-11-19 15:54
给分了,感谢各位的回答。过两天再将剩下的分给出来。
|
|
|
11楼#
发布于:2002-11-19 16:03
问题本身感觉有点词不搭意
猜测fromnight是想做一些用户态不能做的事,却以为用户态不能做是因为操作系统识别了用户态,让能做此事的指令不能执行。故而有了“哪些code可以访问核心资源,哪些code不能访问核心资源”“这个问题其实也就是”“操作系统如何区分内核模式的code与用户模式的code”这种不相干的联系。 尽量简化地说,先看看“操作系统如何区分内核模式的code与用户模式的code”:运行在什么态就是什么态,区分做什?要说区分,系统有些地方,比如系统服务中,会判断“先前的模式”--即请求该服务的程序运行的级别,以确定自己的行为。 “哪些code可以访问核心资源,哪些code不能访问核心资源”:涉及面过大,举两个例子。用户态程序不能访问系统空间内存----系统将该空间对应的页目录与页表中U/S清零,然后等着收页异常就是了(用户态访问时),这是利用硬件安全功能“守株待兔”,此位其一。 程序可否访问一个对象,系统的处理就是主动出击了:前面说过的“先前的模式”为核心态,不接受安全检查,pass;为用户态则检查其token及对象的ACL,行则pass。 |
|
12楼#
发布于:2002-11-21 14:32
楼上都是做软件的吧。
实际上这个是由操作系统和硬件共同完成的。 系统运行在内核模式的时候,由操作系统将cpu的状态寄存器中的某一位设为0,这个时候user-level and supervisor-level 的指令都可以运行。系统运行在用户模式时,该位设为1,这时,只有user-level的指令能够运行,一些只能在内核模式下访问的address也不能访问。 |
|
|
13楼#
发布于:2002-11-21 14:40
楼上都是做软件的吧。
------------------------------------------- of course not 实际上这个是由操作系统和硬件共同完成的。 ------------------------------------------- 上面每个人都说了这个意思,不必“实际上” 系统运行在内核模式的时候,由操作系统将cpu的状态寄存器中的某一位设为0,这个时候user-level and supervisor-level 的指令都可以运行。系统运行在用户模式时,该位设为1,这时,只有user-level的指令能够运行,一些只能在内核模式下访问的address也不能访问。 --------------------------------------------- 上面都针对x86平台,ysy的后半句话比较适用于你。某种机器的体系结构不是靠猜的。 |
|
14楼#
发布于:2002-11-21 14:45
对不起,忘了说了,我指的不是x86,x86有四种模式,但一般也就只用了ring0和ring3两种。
|
|
|
15楼#
发布于:2002-11-21 15:15
不管怎么说都不该说太刺耳的话,抱歉,最近心情不好
|
|
16楼#
发布于:2002-11-21 15:23
不管怎么说都不该说太刺耳的话,抱歉,最近心情不好 怎么了,跟老婆吵架了? |
|
17楼#
发布于:2002-11-21 16:15
没什么,这很正常!
|
|
|
18楼#
发布于:2002-11-23 07:58
仅以IN, OUT指令举例.
在保护模式下,每个代码段都有一个描述表优先级(cpl),存放在描述表中 每个代码段同时也有一个I/O优先级,也存放在描述表中(iopl).当该代码段中出现I/O指令时,操作系统比较cpl和iopl,若cpl<iopl, 则执行,否则启动二级保护机制.若最终指令未被执行,VMM会收到消息并把这个消息交给注册的驱动程序处理. 其他特权指令应该也有类似的过程 |
|
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: |
|
上一页
下一页