hfyhl
驱动小牛
驱动小牛
  • 注册日期2002-11-08
  • 最后登录2005-10-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
20楼#
发布于:2002-11-23 13:11
你真行,我从教材上抄了一段下来
居然被你找到这么多错误,呵呵
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
21楼#
发布于:2002-11-23 13:50
我从教材上抄了一段下来
居然被你找到这么多错误,呵呵


哦?现在的教材啊,该改版了。呵呵
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
22楼#
发布于:2002-11-23 20:21
[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:


这段话在一本非常老的书上也有:Writing Windows VxDs and Device Drivers,第3章的开篇就是讲这个。而且除了CPL和IOPL之外,还有一个IOPM,要过了2关才可以执行。V86下的DOS,忽略IOPL。可能NT系统下有些不同。

中文版也有得卖,是孙喜明翻的。
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
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行为稍有区别。
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
24楼#
发布于:2002-11-24 09:38
2000下使用了虚拟86扩展,IO行为稍有区别。
(确切点说,是“敏感”指令行为有所区别。IO的不同主要因OS对#GP处理不同)
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
25楼#
发布于:2002-11-24 17:26
感谢pjf才行。
lu0
lu0
论坛版主
论坛版主
  • 注册日期2001-06-10
  • 最后登录2016-04-05
  • 粉丝2
  • 关注0
  • 积分-6311分
  • 威望21111点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
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发出.那么可以绕过一些安全检查.
Regards, Lu Lin Webmaster of Inside Programming http://www.lu0s1.com
grads
驱动牛犊
驱动牛犊
  • 注册日期2002-11-25
  • 最后登录2003-01-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
27楼#
发布于:2002-11-27 16:17
楼上很多人都说的很明白了,非常细节。
不过我的理解是这样的,只从os角度来说,系统代码都运行在r0级别,应用代码在r3级别上,用户应用进行受限操作时必须调用系统代码,所以操作系统只需要在用户应用调用系统代码前trap一下,从r3跳到r0就可以了,反之回到用户应用时也做相应操作。

参考“linux内核实习”小册子,上面只是我的理解,错了请re
sufeng
驱动牛犊
驱动牛犊
  • 注册日期2002-04-27
  • 最后登录2004-08-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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??
  
-------------------
有点罗嗦,但是确实很糊涂,希望得到大家的指点。  
  


  
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
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。
上一页 下一页
游客

返回顶部