Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:2606回复:21

VxD && WDM && 保护模式 && 实模式 && I/O

楼主#
更多 发布于:2002-03-21 14:29
    今日偶有一朋友问我这样一个问题,他说:\"驱动程序应该是运行是实模式下的,只有这样才能和硬件打交道。在保护模式下是不允许直接访问硬件的\"。
    我当即表示厄然,但旋即一想,记得曾经看过关于VXD的书中有这么一说:\"VxD运行于Ring0级,当它需要作实际的硬件I/O时,便切换到实模式,将将有关的数据拷内部到低端内存区以便实模式下处理器能访问到。当硬件I/O完成以后,VXD自身又切换到保护模式。\"但是在WDM 中,当驱动程序需要进行直接的真正的硬件操作的时候,一般都是调用HAL宏,至于HAL是运行于哪种模式好象从来没有哪里见到过。
    我个人认为:保护模式与实模式是处理机(CPU)的性质,而不是操作系统的性质,就象内存分页。操作系统籍由这个硬件的性质才有可能实现多任务,多进程、多线程等并行作业。保护模式下的代码都有一个CPL和RPL,好象处理机是根据这两个权限级来判断当前的代码是否是顺利执行还是引起处理机异常。所以我认为其所说并不是正确的。但自己心中也是悬乎乎的。
    于是本着学求甚解的态度,将这个疑惑张贴出来,以求各位兄弟出手,解此一惑。

最新喜欢:

zackaryzackar... flyajiflyaji
Tom_lyd
Snare
驱动小牛
驱动小牛
  • 注册日期2002-01-31
  • 最后登录2002-08-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-03-21 18:57
关注!
谁来解惑??
我就是我,没什么可说的。
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-03-21 19:45
老兄,你把模式和能否IO弄混了。
在Windows里,所有进程(包括driver)都是在保护模式工作下。如果总在实模式和保护模式换来换去,1,效率极低,2,系统会崩溃。
至于hal,它当然工作在保护模式了,其实我们可以不用它,在WDM里,我们处于ring 0,可以为所欲为,in,out指令(汇编指令,非C函数)随便用。
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
flyfox
驱动中牛
驱动中牛
  • 注册日期2001-04-05
  • 最后登录2012-08-03
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望22点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-03-22 09:28
所谓实模式、保护模式是指操作系统分不分RING0、3层!
所以所谓“驱动程序应该是运行是实模式下的”是错误的,它应该是“在0层”就OK!
另外,HAL是NT系统才有的!与VXD(WDM我不清楚)无关!
一剑西来,天外飞仙
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-03-22 09:48
    保护模式应该是针对于CPU来说的,不是针对于操作系统来说的。自从诞生80286处理器以后,保护模式的支持就被支持,而自80386以来,32位的程序逐渐替代了16位的程序;至于ring x,那纯粹是Windows的概念,DOS中无这个概念,但是DOS也可以运行保护模式的程序。这些概念是从清华大学出版社的一本《80x86汇编语言程序设计》(具体名字可能有出入)中获得的,应该没有错误。
    另外,DDK中也有说,VxD执行OS系统调的时候,还是利用了DOS提供的中断服务,但是DOS中断服务是运行于实模式下的,因此处理器就把自己先切换到实模式进行Int21调用,完成后再切换回保护模式。同样的说法也在孙喜明译的《Windows VxD与设备驱动程序设计指南》(中国电力出版社出版)一书中有说。
     HAL是不过是一些宏的集合,目的是为了良好的平台兼容性和可移植性,程序运行到这里应该模式问题已经确定了,要不兼容问题可不好解决啊。
    
     谢谢楼上的各位兄弟回答,不过小弟对于Windows2000下的真实硬件I/O是运行于何种模式?有无对Int21h的调用等问题还有待于揭开谜团,欢迎大家继续关注!
Tom_lyd
flyfox
驱动中牛
驱动中牛
  • 注册日期2001-04-05
  • 最后登录2012-08-03
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望22点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-03-22 10:45
所谓实模式、保护模式是指X86提供的RING0-,3层而操作系统分不分RING0、3层才是关键,就象DOS即使在PII上也是实模式!WIN95后都是保护模式。
所以所谓“驱动程序应该是运行是实模式下的”是错误的,它是“在0层”就OK!
另外,HAL是NT系统才有的!与VXD(WDM我不清楚)无关!
一剑西来,天外飞仙
liming
驱动牛犊
驱动牛犊
  • 注册日期2001-06-12
  • 最后登录2010-02-21
  • 粉丝0
  • 关注0
  • 积分116分
  • 威望12点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-03-22 11:23
