代码之家  ›  专栏  ›  技术社区  ›  nishad kamdar

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

  •  1
  • nishad kamdar  · 技术社区  · 7 年前

    我正在尝试使用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 回复  |  直到 7 年前
        1
  •  0
  •   nishad kamdar    5 年前

    只需在设备“内存”上进行另一个映射,就不会在ARM上产生任何问题。但多个驱动程序访问/操作同一设备内存可能会导致设备故障和/或不可预测的行为。行为良好的驱动程序(例如,原始的看门狗驱动程序)在ioremap()之前调用request\u mem\u region(),这将完全避免您提出的这个问题。

    ARM Linux大师拉塞尔·金(RussellKing)提到“在ARM上,我们(可能)有很多情况下ioremap()被多次用于相同的物理地址空间。”无论如何,首选做法只是一种映射。