当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么我对虚拟内存的写入在虚拟设备驱动程序中不可见?》经验,为你挑选了0个好方法。

我有一个自定义驱动程序,我写的是为了便于将精确硬件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,就像它对设备寄存器或设备存储器一样(例如:SSD上的缓存等).所以,我没有测试过wmb,但我只想在那里提出我的问题.我通过Linux设备驱动程序3一书搜索了一些,我已经执行了我的代码; 我要拉的片段事实上执行,我知道它,因为我可以看到printk.驱动程序执行代码,但后来似乎继续.最后,有一段类似的代码片段在ioremap上执行一个共同的硬件内存,然后尝试从中读取.该读取不包含我写给它的值.

为什么?

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有