Linux:request_mem_region返回不可用的范围

我目前正在从2.6到3.16移植一个VME桥的内核模块

该设备能够将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()返回一个不可用的区域的成功,并且只为较新的内核做这个。 什么可能是这种行为的原因?