20楼#
发布于:2002-11-23 13:11
你真行,我从教材上抄了一段下来
居然被你找到这么多错误,呵呵 |
|
21楼#
发布于:2002-11-23 13:50
我从教材上抄了一段下来 哦?现在的教材啊,该改版了。呵呵 |
|
22楼#
发布于:2002-11-23 20:21
[quote] 这段话在一本非常老的书上也有:Writing Windows VxDs and Device Drivers,第3章的开篇就是讲这个。而且除了CPL和IOPL之外,还有一个IOPM,要过了2关才可以执行。V86下的DOS,忽略IOPL。可能NT系统下有些不同。 中文版也有得卖,是孙喜明翻的。 |
|
|
23楼#
发布于: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行为稍有区别。 |
|
24楼#
发布于:2002-11-24 09:38
2000下使用了虚拟86扩展,IO行为稍有区别。
(确切点说,是“敏感”指令行为有所区别。IO的不同主要因OS对#GP处理不同) |
|
25楼#
发布于:2002-11-24 17:26
感谢pjf才行。
|
|
26楼#
发布于: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发出.那么可以绕过一些安全检查. |
|
|
27楼#
发布于:2002-11-27 16:17
楼上很多人都说的很明白了,非常细节。
不过我的理解是这样的,只从os角度来说,系统代码都运行在r0级别,应用代码在r3级别上,用户应用进行受限操作时必须调用系统代码,所以操作系统只需要在用户应用调用系统代码前trap一下,从r3跳到r0就可以了,反之回到用户应用时也做相应操作。 参考“linux内核实习”小册子,上面只是我的理解,错了请re |
|
28楼#
发布于: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?? ------------------- 有点罗嗦,但是确实很糊涂,希望得到大家的指点。 |
|
29楼#
发布于: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。 |
|
上一页
下一页