【发布时间】: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 所以我猜这被操作系统解释为“你不能打开/使用它”或类似的
-
听起来不行。这类设备文件只是表面上的文件,没有可以映射的“数据”。