【问题标题】:Is it possible to mount a remote filesystem and open/mmap /dev/mem?是否可以挂载远程文件系统并打开/mmap /dev/mem?
【发布时间】:2019-05-31 21:04:55
【问题描述】:

我想知道是否可以编写 c 代码来打开并将内存指针映射到远程文件系统的 /dev/mem。我已经将该系统安装在我计划从中运行代码的系统的 /mnt/ 下。我使用 sshfs 安装了 /dev,因此完整路径看起来就像运行 c 代码的系统中的 /mnt/mem。

根据我的经验,如果我直接通过 ssh 连接到远程系统并访问我想要的组件,我可以打开 /mmap /dev/mem。也就是说,如果我将用于打开文件描述符的字符串从 /mnt/mem 更改为 /dev/mem,然后在本地编译并运行它,那么它可以正常工作并获取我期望的寄存器数据。

似乎我也可以在远程系统上成功打开并映射到 /home/whatever。远程挂载的 /dev/mem 无法以相同的方式打开是否有某些原因?

我的案例的一些额外信息: - 两个系统上的 Linux 发行版 -ssh 安装在两者上 -sshfs 安装在我安装的位置 -我对两个系统都有根访问权限

从主机系统观察到的 /dev/mem 的属性:

crw-rw-rw- 1 root root 0, 0 Dec 8 2105 /mnt/mem

errno 返回权限被拒绝,就好像即使具有 root 权限我仍然无法以这种方式打开内存,但我不确定如果在所有路径和内存本身中设置了 r/w 权限,为什么这不起作用。

我还使用远程系统的 root 和 root pw 执行了 sshfs 挂载。

//Mmap a target to a pointer variable/fd
struct reg_ptrs mmap_target(struct access_method_info mthd_info)
{
  struct reg_ptrs mapped_ptrs;
  mapped_ptrs.iic_bar = NULL;
  char   mem_path1[100];

  strcpy(mem_path1,"/mnt/mem");

  int mem_fd1;
  mem_fd1 = open(mem_path1, O_RDWR);
  if(mem_fd1 == -1) {
    printf("Couldn't open()! %s\n", strerror(errno));
  }

  mapped_ptrs.iic_bar = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE, MAP_SHARED, mem_fd1, 0xff0e0000);

  //With pointers mapped to appropriate memory, we should be able to close these now
  close(mem_fd1);

  return mapped_ptrs;
} /* mmap_target */

预期结果是 open() 和 mmap() c 函数成功打开和映射远程安装的 /dev/mem 文件

【问题讨论】:

  • /dev 中的任何内容都不是常规文件,因此如果您将其作为远程安装的文件系统执行,我倾向于说“不”,但您仍应进行测试。 NFS 不允许挂载设备或套接字,只允许挂载文件、目录、符号链接等。
  • 嗯,无赖!但这似乎符合我在询问了几位同事后收集到的共识。显然 /dev/mem 只是一个主要的:次要字符串之类的东西,在这种情况下,/dev/mem 是 1:1。似乎除了本地操作系统知道如何处理它之外,它基本上没有任何意义。当我从远程系统执行 ls -l 时,它实际上显示为 0:0 所以我猜这被操作系统解释为“你不能打开/使用它”或类似的
  • 听起来不行。这类设备文件只是表面上的文件,没有可以映射的“数据”。

标签: c ssh sshfs


【解决方案1】:

设备文件并不是真正被打开的文件——当您打开一个文件时,它使用来自 inode 的设备号作为内核设备表中的索引来知道要打开哪个文件。所以如果你可以打开 /mnt/mem(来自远程机器的设备,它会在本地内核中查找远程内核的内存设备的索引。所以你会得到一些随机设备您的本地内核,无论该插槽中发生了什么。即使它是内存设备(如果内核配置类似,它可能是),您将获得本地内核的内存,而不是远程内核的内存。出于这个原因,远程文件系统(几乎)总是使用 -nodev 选项(它的默认选项)挂载,这意味着无法打开设备文件。

【讨论】:

  • 是的,基于我从其他几个人那里得到的类似解释,我同意了。我会接受你的回答并很快结束这个问题....我想先研究一下我是否可以在以太网上使用一种叫做 RDMA 的东西。如果其他人发现这个问题并试图实现类似的目标,我认为分享我的发现可能对我有好处。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-25
  • 2010-11-01
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
  • 2017-08-29
  • 1970-01-01
相关资源
最近更新 更多