繁体   English   中英

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

[英]Is it possible to mount a remote filesystem and open/mmap /dev/mem?

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

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

看起来我也可以在远程系统上成功打开并映射到/ home /的任何内容。 是否有一些原因导致远程安装/ dev / mem无法以相同的方式打开?

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

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

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

errno返回权限被拒绝,好像即使有root权限我仍然无法以这种方式打开内存,但我不知道为什么如果在所有路径和mem本身设置了r / w权限,这不应该工作。

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

//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选项(默认值)挂载,这意味着无法打开设备文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM