c - 是否可以挂载远程文件系统并打开/mmap/dev/mem?

标签 c ssh sshfs

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

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

看来我也可以成功打开并映射到远程系统上的/home/whatever 。是否有某种原因导致远程安装的/dev/mem 无法以相同的方式打开?

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

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

crw-rw-rw- 1 root root 0, 0 2105 年 12 月 8 日/mnt/mem

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

我还使用远程系统的 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 文件

最佳答案

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

关于c - 是否可以挂载远程文件系统并打开/mmap/dev/mem?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56401722/

相关文章:

c - sqlite3_open : "unable to open database file"

c - Kurose 模拟网络环境,Go-Back-N

bash - 创建一个脚本,该脚本使用dd和netcat写入本地镜像文件以覆盖远程服务器上的硬盘驱动器

c# - Windows Phone 7\Silverlight SSH 或 Telnet 库

ubuntu - 如何在/etc/fstab/sshfs 的替代品中配置 sshfs

emacs - 为什么 sshfs 会导致这些 Emacs 伪影?

python - 我可以 ssh 到服务器,然后使用 paramiko 在服务器上执行 sshfs 吗?

c - 如何在 c 中生成返回原始输出的 SHA1?

c - 使用sprintf函数后,字符串和C中整数数组的内存存储差异

php - 用于 postgreSQL 的 ssh 隧道