如何获得计算机PCI总线的I/O端口地址

如何获得计算机PCI总线的I/O端口地址,第1张

PCI

Base

Address

1寄存器:系统利用此寄存器为PCI接口芯片的配置寄存器分配一段PCI地址空间,通过这段地址我们可以以I/O的形式访问PCI接口芯片的配置寄存器。

PCI

设备驱动程序要完成识别PCI器件、寻找PCI硬件的资源和对PCI器件中断的服务。在驱动程序初始化过程中,使用HalGetBusData()函数完成寻找PCI设备的工作。在初始化过程中,使用器件识别号(Device

ID)和厂商识别号(Vendor

ID),通过遍历总线上的所有设备,寻找到指定的PCI设备,并获取设备的总线号,器件号与功能号。通过这些配置信息,可以在系统中寻址该设备的资源配置列表。

在此之后,驱动程序需要从配置空间获取硬件的参数。PCI设备的中断号、端口地址的范围(I/O)方式、存储器的地址与映射方式等,都可以从硬件资源列表数据结构中获取。在Windows

NT中,调用HalAssignSlotResources()函数来获得指定设备的资源列表数据结构指针,然后通过遍历该列表中的所有资源描述符,获取该设备的I/O端口基地址与长度,中断的中断级、中断向量与模式,存储器基地址与长度等硬件资源数据。

//

遍历总线,获得指定设备的总线号,器件号与功能号

for

(

busNumber

=

0;

busNumber

<

MAX_PCI_BUSES;

busNumber++

)

{

for

(

deviceNumber

=

0;deviceNumber

<

PCI_MAX_DEVICES;deviceNumber++

)

{

slotNumberubitsDeviceNumber

=

deviceNumber;

for

(

functionNumber

=

0;

functionNumber

<

PCI_MAX_FUNCTION;

functionNumber++

)

{

slotNumberubitsFunctionNumber

=

functionNumber;

if

(!HalGetBusData(PCIConfiguration,

busNumber,

slotNumberuAsULONG,

&pciData,

sizeof(ULONG)

)

)

{

deviceNumber

=

PCI_MAX_DEVICES;

break;

}

if

(pciDataVendorID

==

PCI_INVALID_VENDORID

)

{

continue;

}

if

(

(

VendorId

!=

PCI_INVALID_VENDORID

)

&&

(

pciDataVendorID

!=

VendorId

||

pciDataDeviceID

!=

DeviceId

))

{

continue;

}

pPciDeviceLocation->BusNumber

=

busNumber;

pPciDeviceLocation->SlotNumber

=

slotNumber;

pPciDeviceLocation

=

&PciDeviceList->List[++count];

status

=

STATUS_SUCCESS;

}

}

}

每个变量都在内存中有唯一的地址,但是VB是不支持直接寻址的语言,你无法在VB的框架内直接对内存地址进行 *** 作。

这并不代表VB是较差或者较不完善的语言,这是为了便于快速编程而付出的必要代价。

事实上,正是因为所有的内存 *** 作全都由VB“代劳”了,VB才会比VC等语言错误更少。

以上就是关于如何获得计算机PCI总线的I&#47;O端口地址全部的内容,包括:如何获得计算机PCI总线的I&#47;O端口地址、任何程序每个控件都有内存基址吗、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9751504.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存