Linux:request_mem_region返回不可用的范围

时间:2015-08-14 08:46:59

标签: linux module linux-kernel kernel pci

我目前正致力于将VME网桥的内核模块从2.6移植到3.16。

该设备能够将VME地址空间映射到PCI,其中映射到的地址范围可由驱动程序设置。所以内核模块首先尝试通过这样的循环来寻找地址空间中的可用区域

for (pciAddr=MEM_START; pciAddr<MEM_STOP; pciAddr+=STEP) {
  if (check_mem_region(pci_Addr, size)==0)
    break;
}
request_mem_region(pciAddr, size, modulename);

应改为

for (pciAddr=MEM_START; pciAddr<MEM_STOP; pciAddr+=STEP) {
  if (request_mem_region(pciAddr, size, modulename)!=0)
    break;
}

用于较新的内核。 这适用于2.6内核,但对于较新的3.16,两种变体都返回第一个区域(从MEM_START开始),但是此地址范围内的后续读取失败,总是返回0xff。

MEM_START定义为0x40000000,/ proc / iomem定义为

40000000-401fffff : PCI Bus 0000:01

在其中一行中。根据/ proc / iomem将MEM_START更改为另一个空闲地址时,一切正常。

所以似乎request_mem_region()为一个不可用的区域返回成功,并且仅对较新的内核执行此操作。这种行为可能是什么原因?

0 个答案:

没有答案