【问题标题】:Not able to write in /dev/mem无法写入 /dev/mem
【发布时间】:2018-03-16 01:08:44
【问题描述】:

我正在试验的问题与正确执行的open()mmap() 函数无关。我在内核中禁用了CONFIG_STRICT_DEVMEM,所以我可以毫无问题地从/dev/mem 读取。实际上,我可以做到以下几点:

const char *path = "/dev/mem"
int fd = open(path, O_RDWR); /* read and write flags*/
p  = mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, BASE_ADDR); /* read and write flags*/

并且代码不会失败。尽管如此,我还是使用这段代码在 PCI 地址空间中写入。所以,BASE_ADDR 基本上是0xc000000,大小是 256 MiB(0x10000000,所有的 PCI 地址空间)。

说,当我尝试在这些位置(使用特定的偏移量,BDF 格式)写入时,什么都没有写入;再次代码没有失败,它只是没有写任何东西。

如果我的代码有误,我尝试了BusyBox,使用以下参数:

[horro@ ~]$ sudo busybox devmem 0xc00b0a8c w 0xffffffff
[horro@ ~]$ sudo busybox devmem 0xc00b0a8c             
0x00000000

所以,基本上就是什么都不写了。

【问题讨论】:

  • 您的代码有错字:MAP_SHARE 应该是 MAP_SHARED。但这显然不是问题。请运行sudo strace -o /tmp/devmem.log.txt busybox devmem 0xc00b0a8c w 0xffffffff,然后将文件 /tmp/devmem.log.txt 放在我们可以看到的地方。 (合并到问题中会太长,不幸的是我们需要看到整个事情,未经编辑。)如果你得到“strace:找不到命令”,那么你需要先安装程序(大多数 Linux 发行版都把它在一个也称为“strace”的包中)。
  • 略读elixir.free-electrons.com/linux/latest/source/drivers/char/… 的代码给我的印象是你正在尝试做的事情应该可以工作 - 但我不是内核黑客,我可能有误会了。
  • 你确定某些东西被映射到你要写的地址吗? PCI 设备需要向 BIOS 或操作系统询问物理映射地址。如果不这样做,设备的内存空间将与总线保持隔离。
  • 而且代码没有失败。 :) 是的,您只需忽略 open() 函数的返回码

标签: c linux linux-kernel linux-device-driver


【解决方案1】:

有一个 CONFIG_STRICT_DEVMEM 内核配置选项。我的理解是它必须在编译时设置为 CONFIG_STRICT_DEVMEM=n。这是出于安全原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多