描述:
就是说,如果一样的话,在intel结构里pci io也是用in和out操作的了
解决方案1:
以下是在内核模式中对物理内存和I/O口读操作的一段例程的核心代码:
//把用户传来的ISA总线上的物理地址转变为NT系统所认可的物理地址
HalTranslateBusAddress( Isa, //总线类型PCI为1)
0,
PortAddress, //用户传来的需访问的物理地址
&MemType, //为0表示存储器,为1表示I/O口
&MappedAddress ); //被转换的物理地址
//存放设备特定状态信息的数据结构
pLocalInfo
=(PLOCAL—DEVICE—INFO)DeviceObject->
DeviceExtension;
if (MemType == 0) //意味着对存储器的操作
{
//映射为在内核中可读写的地址
pLocalInfo->PortBase
= MmMapIoSpace(MappedAddress, PortCount, FALSE);
*(PUCHAR)pIOBuffer = READ—REGISTER—UCHAR((PUCHAR)((ULONG) pLocalInfo->PortBas) );
}
else //MemType=1意味着对I/O口的操作
{
//系统所认可的I/O口地址即是映射到内核中的I/O口地址
pLocalInfo->PortBase
=(PVOID)MappedAddress.LowPart;
*(PUCHAR)pIOBuffer = READ—PORT—UCHAR
((PUCHAR)((ULONG) pLocalInfo->PortBase
+nPort));
}