cpu是有0-3特权级的,对应ring0-ring3.请参见保护模式编程方面的书,你就明白了.
chimian
驱动牛犊
驱动牛犊
  • 注册日期2002-02-10
  • 最后登录2002-04-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-03-23 03:46
以下是你的帖子的引用:

记得曾经看过关于 VXD 的书中有这么一说:\" VxD 运行于 Ring 0 级,当它需要作实际的硬件 I/O 时,便切换到实模式,将将有关的数据拷内部到低端内存区以便实模式下处理器能访问到。当硬件 I/O 完成以后,VXD 自身又切换到保护模式。\"

另外, DDK 中也有说, VxD 执行 OS 系统调的时候,还是利用了 DOS 提供的中断服务,但是 DOS 中断服务是运行于实模式下的,因此处理器就把自己先切换到实模式进行 Int21 调用,完成后再切换回保护模式。同样的说法也在孙喜明译的《 Windows VxD 与设备驱动程序设计指南》(中国电力出版社出版)一书中有说。

我认为以上观点全部错误.

    在保护模式下, 什么都是新的, 就别考虑什么 bios 和 dos 了.

    一开机时, 系统 bios 就在内存中构造好了一个中断向量表, 为机器最基本的设备提供驱动程序支持. 可是后来其中一部分中断被 dos 替换, 来实现 dos 特有的功能.

    bios 是工作在实模式下. dos 的核心是实模式, 但是也能运行保护模式的程序. dos 下的大部分保护模式程序以及 windows 3.x 才是你说的那样, 在实模式与保护模式之间换来换去. 因为给它们提供底层支持的, 最终大部分还是实模式的 bios 和 dos  .

    在进入 windows 98 等纯保护模式操作系统后, bios 和 dos 的东西已经一点也不存在了. windows 98 等保护模式操作系统自己重写了所有的面向硬件的驱动程序, 根本一点也用不着 bios 和 dos 的东西. 当然也用不着在保护模式和实模式之间换来换去. 不过 windows 9x 的核心代码是在 32 位保护模式与 16 位保护模式之间换来换去. 为其提供底层支持的, 还是 windows 9x 等操作系统的保护模式的代码( 32 位或 16 位保护模式驱动程序), 而不是 bios 和 dos . windows 9x 下的 vxd 文件里边也可以含有 32 位代码, 也可以含有 16 位代码, 不过除了静态 vxd 在操作系统启动时执行的实模式初始化代码外, 其余全是保护模式代码.  vxd 在 windows 9x 下, 也不可能在操作系统启动后, 还在保护模式与实模式之间换来换去. 这时 bios 和 dos 也就起了个启动机器的作用. windows 98 等操作系统在启动时也可能在检测硬件配置时参考一下 bios 和 dos 的硬件配置, 仅此而已.

    windows 98 等操作系统下所谓的 dos 窗口, 是模拟出来的. 它也可能是保护模式( 32 位或 16 位), 也可能是虚拟 8086 模式, 但绝对不是实模式. 为其提供底层支持的, 还是 windows 98 等操作系统的保护模式的代码( 32 位或 16 位), 而不是 bios 和 dos .

    如果有错误请指出.






 
skykufo
驱动牛犊
驱动牛犊
  • 注册日期2001-10-23
  • 最后登录2003-03-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-03-23 11:05
