如何解决MMAP 错误 - 无效参数 | Linux 字符设备
我是 Linux 内核模块编程的新手。我试图为我的角色设备进行 mmap。我收到错误无效参数。我尝试了一些方法,但无法修复它。事实上,我没有意识到代码的哪一部分出错了。
我怎样才能找到错误的根源并修复它?
这里是我的字符设备的 chrdev_mmap 函数:
static int chrdev_mmap(struct file *filp,struct vm_area_struct *vma){
pr_info("\n The chrdev_mmap is called from user space \n");
struct chrdev_device *chrdev = filp->private_data;
size_t size = vma->vm_end - vma->vm_start +1;
/* vma_end(end addres of vma,exclusive - start addres of vma,inclusive)*/
phys_addr_t offset = (phys_addr_t) vma->vm_pgoff << PAGE_SHIFT;
unsigned long pfn;
if (offset >> PAGE_SHIFT != vma->vm_pgoff)
return -EINVAL;
if ((offset > BUF_LEN) || (size > BUF_LEN - offset))
return -EINVAL;
/* Getting physcial addres */
pfn = virt_to_phys(buf) >> PAGE_SHIFT;
dev_info(dev,"mmap vma=%lx pfn=%lx size=%lx",vma->vm_start,pfn,size);
/* Remap-pfn-range will mark the range VM_IO */
if (remap_pfn_range(vma,size,vma->vm_page_prot))
return -EAGAIN;
return 0;}
它是用于测试 mmap 代码的用户空间应用程序:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
int main()
{
int mmapFile;
void *addr;
long len;
#define DEVICE_FILENAME "/dev/halit"
printf("\nlen değeri giriniz : \n");
scanf("%ld\n",&len);
mmapFile = open(DEVICE_FILENAME,O_RDWR);
if (mmapFile) {
printf("file opened\n");
}
else {
perror("open");
exit(EXIT_FAILURE);
}
addr = mmap(NULL,len,PROT_READ | PROT_WRITE,MAP_PRIVATE,mmapFile,0);
printf("got address=%p and len=%ld\n",addr,len);
printf("---\n");
if (addr == MAP_FAILED) {
perror("mmap");
exit(EXIT_FAILURE);
}
munmap(addr,len);
close(mmapFile);
return 0;
}
我的角色设备的位置是 /dev/halit 当我编译并运行用户空间应用程序时,字符设备的内核日志如下:
[21824.840488] Driver was opened. [21824.840507] The chrdev_mmap is called from user space [21824.840616] Driver was closed
和用户空间错误无效参数:
got address=0xffffffffffffffff and len=56 --- **mmap: Invalid argument**
我使用的是 Vmware Workstation 16 和 Ubuntu LTS 20.04。
-Thx,和愉快的编码 (:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。