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

标签 c linux kernel driver

我有一个我编写的自定义驱动程序,旨在促进将精确的硬件 ram 内存地址自定义映射到用户空间。我正在尝试测试在两个进程之间共享到同一硬件地址的公共(public)内存 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 Device Drivers 3 一书搜索了一些内容,并且执行了我的代码;我从中提取的片段 正在 实际上正在执行,我知道它是因为我可以看到 printk。驱动程序执行代码,但随后似乎继续运行。最后,有一段类似的代码在一 block 公共(public)硬件内存上对 ioremap 执行,然后它会尝试从中读取。该读取不包含我写入的值。

为什么?

最佳答案

能否请您准确地说出“将硬件 RAM 内存地址放入用户空间”这句话的意思。

您正在模拟什么类型的设备[PCIe、USB 等]

这一切都取决于您的 CPU 路由,并且由于硬件未连接,因此转换不会导致错误,而是会通过总线协议(protocol)发送数据,这就像从总线 Controller 到设备的假打包生成。

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

关于c - 为什么我对虚拟内存的写入在虚拟设备驱动程序中不可见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34484877/

相关文章:

linux - 在 debian 上创建 Chrooted 用户

linux - Linux 中的内存区域标志 : why both VM_WRITE and VM_MAYWRITE are needed?

c - 我如何通过网络代理 mmap 读取和写入?

c - 出现段错误的进程返回什么错误代码?

c - 调整数组大小和赋值的函数

c - Glib 类型(例如 guint)到标准 C 数据类型(例如 int)之间的类型转换

c - C中结构封装下的性能

linux - 短语中的特殊字符即使被 "quotation marks"包围也会产生错误

linux - Asterisk 格式的数字转换为日期格式

c - C 内核中字符串文字的奇怪行为