访问特定的PCI功能设备的配置空间一般分为以下几个步骤:

首先,按照端口0xCF8的信息格式,组成相应的配置字,写入端口OxCF8中。然后通过读取端口0xCFC,得到每个功能设备配置空问中相应的寄存器内容。接着,由读出的配置空间中设备ID和制造商ID与指定的功能设备的设备ID和制造商ID相比较。若不匹配则重复进行上述操作直到匹配为止。最后,由获得的相应的总线号、设备号以及功能号,通过读写端口OxCF8和0xCFC就可以访问特定板卡的配置空间了。

下面给出一个通过PCI配置寄存器0xCF8和OxCFC来查找特定PCI板卡的函数。程序采用BC++3.1编写,PCI接口芯片采用PLX公司的PCI9052,设备ID为0x9050,制造商ID为Ox10B5,使用寄存器号为0x00。由于BCC+ 3.1中不提供一次读写32 bit数据的端口函数,故用嵌入汇编的方法编写了两个32 bit读写数据的函数outpd(),inpd()。

int scan_pci()

{

bus=0;device=0; //bus为总线号、device为设备号

for(char i=O;i<5;i++)

{

for(char j=O;j<32;j++)

{

bus=I;device=j;

port_in=Ox80000000+bus*0x10000十(device*8)*0x100l; //组成配置字

outpd(Oxcf8,port_in); //写配置字蓟配置地址寄存器0xCF8

port_out=inpd(Oxcfc);//读取配置数据寄存器0xCFC

if(port_out==Ox905010b5);//配置寄存器中设备ID和制造商ID是否与PCI设备的相符

return 0;//找到PCI设备

}

}

return一1; //未找到PCI设备

}

方法二,通过BIOS中断来进行访问。中断号为0xlA,所用到的子功能号为0xB102(查找设备)和0xB10A(读设备配置空间)。通过调用子功能0xBl02查找设备的总线号,设备号和功能号,然后根据相应的寄存器号,通过调用子功能0xBlOA读取相应的配置信息,从而完成配置空间

的访问。

2.2 局部空间的访问

在完成对PCI设备配置空间的访问之后,可以得到PCI设备I/O映射或内存映射的基地址,通过这个基地址就可以对PCI设备的局部空间进行访问。

(1) 通过I/O映射的方式进行访问的方法

在DOS下,由于系统未对计算机端口的访问做出任何限制,所以可以使用一般的I/O指令或函数,如BC++3.1中的inportb和outportb等,来进行I/O端口的读写。这些操作方便简单,在一般的场合可以很好地满足要求,但是由于x86系列I/O空间最大为64K,其中有一部分为系统占用或保留,一部分为其他板卡所占用,剩下的空间有限,若PCI设备需要大量映射数据,则需要采用内存映射的方式。

(2) 通过内存映射的方式进行访问的方法

在一般情况下,都是在DOS实模式下开发应用程序的,这样不能有效的应用内存资源,只能对1 MB以内的常规内存进行访问,然而PCI设备的内存映射又是由系统自动完成的,既可能映射在1 MB以内,也可能映射到1 MB以外。采用一般实模式的访问方法就存在着一定的局限性,为了克服这种局限性,可以通过在DOS程序中嵌人保护模式程序段的方法,完成在DOS实模式下对4 GB内存空间的直接访问。

为了完成在DOS实模式下对4 GB内存空间的直接访问,有必要深入了解DOS的实模式、保护模式以及在这2种模式下的寻址方式。在DOS实模式下,可以通过执行类似“MOV AX,[ESI]”的指令,来进行间接寻址操作访问内存空间,但由于ESI的内容必须在0~FFFFH范围内,使其寻址范围受到了限制。要扩大其寻址范围就必须扩大段描述符高速缓冲寄存器中的界限值。但CPU在实模式下不能改变这些界限值。必须在保护模式下完成该操作。因此必须从实模式切换到保护模式中,通过向相应的段寄存器写入相应的选择字SEL,装载由SEL对应的具有4 GB界限的段描述符到段描述符高速缓冲寄存器中去,然后返回到实模式下,由于段描述符高速缓冲寄存器的内容不发生变化,CPU就可以通过32 bit寄存器间接寻址操作来实现4GB内存的访问。

下面给出了进出保护模式,设置4 GB段界限的子函数,使用BC++3.1中嵌入汇编的方式编写。在主程序中调用这个子函数后,就可以用间接寻址操作来实现4 GB内存的访问了。

unsigned long GDT_Table[]= //全局描述符表GDT

{0,O, //选择字0h,NULL,保护模式下系统要求

Ox0000FFFF,0x008F9200};//选择宇8H,基址0,界限值4G-1

unsigned char GDT_Addr[6]={0};//存放GDT的基地址和长度

void LoadDSLimit4G()

{

Asm{

cli //清中断

push ds //将DS压人堆栈

push es //将ES压入堆栈

mov word ptr GDT_Addr[0],(2*8-1)//存入GDT的长度

mov eax,dsshl eax,4 //段地址左移4 b

mov ebx,0 //ebx清零

mov bx,offset GDT_Table //GDT的偏移地址

add eax,ebx //GDT的线性地址

mov dword ptr GDT_Addr[2],eax //存人GDT的线性地址

1gdt fword ptr GDT_Addr //重新调入GDT

mov bx,8 //设置数据段描述符的选择字

mov eax,cr0 //取出cr0寄存器的值

or eax,1

mov cr0,eax //进入保护模式

mov es,bx //ES重载数据段描述符

mov ds,bx // ES重载数据段描述符

and eax,0fffffffeh

mov crO,eax //返回实模式

pop es

pop ds

sti //开中断

}

}

