Linux2.6内核mmap的问题! 请高手指教!

发布于 2022-07-22 15:33:54 字数 6346 浏览 7 评论 5

问题:用户空间调用mmap时老是返回NULL

用户空间代码片断
   char * p;                                                         
     int i;                                                            
     int fd;                                                            
     int len = 512;                                                
                                                                        
     fd = open("/dev/tdev",O_RDWR);                                    
                                                                        
     p = (char *)mmap(0, len, PROT_READ, MAP_PRIVATE, fd, 0);           
     printf("buffer address 0x%x n",p);                                
     printf("buffer data <%s> n",p);

内核空间代码:
unsigned char *buffer;
static void *rvmalloc(unsigned long size)
{
        void *mem;
        unsigned long adr;

        size = PAGE_ALIGN(size);
        mem = vmalloc_32(size);
        if (!mem)
                return NULL;

        memset(mem, 0, size); /* Clear the ram out, no junk to the user */
        adr = (unsigned long) mem;
        while (size > 0) {
                SetPageReserved(vmalloc_to_page((void *)adr));
                adr += PAGE_SIZE;
                size -= PAGE_SIZE;
        }

        return mem;
}
void init()
{
    buffer = rvmalloc(640);
}
static int adspdev_mmap(struct file *file, struct vm_area_struct *vma)  
{                                                                                             
        unsigned long start = vma->vm_start;
        unsigned long size = vma->vm_end - vma->vm_start;
        unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
        unsigned long page, pos;

        if (size > 640)
                return -EINVAL;

        pos = (unsigned long)(buffer);
        while (size > 0)
        {
                page = vmalloc_to_pfn((void *)pos);
                if (remap_pfn_range(vma, start, page, PAGE_SIZE, PAGE_SHARED))
                {
                        return -EAGAIN;
                }
                start += PAGE_SIZE;
                pos += PAGE_SIZE;
                if (size > PAGE_SIZE)
                        size -= PAGE_SIZE;
                else
                        size = 0;
        }
        vma->vm_flags &= ~VM_IO;        /* not I/O memory */
        vma->vm_flags |= VM_RESERVED;        /* avoid to swap out this VMA */
        return 0;
}

此外:
Linux 2.6内核是不是没有remap_page_range了?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

那些过往 2022-07-23 18:14:52

我使用的是no mmu的芯片和uClinux系统,没有虚拟内存,完全是线性地址空间,地址是连续的物理地址。
干脆不用mmap, 管它内核空间还是用户空间直接读写地址了!

一杯敬自由 2022-07-23 18:14:41

查了一下源代码
2.6内核remap_page_range改成改成remap_pfn_range()了

烟凡古楼 2022-07-23 18:10:46

vmalloc分配的内存在物理上是不连续的, 所以必须分别映射每一个内存页,使用nopage。2.6remap_page_range这个函数被新的函数替代了。

向地狱狂奔 2022-07-23 17:39:38

using the nopage() method here.

所谓喜欢 2022-07-23 17:23:17

应该是你的驱动中的mmap函数存在问题,你可以去看看ldd

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文