使用ioremap对已经由驱动程序映射的物理地址有什么影响?

时间:2018-03-02 05:56:33

标签: linux-kernel arm linux-device-driver watchdog ioremap

我正在尝试使用ARM看门狗彻底的内核空间。我有一个监视器驱动程序,它是静态构建并部署在内核中的。驱动程序重新映射的内存可在/ 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.

此外,我能够成功读取和写入看门狗寄存器。

请告诉我,这个映射是否会对驱动程序的正常工作产生影响?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

仅在设备“内存”上进行另一个映射就不会在ARM上引起任何问题。但是,多个驱动程序访问/操纵相同的设备内存可能会导致设备故障和/或无法预测的行为。行为良好的驱动程序(例如原始的看门狗驱动程序)在ioremap()之前调用request_mem_region(),这将完全避免您遇到的此问题。

ARM Linux专家Russell King提到:“在ARM上,我们(可能)有很多情况,对于相同的物理地址空间,多次使用ioremap()。无论如何,首选的做法只是一个映射。