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/O端口地址全部的内容,包括:如何获得计算机PCI总线的I/O端口地址、任何程序每个控件都有内存基址吗、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)