为什么我对虚拟内存的写入在虚拟设备驱动程序中不可见?

时间:2015-12-27 21:11:10

标签: c linux kernel driver

我有一个我自己编写的自定义驱动程序,旨在促进将精确硬件RAM内存地址自定义映射到用户区。我试图测试公共内存mmap,因为两个进程之间共享到相同的硬件地址有助于每一方都能看到的可见内存操作。

我的代码大概是这样的:

  //placement: in a mmap callback to a file_operations facilitated
  //    character device
  //phys_addr - a variable that I will ioremap for a virtual addr
  virtaddr = ioremap(phys_addr, size);
  if (!virtaddr) {
    printk(KERN_INFO "could not remap page!");
    goto out;
  } else { 
    printk(KERN_INFO "attempting write");
    *((int *)virtaddr) = 0xdeadbeef;
    //wmb(); <--- I haven't tried this yet
  }

事实证明,我认为问题可能是缺少强制缓存刷新ram的写屏障。由于操作系统的具体内容超出了本问题的范围,我必须在某些特殊硬件上启动测试。我不认为写入障碍适用于主存储器或ram,就像它对设备寄存器或设备存储器一样(例如:SSD上的缓存等)。所以,我还没有测试过wmb,但我只想在那里提出我的问题。我通过Linux设备驱动程序3书找到了一些,我已经执行了我的代码;我正在拉的片段实际上正在执行,我知道它因为我可以看到printk。驱动程序执行代码,但后来似乎继续。最后,有一段类似的代码片段在ioremap上的一个公共硬件内存上执行,然后尝试从中读取。那篇文章并没有包含我写给它的价值。

为什么?

1 个答案:

答案 0 :(得分:1)

您能否准确地说出这句话“硬件RAM内存地址到用户土地”的意思。

您正在模拟哪种类型的设备[PCIe,USB等]

这一切都取决于您的CPU路由,并且由于硬件没有连接,因此转换不会导致故障,而是通过总线协议发送数据,这就像从总线控制器到设备的假包装生成一样。

要验证您是否可以检查总线事务,并且在IO端口映射的情况下,您可以使用来自特定端口地址/位的信号进行检查。