【问题标题】:What is the effect of using ioremap on physical address already ioremapped by a driver?对驱动程序已经 ioremap 的物理地址使用 ioremap 有什么影响?
【发布时间】:2018-03-02 05:56:32
【问题描述】:

我正在尝试通过内核空间使用 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.

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

请告诉我,这个映射对驱动的正常工作有影响吗?

提前感谢您的所有帮助。

【问题讨论】:

  • 简单地在设备“内存”上进行另一个映射应该不会在 ARM 上引起任何问题。但是多个驱动程序访问/操作同一设备内存可能会导致设备故障和/或不可预知的行为。行为良好的驱动程序(例如原始看门狗驱动程序)在 ioremap() 之前调用 request_mem_region(),这将完全避免您提出的这个问题。顺便说一句,您的代码确实完全符合内核编码风格。
  • 好的,感谢您的输入,有问题的驱动程序在此之前使用 devm_ioremap_resource() 和 platform_get_resource()。这样够安全吗?
  • 不,因为你误解了我写的内容。您的模块因违反驱动程序约定而表现不佳。只有当所有驱动程序(以及访问硬件的代码)都遵守约定时,它才是“安全”
  • 我有点困惑。我的模块不是驱动程序。我说的是最初映射内存区域的驱动程序使用上述函数进行映射。
  • 我在这里找到了一条评论,link,上面写着 如果您多次调用 ioremap(),您将只删除之前的映射设置。我。

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


【解决方案1】:

简单地在设备“内存”上进行另一个映射应该不会在 ARM 上引起任何问题。但是多个驱动程序访问/操作同一设备内存可能会导致设备故障和/或不可预知的行为。行为良好的驱动程序(例如原始看门狗驱动程序)在 ioremap() 之前调用 request_mem_region(),这将完全避免您提出的这个问题。

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

【讨论】:

  • 用不同的缓存属性重新 iomap 怎么样? (wc, wb, uc)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
  • 1970-01-01
  • 2012-02-29
  • 2012-06-11
相关资源
最近更新 更多