对已由驱动程序 iore 映射的物理地址使用 ioremap 有什么影响?
What is the effect of using ioremap on physical address already ioremapped by a driver?
我正在尝试使用 ARM 看门狗彻底内核 space。我有一个静态构建并部署在内核中的看门狗驱动程序。在/proc/iomem.
中可以看到驱动程序重新映射的内存
cat /proc/iomem | grep wdt
ff567000-ff567018 : /wdt@ff567000
驱动程序已将从 0xff567000 开始的地址重新映射到内核中的虚拟地址。
现在我写了一个模块来ioremap相同的地址并写入它。
static int __init wdt_init(void)
{
int ret;
wdev = kzalloc(sizeof(*wdev), GFP_KERNEL);
if (!wdev)
return -ENOMEM;
mutex_init(&wdev->lock);
printk(KERN_INFO "before mapping %p.\n", wdev->base);
wdev->base = ioremap (0xff567000, 0x18);
if (!wdev->base)
{
ret = -ENOMEM;
goto fail;
}
printk(KERN_INFO "wdt base address successfully mapped to %p.\n", wdev->base);
wdt_start(wdev);
wdt_get_timeout (wdev);
wdt_set_timeout (wdev, 30);
wdt_get_timeout (wdev);
while (1)
{
wdt_ping(wdev);
}
return 0;
fail:
printk(KERN_INFO "failed to map wdt base address\n");
return ret;
}
插入模块后看到的输出是:
root@bdk:/opt# insmod test_ioremap.ko
[ 1770.862628] before mapping (null).
[ 1770.867477] VXR10 wdt base address successfully mapped to f0988000.
此外,我能够成功读写看门狗寄存器。
请问这个映射对驱动的正常工作有影响吗?
提前感谢您的帮助。
只需在设备 "memory" 上进行另一个映射就不会在 ARM 上造成任何问题。但是多个驱动程序 accessing/manipulating 相同的设备内存可能会导致设备故障 and/or 不可预测的行为。行为良好的驱动程序(例如原始的 watchdog 驱动程序)在 ioremap() 之前调用 request_mem_region(),这将完全避免您提出的这个问题。
Russell King,ARM Linux 大师提到 "On ARM, we (probably) have a lot of cases where ioremap() is used multiple times for the same physical address space." 不管怎样,首选的做法是只有一个映射。
我正在尝试使用 ARM 看门狗彻底内核 space。我有一个静态构建并部署在内核中的看门狗驱动程序。在/proc/iomem.
中可以看到驱动程序重新映射的内存cat /proc/iomem | grep wdt
ff567000-ff567018 : /wdt@ff567000
驱动程序已将从 0xff567000 开始的地址重新映射到内核中的虚拟地址。
现在我写了一个模块来ioremap相同的地址并写入它。
static int __init wdt_init(void)
{
int ret;
wdev = kzalloc(sizeof(*wdev), GFP_KERNEL);
if (!wdev)
return -ENOMEM;
mutex_init(&wdev->lock);
printk(KERN_INFO "before mapping %p.\n", wdev->base);
wdev->base = ioremap (0xff567000, 0x18);
if (!wdev->base)
{
ret = -ENOMEM;
goto fail;
}
printk(KERN_INFO "wdt base address successfully mapped to %p.\n", wdev->base);
wdt_start(wdev);
wdt_get_timeout (wdev);
wdt_set_timeout (wdev, 30);
wdt_get_timeout (wdev);
while (1)
{
wdt_ping(wdev);
}
return 0;
fail:
printk(KERN_INFO "failed to map wdt base address\n");
return ret;
}
插入模块后看到的输出是:
root@bdk:/opt# insmod test_ioremap.ko
[ 1770.862628] before mapping (null).
[ 1770.867477] VXR10 wdt base address successfully mapped to f0988000.
此外,我能够成功读写看门狗寄存器。
请问这个映射对驱动的正常工作有影响吗?
提前感谢您的帮助。
只需在设备 "memory" 上进行另一个映射就不会在 ARM 上造成任何问题。但是多个驱动程序 accessing/manipulating 相同的设备内存可能会导致设备故障 and/or 不可预测的行为。行为良好的驱动程序(例如原始的 watchdog 驱动程序)在 ioremap() 之前调用 request_mem_region(),这将完全避免您提出的这个问题。
Russell King,ARM Linux 大师提到 "On ARM, we (probably) have a lot of cases where ioremap() is used multiple times for the same physical address space." 不管怎样,首选的做法是只有一个映射。