登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

DOS编程技术

讨论在纯DOS下的编程技术

 
 
 

日志

 
 
关于我

1984年大学毕业,1985年底有机会开始接触PC机,1986年开始在PC机上做开发工作,曾接触过MS-DOS、CP/M、UNIX、VMS、LINUX、iRMX等众多的操作系统并在上面从事技术开发,擅长做底层与硬件相关的软件开发,目前主要在DOS和LINUX平台下工作,主要从事软件,在硬件开发上也有一定造诣,亦有在8051系列、6502系列(凌阳)、z80系列、ARM、X86等各类平台下开发软硬件的经历。更详细情况可以参考http://resume.whowin.net

DOS下驱动器参数块(DPB)  

2008-08-27 12:11:02|  分类: dos资料 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
     把这部分写在这里一个是方便自己查找,二是在写《从命令行加载设备驱动程序》一文中要用,这里写了,那里就不用交代了。
    驱动器参数块可以通过一个DOS功能调用获得,如下:
    调用前:AH=32H
            DL=驱动器号(00=缺省、01=A、02=B、03=C......)
            int 21h
    调用后:AL=00H 调用成功,DS:BX指向指定驱动器的DPB
               0FFH----非法的驱动器号
    驱动器参数块的结构如下:
    偏移    大小        描述
    -----------------------------------------------------
    00h     byte        驱动器号(00h=A:,01h=B:,等等)
    01h     byte        设备驱动程序内的单元号
    02h     word        每扇区字节数
    04h     byte        一簇之内的最高扇区号
    05h     byte        每簇扇区数(2的幂)
    06h     word        保留的扇区数
    08h     byte        FAT的数目
    09h     word        根目录登记项的总数
    0bh     word        文件区起始扇区号
    0dh     word        最高簇号(数据簇数+1)
    ---DOS 2.x--3.x
    0fh     byte        每个FAT的扇区数
    10h     word        第一个目录扇区的扇区号
    12h     dword       设备驱动程序标题地址
    16h     byte        介质ID字节
    17h     byte        介质更换标志
    18h     dword       指向下一个DPB的指针
    ---DOS 2.x
    1ch     word        包含当前目录起点的簇,0000h=根,0ffffh=未知
    1eh     64bytes     驱动器当前目录的ASCII路径名
    ---DOS 3.x
    1ch     word        写操作时开始搜索自由空间的簇
    1eh     word        驱动器中自有粗的个数,0ffffh=未知
    ---DOS 4.0--5.0
    0fh     word        每个FAT的扇区数
    11h     word        第一个目录扇区的扇区号
    13h     dword       设备驱动程序标题的地址
    17h     byte        介质ID字节
    18h     byte        00h,若已访问磁盘,0ffh,若未访问磁盘
    19h     dword       指向下一个DPB的指针
    1dh     word        写操作时开始搜索自由空间的簇
    1fh     word        驱动器中自由簇的个数,0ffffh=未知
    实际我们现在用的DOS很少有DOS 5.0以下的了,所以其DPB的结构如下:
    偏移    大小        描述
    -----------------------------------------------------
    00h     byte        驱动器号(00h=A:,01h=B:,等等)
    01h     byte        设备驱动程序内的单元号
    02h     word        每扇区字节数
    04h     byte        一簇之内的最高扇区号(起始扇区号为0)
    05h     byte        每簇扇区数(2的幂)
    06h     word        保留的扇区数
    08h     byte        FAT的数目
    09h     word        根目录登记项的总数
    0bh     word        文件区起始扇区号
    0dh     word        最高簇号(数据簇数+1)
    0fh     word        每个FAT的扇区数
    11h     word        第一个目录扇区的扇区号
    13h     dword       设备驱动程序标题的地址
    17h     byte        介质ID字节
    18h     byte        介质更换标志
    19h     dword       指向下一个DPB的指针
    1dh     word        写操作时开始搜索自由空间的簇
    1fh     word        驱动器中自由簇的个数,0ffffh=未知
    一共是33个字节,此经过我在DOS 6.22下验证无误。
    有几个概念需要说明一下:
  • 驱动器号号理解,实际上也就是块设备的编号,但下一个字节:设备驱动程序内的单元号,就要说明一下了。在一个设备驱动程序中可以同时驱动多个设备,比如IDE驱动可以在一个驱动程序中驱动两个软盘A和B,同时可以驱动硬盘,即便驱动一个硬盘,在这个硬盘上可能分成2个分区,那么这两个分区在逻辑上是两个设备,驱动器号分别是C和D,同时这四个设备在驱动程序内部被分为四个单元,分别为0、1、2、3,这就是单元号。这样说可能还是不太明白,因为IDE驱动总是第一个加载的设备驱动,所以单元号和驱动器号是重合的,我们再举一个RAM DISK的驱动程序,这个驱动程序可以驱动两个RAM DISK,那么这两个RAM DISK的驱动器号可能是E和F,但他们在驱动程序内部的单元号分别是0和1。
  • 偏移0dh的字段叫:最高簇号(数据簇数+1)。这里要注意的是按照规定文件区的簇号从2开始,所以最高簇号=簇数+1,至于为什么簇号从2开始,想不起来了,但是看起来并不重要。
  • 偏移17h字段:介质ID。硬盘:0F8H,360K软盘:0FDH,1.2M软盘:0F9H,RAM DISK:0FAH,U盘:也是0F8H。
  • 偏移18h字段:介质更换标志。0--未知更换,1--未更换,-1--已更换。
    下面是我的一个机器中的两个实际的DPB数据,大家可以把玩一下:
    这是我的C盘,一个硬盘的DPB:
    02 02 00 02 3f 06 01 00--02 00 02 21 02 e7 ff 00
    01 01 02 6b 00 70 00 f8--00 cd 13 1c 01 00 00 ff
    ff
    这是我的U盘的DPB数据:
    04 00 00 02 07 03 01 00--02 00 02 2d 00 9f 07 06
    00 0d 00 00 00 5b 0c f8--00 ff ff 00 00 00 00 99
    06
    DPB的数据是可以重建的,使用一个DOS调用:
    入口:AH=53H
          DS:SI  指向BIOS参数块(BPB)
          ES:BP  指向驱动器参数块(DPB)
          int 21h
    出口:在ES:BP处重建DPB
    由此可见,DPB是由BPB建立的,这个BPB有是个什么东东,其实我们在那篇《如何写DOS下的设备驱动程序(三)》中已经接触过,或者我会另外写一篇文章说这个东西,而这个BPB实际上是从磁盘上读出的,那么很显然这是在磁盘格式化时就建立好了的。
    本文所说的这个DPB实际我们用到的机会很少,它是供DOS内核使用的,在设备驱动程序的调用命令中,命令2是得到块设备的BPB,DOS内核当需要建立DPB时会通过这个命令调用设备驱动程序,从而得到BPB,进而使用上面说的DOS调用的53h功能建立DPB,DOS内核在实际读写磁盘时会使用它。我们介绍它,也是出于无奈,因为从它的结构看,它也是一个链结构,我要写一篇从DOS命令行加载设备驱动程序的文章,用以回避DOSUSB为我们带来的写U盘驱动程序的麻烦,但既然要加载设备驱动程序,我们就必须处理好这些乱七八糟的链,DPB就是其中之一。
  评论这张
 
阅读(2180)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018