C 复制到用户无法将数据从内核复制到mmap用户?
在用户空间程序中,我通过mmap分配一些内存,如下函数调用:C 复制到用户无法将数据从内核复制到mmap用户?,c,linux-kernel,kernel,mmap,C,Linux Kernel,Kernel,Mmap,在用户空间程序中,我通过mmap分配一些内存,如下函数调用: void *memory; int fd; fd = open(filepath, O_RDWR); if (fd < 0) return errno; memory = mmap(NULL, 4096, PROT_WRITE, MAP_SHARED, fd, 0); if (memory == MAP_FAILED) return -1; //syscall() goes here 编辑:在帖子中添加了
void *memory;
int fd;
fd = open(filepath, O_RDWR);
if (fd < 0)
return errno;
memory = mmap(NULL, 4096, PROT_WRITE, MAP_SHARED, fd, 0);
if (memory == MAP_FAILED)
return -1;
//syscall() goes here
编辑:在帖子中添加了错误检查代码以进行澄清
在这种情况下,copy\u to\u user()
调用反复失败,而如果我执行memory=malloc()
调用,它总是成功的
在这种情况下,mmap的某些权限标志是否有误?打开是否成功?mmap呢?目标文件是否足够大?可以通过用户空间中的映射写入文件吗
此外,重复的4096是一个强烈的打击你的代码是错误的。用户空间应该通过预期的大小。目标文件是新创建的,我不明白“足够大”是什么意思,出于写入目的,数据将写入文件,对吗?open()调用肯定成功了,4096并不仅仅是为了表示的目的而重复。那么mmap呢(您如何检查它,特别是您是否测试MAP_失败?)。我怀疑文件大小为0,这将阻止将\u复制到\u用户。我不明白关于通过映射写入的问题有什么不清楚的地方-内存[0]='A'或类似的,对于instance。完成后,它可能会触发SIGBUS,清楚地显示问题与复制用户无关。那么,第三次的大小如何。第二次:目标文件是新创建的,我不理解您所说的“足够大”是什么意思,出于写入目的,数据将写入文件,对吗?文件大小如何影响用于写入目的的“复制到”用户或mmap?通过映射区域写入不会增加文件。它必须足够大,足以覆盖整个区域。因此,特别是,如果文件大小为0,则能够捕获该条件的复制到用户之类的操作将失败。ftruncate文件到4096或更高。错误是什么?你用什么?我们无法仅在您实际编写的内容上为您提供帮助。内核空间中的copy_to_user()不会设置可通过
perror()预测的errno
copy_to_user(memory,src,4096);