【问题标题】:Kernel driver, ioremap necessary in MMU-less system?无 MMU 系统中需要内核驱动程序、ioremap 吗?
【发布时间】:2013-12-07 14:46:42
【问题描述】:

所以,当谈到内核驱动程序时,我是个新手,并且对 ioremap 函数有疑问。

我正在编写一个驱动程序,用于访问在具有 ARM Cortex-M3 和 FPGA 结构的 SoC 上的自定义 VHDL 模块中定义的一些寄存器。 查看示例,我认为我应该使用 ioremap,但由于 Cortex-M3 没有 MMU,所以我真的不明白这一点,如下例所示:

/* Physical addresses */
static u32* rcu_trig_recv_physaddr = ((u32 *) 0x50040000);
static int  rcu_trig_recv_size     = 0x10; // size of 16 for testing 
/* Virtual addresses */
static u32* rcu_trig_recv_virtbase = NULL;
/*removed code not relevant for the question*/
static int __init rcumodule_init(void)
{
    int iResult = 0; // holding result of operations
    u32 buffer;     

    // Register the driver
    iResult = register_chrdev(rcuc_majorID, "rcuc", &rcuc_fops);
    if (iResult < 0) {
        printk(KERN_INFO "module init: can't register driver\n");
    }
    else{
        printk(KERN_INFO "module init: success!\n");
    }

    // Map physical address to virtual address
    if(rcu_trig_recv_size){
        rcu_trig_recv_virtbase = (u32*) ioremap_nocache( (u32 *)rcu_trig_recv_physaddr, rcu_trig_recv_size );
        printk("Remapped TRGRECV from 0x%p to 0x%p\n", rcu_trig_recv_physaddr, rcu_trig_recv_virtbase);
    }
    // try to read some stuff, expecting 0x17240f09  
    buffer = readl(rcu_trig_recv_virtbase);
    printk("read %lx, at 0x%p\n", buffer, rcu_trig_recv_virtbase);

    return iResult;
}

然后返回,当我安装驱动程序时:

# insmod trigger.ko 
module init: success!
Remapped TRGRECV from 0x50040000 to 0x50040000
read 17240f09, at 0x50040000

据此,我最好改为读取物理地址。或者这是一个坏主意,我应该以更好的方式处理我的寄存器?

【问题讨论】:

    标签: linux kernel driver ioremap


    【解决方案1】:

    如果您知道您的代码永远不需要在另一台设备上使用,您可能会侥幸逃脱,但坚持使用 ioremap() 会更安全。基于获取和使用内存映射 IO 提供的指针的代码将使您的代码比使用硬编码的物理地址更具可移植性和可维护性。

    即使您不打算将此代码带到不同的设备上,使用物理地址也可能会在仅升级到同一行中的较新芯片时破坏您的代码。

    【讨论】:

      猜你喜欢
      • 2019-12-14
      • 1970-01-01
      • 2017-01-17
      • 2018-03-14
      • 1970-01-01
      • 2015-10-16
      • 1970-01-01
      • 1970-01-01
      • 2014-11-04
      相关资源
      最近更新 更多