但bios也有32位的代码,可工作在保护模式下呀(我记得<<pic
系统结构>>有这样说的)。所以98以上系统无调用bios代码我感
到怀疑,毕竟bios是主板商提供的,它知道硬件系统的具体结构,
如有什么总线,桥等。我不明白ms到底在保护模式下用不用32位
bios;如果它是完全独立于bios,它用不用重新扫描总线,以发现
所有设备;如果得扫描,又不用bios,它如何扫描出一切,如pci
总线可能是多总线结构,它不知道总线结构,是否只扫描几条,
而不是扫描所有可能256条。
总之,希望大虾们说明一下保护模式用不用bios,刚从实模式转到
保护模式这个“政权交接”开始后98以上系统要主要做什么工作
(如是否从实模式继承什么数据从而知道系统结构)
thx.
探索者
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-03-23 11:32
    chimian兄弟的观点触及了很多本质问题,其中的许多说法在有关书中有提到过,不过在整个阐述中,我认为有几大疑点:
    1.在Win2000及以后的操作系统中,到底有没有实模式(不是V86,而是真正的实模式),如果有的话,存在于什么时候?
    2.skykufo兄弟说得很对,BIOS是对硬件最了解的家伙,MS再聪明也不至于知道包括Interl在内各大硬件厂商的技术细节,加上新的硬件日新月异。所以说Windows已经不依赖于BIOS和DOS(除了系统启动的时候)似乎很难从逻辑上说过去,也很难令人信服。
    3.如果OS仍然依赖于BIOS,而BIOS大多执行的都是特权敏感指令。那么系统在调用BIOS服务的时候,存不存在模式切换问题?我记得书上有说,BIOS数据在系统启动的时候已被映射到系统内存空间,那可否可以这样理解:BIOS已经成了OS内核的一部分,它所执行的任何特权级指令不会引起CPU异常。
    4.另外一个疑问是,BIOS的版本大多是16位的(不知道现在的BIOS是否已经是32位),那么如果OS依赖于BIOS,则调用16位的BIOS的时候如何处理?
    5.如果Windows在启动成功以后完全不依赖于BIOS,则上述疑问全部不存在。
Tom_lyd
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-03-23 12:03
1,Bios只是固化在ROM里的程序,和放在硬盘上随时运行的程序没什么本质区别。
2,实模式确实存在,只存在于Window刚开始引导的时候,那时不管是谁,都要在实模式下运行,这是X86规定的。但Windows转入保护模式以后,就没有实模式了。
3,真正的Win32(不是Win95)中,根本不用Bios的调用了
4,Bios还是16位实模式的
5,Bios在启动时候当然有用,比如它可以扫描PCI总线等等。
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
skykufo
驱动牛犊
驱动牛犊
  • 注册日期2001-10-23
  • 最后登录2003-03-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-03-23 12:29
我查了mindshare出版的<<pci系统结果>>,第26章说明pci bios 2.1
规定可以有32位bios代码(我不知是否一定要实现),int 1ah只能调用
16位的pci bios,32位要通过另外方式调用,但的确有32位bios代码的
探索者
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-03-23 12:32
Sorry,我弄错了。是可以有32位代码,但好像Bios只能在实模式下运行。
我查了mindshare出版的<<pci系统结果>>,第26章说明pci bios 2.1
规定可以有32位bios代码(我不知是否一定要实现),int 1ah只能调用
16位的pci bios,32位要通过另外方式调用,但的确有32位bios代码的
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
skykufo
驱动牛犊
驱动牛犊
  • 注册日期2001-10-23
  • 最后登录2003-03-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-03-23 12:51
32位的代码,就要分段(把flat模式也看成分段的一种特殊形式),分页,这在实模式是不可能的。既然是32位bios代码,那它就要分段,分页,就不可能在实模式工作,自然要在保护模式工作。如果
bios代码只能在实模式工作,那32位的bios代码还有什么用?
探索者
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-03-23 12:54
老兄,你理解错了,32位和什么模式没有绝对关系。虽然我只是认为Bios工作在实模式,但不是很肯定。但我能肯定的是实模式下也能有32位代码。“mov eax,[ebp+100h]\"在实模式下一样可以执行,不信你可以试试。

32位的代码,就要分段(把flat模式也看成分段的一种特殊形式),分页,这在实模式是不可能的。既然是32位bios代码,那它就要分段,分页,就不可能在实模式工作,自然要在保护模式工作。如果
bios代码只能在实模式工作,那32位的bios代码还有什么用?
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-03-23 13:05
To lov1999:
老兄,你理解错了,32位和什么模式没有绝对关系。虽然我只是认为Bios工作在实模式,但不是很肯定。但我能肯定的是实模式下也能有32位代码。“mov eax,[ebp+100h]\"在实模式下一样可以执行,不信你可以试试。

