我想知道是否可以编写 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/