2017-09-06 28 views
0

我写一个司机D1,将调用request_mem_region()和ioremap的(),和一个驱动器D2,将调用的ioremap()具有相同的地址。
在这种情况下会发生什么?分割地图调用两台Linux设备驱动程序

+2

*“在这种情况下会发生什么?”* - 您将有意识地编写不符合内核约定的驱动程序。否则系统可能会按预期运行。这是糟糕的代码组织;代码的作品,但那些不得不维护它的人受苦。 – sawdust

回答

0

这两个驱动程序都能按预期工作,但建议在ioremap()之前使用request_mem_region()以避免其他驱动程序写入该物理内存区域。

request_mem_region告诉你的驱动程序将使用此范围内的I/O地址,这将妨碍其它驱动程序,使通过request_mem_region任何重叠调用同一区域的内核。

这种机制不会做任何类型的映射,它是一种纯粹的保留机制,它依赖于所有内核设备驱动程序都必须很好的事实,并且它们必须调用request_mem_region,检查返回值,并在出现问题时正常运行的错误。

因此,您的代码在没有request_mem_region()的情况下工作是完全合乎逻辑的。

+0

感谢您的回复,我的疑问是在d1我将调用request_mem_region和ioremap,在d2上我只会调用ioremap,因为d1已经隐藏了范围,可以通过d2的ioremap获得已经锁定的相同物理地址的虚拟地址d1 – anikhan

+0

@anikhan我也有同样的情况,在我的情况下,第二个驱动程序中的ioremap()工作正常,并且能够读取和写入该虚拟地址,您是否发现您的驱动程序有任何问题? – Ash