3 结语

我们开发了一种基于PCI总线的GPS同步时标卡。该卡的PCI接口部分采用PLX公司的PCI9052接口芯片。该卡使用了PCI9052的局部地址空间0,采用内存映射方式,分配了2K地址空间,可映射于内存空间的任何地方。该卡应用在电力系统故障录波采集站中,采集站采用的是D0S6.22操作系统。当电力系统发生故障时,采用本文介绍的方法,录波装置可从PCI板卡上读取200 us的时间刻度作为故障发生的精确时刻。

DOS操作系统下PCI板卡访问方法(二)相关推荐

  1. Linux操作系统下共享文件夹设置方法介绍

    Linux操作系统下共享文件夹设置方法介绍    首先要在系统上安装samba模块 sudo apt-get install samba sudo apt-get install smbfs 下面我们 ...

  2. 小米路由器硬盘文件怎么用电脑访问 方法二

    小米路由器硬盘文件怎么用电脑访问 方法二 如果没有安装小米路由器PC客户端的话,也是可以访问的,我们可以使用映射网络驱动器的方法,打开计算机(我的电脑),选择工具-->映射网络驱动器,如下图 选 ...

  3. PullScrollView详解(五)——完全使用listview实现下拉回弹(方法二)

    前言:当你感到不舒服的时候就是成长的时候.入职阿里时学长跟我说的这句话,一直记得.到死时,人们往往不会因为自己做过什么而后悔,而常常会因为没做什么而后悔.趁你还有激情,加油! 相关文章: 1.< ...

  4. dos环境下mysql的访问_MYSQL dos环境下使用

    有很多朋友虽然安装好了mysql但却不知如何使用它.在这篇文章中我们就从连接MYSQL.修改密码.增加用户等方面来学习一些MYSQL的常用命令.一.连接MYSQL.格式: mysql -h主机地址 - ...

  5. Linux操作系统下软件的安装方法大全

    一.rpm包安装方式步骤: 1.找到相应的软件包,比如soft.version.rpm,下载到本机某个目录: 2.打开一个终端,su -成root用户: 3.cd soft.version.rpm所在 ...

  6. 如何在多域下安装Exchang服务方法(二)

    说明:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />    D ...

  7. linux怎样将文件夹设置共享,Linux操作系统下共享文件夹设置方法介绍

    首先当然是要安装samba了,呵呵: sudo apt-get install samba sudo apt-get install smbfs 下面我们来共享群组可读写文件夹,假设你要共享的文件夹为 ...

  8. Windows和Linux操作系统下关闭nginx的方法

    Nginx关闭方法 Windows中关闭nginx: Linux中关闭nginx: Windows中关闭nginx: 第一种: nginx -s stop 或者 nginx -s quit (1)这两 ...

  9. linux 下载 驱动怎么安装教程,Linux操作系统下显卡驱动安装方法步骤

    Linux下安装显卡驱动 第一步:下载一个for Linux版的显卡驱动,我下的NVIDIA-Linux-x86-173.08-pkg1.run我的内核是2.6.18-53.el5 第二步:如果查出你 ...

最新文章

  1. NSDateFormatter 时间格式转换
  2. 英文版windows乱码问题(win7/8/10)
  3. 小白学python,零基础学Python难不难?
  4. 亚马逊生鲜的产品质疑!国外设计师怎么分析用户体验(中英图文对照版)
  5. layui表格合并单元格多表_layui动态表格之合并单元格
  6. Acwing 309. 装饰围栏
  7. 【总结整理】写给非技术产品经理的技术能力要求----摘自《人人都是产品经理》...
  8. Assimp Android 编译
  9. CSS cursor鼠标样式一览表
  10. makefile编写模板
  11. 英特尔AI顾问“穿越星际”守护宇航员健康
  12. nuc8i7beh黑苹果_Intel NUC8i7BEH 黑苹果Hackintosh EFI引导
  13. 《关键对话——何谓关键对话》读书笔记(一)
  14. EXCEL取小数点数值
  15. 随感 | 毕设风雨 | 前端之路 | 暗夜与旅人 | 早槐与龙鲤
  16. Python和Pycharm运行环境有关问题详解
  17. c语言txt文件写入数学,文本文件输入文件.txt中存有一个学生的学号,性别,年龄,数学,语文,英语三门课的成绩....
  18. 【大学物理·恒定电流的磁场】磁场对载流导线的作用
  19. c语言s10 是什么意思啊,【S10】A.FortunatelyB.ComparativelyC.ConsequentlyD.Conversely - 试题答案网问答...
  20. 将新的驱动源文件添加进android内核进行编译

热门文章

  1. 小议场效应管的驱动电路
  2. 神州数码c语言笔试题,2016年计算机笔试考试题及答案
  3. ibm 服务器 维护教学,IBMPC服务器培训讲义教案.doc
  4. 英特尔傲腾,让数据管理不再纠结
  5. c语言 截止频率6低通滤波器,C语言 低通滤波器带通滤波器高通滤波器.doc
  6. macos双系统 wintogo_我的 WinToGo 踩坑指南
  7. 如何保证APP兼容性覆盖测试
  8. 在Windows 2008/2012/2016 上安装 Intel I217-V/I218-V网卡驱动
  9. 知识变现海哥:知识付费如何让你躺着赚钱
  10. 2021年陕西省大学生程序设计竞赛(重现赛)