C 如何映射字符设备文件?

C 如何映射字符设备文件?,c,linux,C,Linux,如何使用mmap将字符设备文件映射到我的应用程序?我尝试了以下代码,但失败了,因为文件大小为零(sb.st\u size==0)。还有别的办法吗?还是这一切都不可能?谢谢 #include <fcntl.h> #include <sys/mman.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> int init_module(void *module_image

如何使用
mmap
将字符设备文件映射到我的应用程序?我尝试了以下代码,但失败了,因为文件大小为零(
sb.st\u size==0
)。还有别的办法吗?还是这一切都不可能?谢谢

#include <fcntl.h>
#include <sys/mman.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int init_module(void *module_image, unsigned long len,
                    const char *param_values);

int main() {
  int res = 0;
  void *buf = 0;
  struct stat sb;
  int rc = 0;

  int fd = open("/dev/nvidia0", O_RDWR);
  if (fd < 0) {
    perror("open");
    exit(EXIT_FAILURE);
  }

  res = fstat(fd, &sb);
  if (res == -1) {
    perror("fstat");
    exit(EXIT_FAILURE);
  }

  buf = mmap(0, sb.st_size, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_SHARED, fd, 0);
  if (buf == MAP_FAILED) {
    perror("mmap");
    exit(EXIT_FAILURE);
  }

  munmap(buf, sb.st_size);
  close(fd);
  return EXIT_SUCCESS;
}
#包括
#包括
#包括
#包括
#包括
int init_module(void*module_映像,无符号长len,
常量字符*参数值);
int main(){
int res=0;
void*buf=0;
结构统计某人;
int rc=0;
int fd=打开(“/dev/nvidia0”,O_RDWR);
如果(fd<0){
佩罗(“公开”);
退出(退出失败);
}
res=fstat(fd和sb);
如果(res==-1){
佩罗尔(“fstat”);
退出(退出失败);
}
buf=mmap(0,sb.st_size,PROT_READ | PROT_WRITE | PROT_EXEC,MAP_SHARED,fd,0);
if(buf==MAP_失败){
佩罗尔(“mmap”);
退出(退出失败);
}
munmap(buf,sb.st_尺寸);
关闭(fd);
返回退出成功;
}

你不能。这是一个字符设备,因此不可查找。@wildplasser一个简单的谷歌搜索显示
/dev/nvidia*
支持
mmap
fcntl
(没有其他)。你的意思是
sb.st_size==0
所以
mmap
正在将errno设置为
EINVAL
?在我对
mmap
的有限经验中,我已经
mmap
ed通过PCIe连接到FPGA设备
lspci
显示了它们的条形地址范围,然后我将打开
/dev/mem
mmap
条形起始地址以及范围的长度。不知道这是否相关,但您的
/dev/nvidia0
设备在系统中是否有一些IO内存?在glxgears上运行strace,我得到
mmap(NULL,4096,PROT_READ | PROT_WRITE,MAP_SHARED,5,0xf2060000)=0x7fe2c7649000
(其中5是打开/dev/nvidia0返回的fd)。两个明显的区别是偏移量和缺少
PROTO\u EXEC
。我相信一个设备的MMAP能力是由驱动程序决定的,所以可能是英伟达驱动程序不支持PrimeExcel,需要适当的偏移,或者需要先调用一些IOCTL。我不会想象你会需要PROT_EXEC,因为它允许你以代码的形式执行设备内存。