我想知道是否可以编写C代码来打开和映射指向远程文件系统/ dev / mem的内存指针。我已经将该系统安装在计划从中运行代码的系统的/ mnt /下。我使用sshfs挂载了/ dev,因此完整路径看起来就像是运行c代码的系统中的/ mnt / mem。
根据我的经验,如果直接将我SSH到远程系统并访问所需的组件,则可以打开/ mmap / dev / mem。就是说,如果我将用于打开文件描述符的字符串从/ mnt / mem更改为/ dev / mem,然后在本地编译并运行该字符串,那么它将起作用并获取我期望的寄存器数据。
似乎我也可以成功打开并映射到远程系统上的/ home /任何目录。出于某种原因,为什么无法以相同的方式打开远程安装的/ dev / mem?
关于我的案例的一些额外信息: -两个系统上的Linux发行版 -ssh同时安装 -sshfs安装在我从那里进行安装的位置 -我对两个系统都具有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挂载。
//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文件
答案 0 :(得分:0)
设备文件并不是真正打开的文件-当您打开一个文件时,它使用索引节点中的设备号作为内核设备表中的索引来知道要打开哪个文件。因此,如果您可以打开/ mnt / mem(远程计算机上的设备,它将在本地内核中查找远程内核的存储设备的索引。因此,您会在计算机上找到一些随机设备您的本地内核,无论该插槽中发生了什么事情。即使它是内存设备(也可能是,如果内核配置类似),您将获得本地内核的内存,而不是远程内核的内存。 ,远程文件系统(几乎)始终使用-nodev选项安装(默认设置),这意味着无法打开设备文件。