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,因为它允许你以代码的形式执行设备内存。