阅读:4126回复:29
82分奉送,操作系统如何区分内核模式和用户模式的代码
操作系统如何判断哪些code可以访问核心资源,哪些code不能访问核心资源?
我知道cpu从硬件角度指定了某些指令可以访问某些核心资源(如某些寄存器需要特定的指令访问),而某些指令不能访问。但是如果我在用户模式的应用程序里加入这个指令,是不是就能够直接访问这些寄存器呢? 这个问题其实也就是操作系统如何区分内核模式的code与用户模式的code。 |
|
最新喜欢:![]()
|
沙发#
发布于:2002-11-28 09:42
1.系统启动进入内核之后ring0,最后必然要回到用户态,这其中的切换需要什么代价? 是如何切换的?比如设置哪些状态,保护什么东东标志? //范围so大,岂是几句能说清楚的 比如ring3可以通过 int 2e进入ring0,那么ring0怎么回到ring3. //ft iretd ,sysexit,...... 2.关于system service. 我想win 32 api最终会调用native api。但是ntdll.dll和ntoskrnl.exe都会导出Ntxxxx,那么这个native api到底是哪个导出的? //最后进入的是同一个由SSDT纪录的函数里,前者所做的预处理多一 //点而已。另外ntoskrnl导出的NT***与ntdll的不同,ntoskrnl的 //Zw***才用了int2e等。 ntdll.dll中的Ntxx通过int 2e进入内核, ntoskrnl.exe的Zwx也通过int 2e进入内核,为什么还要设计两个东东都通过int 2e进入,一个不就完了吗? //显然,自己想想看 ntdll.dll运行ring3态,可以被用户程序调用,ntoskrnl.exe运行ring0态,是否只能被kernel mode程序调用? //of course Zwxx通过int 2e重入ring0时,由于pre mode=ring0,所以没有安全检查?? //right --------------- 后两个问题我同学问: 3.windows 2000为何要把gui,user也搞进kernel,有何大用? //说法不准确,效率 4.为何system service用int 2e进入,而不用callgate?? //1、看看unix的核,想想它们的关系;2、看看由那些机器有callgate;3、XP在大多数机器上都不用int2e。 |
|
板凳#
发布于:2002-11-27 19:46
几个问题:
1.系统启动进入内核之后ring0,最后必然要回到用户态,这其中的切换需要什么代价? 是如何切换的?比如设置哪些状态,保护什么东东标志? 比如ring3可以通过 int 2e进入ring0,那么ring0怎么回到ring3. 2.关于system service. 我想win 32 api最终会调用native api。但是ntdll.dll和ntoskrnl.exe都会导出Ntxxxx,那么这个native api到底是哪个导出的? ntdll.dll中的Ntxx通过int 2e进入内核, ntoskrnl.exe的Zwx也通过int 2e进入内核,为什么还要设计两个东东都通过int 2e进入,一个不就完了吗? ntdll.dll运行ring3态,可以被用户程序调用,ntoskrnl.exe运行ring0态,是否只能被kernel mode程序调用? Zwxx通过int 2e重入ring0时,由于pre mode=ring0,所以没有安全检查?? --------------- 后两个问题我同学问: 3.windows 2000为何要把gui,user也搞进kernel,有何大用? 4.为何system service用int 2e进入,而不用callgate?? ------------------- 有点罗嗦,但是确实很糊涂,希望得到大家的指点。 |
|
地板#
发布于:2002-11-27 16:17
楼上很多人都说的很明白了,非常细节。
不过我的理解是这样的,只从os角度来说,系统代码都运行在r0级别,应用代码在r3级别上,用户应用进行受限操作时必须调用系统代码,所以操作系统只需要在用户应用调用系统代码前trap一下,从r3跳到r0就可以了,反之回到用户应用时也做相应操作。 参考“linux内核实习”小册子,上面只是我的理解,错了请re |
|
地下室#
发布于:2002-11-27 15:04
9X不区分KERNEL MODE和USER MODE
NT也不区分.但是有个PREVIOUS MODE的变量 KERNEL MODE/USER MODE的区分是相对于CPU的. 至于判断是否出于KERNEL MODE的唯一界定就是CPU的代码特权机制.符合RING0条件的为KERNEL MODE.符合RING3条件的是USER MODE. NT的MODE变量仅用于区分发出SYSCALL指令时CALLER的身份. 如果是从RING0发出.那么可以绕过一些安全检查. |
|
|
5楼#
发布于:2002-11-24 17:26
感谢pjf才行。
|
|
6楼#
发布于:2002-11-24 09:38
2000下使用了虚拟86扩展,IO行为稍有区别。
(确切点说,是“敏感”指令行为有所区别。IO的不同主要因OS对#GP处理不同) |
|
7楼#
发布于:2002-11-23 20:45
这段话在一本非常老的书上也有:Writing Windows VxDs and Device Drivers,第3章的开篇就是讲这个。
---------------------------------------------------- 如果他翻译成开始那样,那就该重新翻译了,呵呵 而且除了CPL和IOPL之外,还有一个IOPM, ---------------------------------------------------- Any I/O Permission Bit for I/O port being accessed == 1 这句话即在讲IOPM btw,那段伪码改自intel手册,比较完整的说明了IO指令的执行情况。 要过了2关才可以执行。V86下的DOS,忽略IOPL。 ------------------------------------------------------- 保护模式下只要CPL <= IOPL即不会再检查IOPL,v86不管IOPL必须检查。 可能NT系统下有些不同。 -------------------------------------------------------- 2000下使用了虚拟86扩展,IO行为稍有区别。 |
|
8楼#
发布于:2002-11-23 20:21
[quote] 这段话在一本非常老的书上也有:Writing Windows VxDs and Device Drivers,第3章的开篇就是讲这个。而且除了CPL和IOPL之外,还有一个IOPM,要过了2关才可以执行。V86下的DOS,忽略IOPL。可能NT系统下有些不同。 中文版也有得卖,是孙喜明翻的。 |
|
|
9楼#
发布于:2002-11-23 13:50
我从教材上抄了一段下来 哦?现在的教材啊,该改版了。呵呵 |
|
10楼#
发布于:2002-11-23 13:11
你真行,我从教材上抄了一段下来
居然被你找到这么多错误,呵呵 |
|
11楼#
发布于: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: |
|
12楼#
发布于:2002-11-23 07:58
仅以IN, OUT指令举例.
在保护模式下,每个代码段都有一个描述表优先级(cpl),存放在描述表中 每个代码段同时也有一个I/O优先级,也存放在描述表中(iopl).当该代码段中出现I/O指令时,操作系统比较cpl和iopl,若cpl<iopl, 则执行,否则启动二级保护机制.若最终指令未被执行,VMM会收到消息并把这个消息交给注册的驱动程序处理. 其他特权指令应该也有类似的过程 |
|
13楼#
发布于:2002-11-21 16:15
没什么,这很正常!
|
|
|
14楼#
发布于:2002-11-21 15:23
不管怎么说都不该说太刺耳的话,抱歉,最近心情不好 怎么了,跟老婆吵架了? |
|
15楼#
发布于:2002-11-21 15:15
不管怎么说都不该说太刺耳的话,抱歉,最近心情不好
|
|
16楼#
发布于:2002-11-21 14:45
对不起,忘了说了,我指的不是x86,x86有四种模式,但一般也就只用了ring0和ring3两种。
|
|
|
17楼#
发布于:2002-11-21 14:40
楼上都是做软件的吧。
------------------------------------------- of course not 实际上这个是由操作系统和硬件共同完成的。 ------------------------------------------- 上面每个人都说了这个意思,不必“实际上” 系统运行在内核模式的时候,由操作系统将cpu的状态寄存器中的某一位设为0,这个时候user-level and supervisor-level 的指令都可以运行。系统运行在用户模式时,该位设为1,这时,只有user-level的指令能够运行,一些只能在内核模式下访问的address也不能访问。 --------------------------------------------- 上面都针对x86平台,ysy的后半句话比较适用于你。某种机器的体系结构不是靠猜的。 |
|
18楼#
发布于:2002-11-21 14:32
楼上都是做软件的吧。
实际上这个是由操作系统和硬件共同完成的。 系统运行在内核模式的时候,由操作系统将cpu的状态寄存器中的某一位设为0,这个时候user-level and supervisor-level 的指令都可以运行。系统运行在用户模式时,该位设为1,这时,只有user-level的指令能够运行,一些只能在内核模式下访问的address也不能访问。 |
|
|
19楼#
发布于:2002-11-19 16:03
问题本身感觉有点词不搭意
猜测fromnight是想做一些用户态不能做的事,却以为用户态不能做是因为操作系统识别了用户态,让能做此事的指令不能执行。故而有了“哪些code可以访问核心资源,哪些code不能访问核心资源”“这个问题其实也就是”“操作系统如何区分内核模式的code与用户模式的code”这种不相干的联系。 尽量简化地说,先看看“操作系统如何区分内核模式的code与用户模式的code”:运行在什么态就是什么态,区分做什?要说区分,系统有些地方,比如系统服务中,会判断“先前的模式”--即请求该服务的程序运行的级别,以确定自己的行为。 “哪些code可以访问核心资源,哪些code不能访问核心资源”:涉及面过大,举两个例子。用户态程序不能访问系统空间内存----系统将该空间对应的页目录与页表中U/S清零,然后等着收页异常就是了(用户态访问时),这是利用硬件安全功能“守株待兔”,此位其一。 程序可否访问一个对象,系统的处理就是主动出击了:前面说过的“先前的模式”为核心态,不接受安全检查,pass;为用户态则检查其token及对象的ACL,行则pass。 |
|
上一页
下一页