阅读:1498回复:9
很糊涂的问题,大家多指点。
几个问题:
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-28 12:33
多谢ysy
呵呵,大家继续讨论。 |
|
板凳#
发布于:2002-11-28 12:36
下面是pjf的解释。
------------------------------ 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-28 18:38
呵呵,真正弄清楚决非一件容易的事情。
也许很多人知道结论,但是不一定就清楚他真正的内部实现机制,也是个似懂非懂。 要想搞定,要自己专心研究,看书,查资料,讨论也是必不可少,也许一个提示就茅塞顿开。 continue. |
|
地下室#
发布于:2002-11-29 13:07
多谢了。
|
|