\"mov eax,[ebp+100h]\"并不代表32位代码,而是用mov指令传递了一个32位的数据,它在实模式下可以是因为CPU自身的支持。实模式下,只有16根地址线有效,能寻址最大范围为1M,不能执行32位代码。
如欲在实模式下使用386指令必须作如下声明,否则就会出错:
.386
code segment para use16
或者
.model small
.386
.code
Tom_lyd
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-03-23 13:10
没错,要真正实现32位代码,只有保护模式才能发挥威力,实模式下即使有32位代码也没用。
To lov1999:
\"mov eax,[ebp+100h]\"并不代表32位代码,而是用mov指令传递了一个32位的数据,它在实模式下可以是因为CPU自身的支持。实模式下,只有16根地址线有效,能寻址最大范围为1M,不能执行32位代码。
如欲在实模式下使用386指令必须作如下声明,否则就会出错:
.386
code segment para use16
或者
.model small
.386
.code
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
skykufo
驱动牛犊
驱动牛犊
  • 注册日期2001-10-23
  • 最后登录2003-03-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-03-23 13:43
不知道bios规范是由什么组织制定的,ieee or iso?
看来得到它们的网站看看。
探索者
chimian
驱动牛犊
驱动牛犊
  • 注册日期2002-02-10
  • 最后登录2002-04-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-03-23 15:02
以下是你的帖子的引用:

2. skykufo 兄弟说得很对, BIOS 是对硬件最了解的家伙, 微软再聪明也不至于知道包括 Intel 在内各大硬件厂商的技术细节,加上新的硬件日新月异。所以说 Windows 已经不依赖于 BIOS 和 DOS(除了系统启动的时候)似乎很难从逻辑上说过去,也很难令人信服。


    我认为这样说欠妥.

    其实不研究操作系统核心的人也会明白, windows 98 等操作系统对硬件的支持要远远强于系统 bios . 比如, 我的微机的系统 bios 在引导机器成功, 还没有引导 dos 操作系统时, 光驱, 鼠标, 声卡, 游戏柄, 网卡等等硬件都不可用, 显示卡的功能也发挥不出来. 这是因为系统 bios 只是提供了最基本的硬件驱动程序. 只是用来启动机器罢了.
凭什么说它是对硬件最了解的家伙?!

    其实 windows 98 等操作系统的驱动程序分两种: 一是象系统 bios 一样, 仅支持基本硬件的驱动程序, 这些有可能是微软自己编写的. 而其余绝大部分驱动程序, 是由硬件生产厂家提供, 后经微软认证的. 或者由硬件生产厂家会同微软共同开发. 这就是为什么 windows 98 等操作系统对硬件的支持远远强于系统 bios 的原因. 况且由于系统 bios 的容量, 写入方法等特性限制, 升级系统 bios 比升级操作系统的驱动程序要危险的多, 困难的多. 升级上如此不便, 所以它不可能在支持硬件上超过 windows 98 等操作系统.

    windows 98 等操作系统下的 dos 程序在 ring 3 级上好象是调用了 bios 或 dos 的中断, 其实你用 softice 等系统级调试器追踪一下, 不难发现, 其在转入 ring 0 级后, 还是转到操作系统的保护模式核心中去了.


    如果你有空, 可以把 windows 98 等操作系统为各个硬件编写的驱动程序反汇编, 研究一下, 就会明白其中的细节了. 如果你以前研究过系统 bios 的代码, 你会发现, windows 98 等操作系统的硬件驱动程序与系统 bios 的硬件驱动程序很相似. 其实就是重写了一个保护模式下的系统 bios , 不过增加了更多硬件, 更多功能.

    其实 windows 和 dos 及其他操作系统一样, 你别看它文件多, 其实大部分都是相互调用来调用去. 研究系统核心, 只要你把它的那些驱动程序反汇编, 研究一下, 就大体熟悉它的核心了, windows 的 99% 的文件都不用管它.  只要你懂得硬件, 会用 in , out 指令编程, 研究过 bios 的代码, 再学点保护模式,  我想你用不了几天也会大体熟悉了 windows 的核心. 到了硬件层次上, 任何操作系统都与 bios 的代码相似. 包括 dos , windows 等等. 不过要是想十分精通系统核心, 作个大师级的人物, 的确不是一天两天的功夫.

    我现在正在研究呢. 我也是个菜鸟.    欢迎多多指教.






squirrel
驱动牛犊
驱动牛犊
  • 注册日期2002-03-16
  • 最后登录2002-08-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-03-23 20:54
请大家注意几点,
1。程序是以汇编的最终形式来执行
2。保护模式是对内存、I/O口等的保护,只是假象中的大内存的实现
   手法
3。操作系统只是运用了cpu具有的保护机制来实现系统的保护模式,
   以及多任务处理等特征
上一页
游客

返回顶部