LDD3中对remap_pfn_range函数使用有这么一段限制方面的说明: 它只能访问保留页和超出物理内存的物理地址。remap_pfn_range不允许重新映射常规地址,这包括 调用get_free_page函数所获得的地址。 超出物理内存的物理地址如何理解?
by whoisliang - 驱动开发 - 2009-01-14 18:19:44 阅读(8216) 回复(7)
LDD中有这样一句: "remap_pfn_range 的一个限制是它只存取保留页和在物理内存顶之上的物理地址" 哪位高手可以讲解下到底怎么样理解吗? 如: 在模块中分别用 kmalloc, vmalloc, 或直接一个buf[256], 应分别怎么样把它们mmap到用户空间啊? 谢谢高手讲解!!
自己写了一个虚拟的字符设备/dev/test ,字符设备在内核中为一块内存(用kmalloc), 我想实现的功能是:先通过mmap函数把设备文件映射到用户空间,然后通过strncpy函数向设备写入数据,然后再通过read去读我写入的数据。 我的问题是:在用户空间中如设置mmap的参数:offset = 0;可以正常实现功能,也就是可以用read读出来,而当offset = 1024*4(4k倍数)时不能实现我想要的结果(用read读不出用strncpy写入的数据)。其他file_operati...
通过运行下面这个程序发现并没有像书上所说的那样重映射第0号内存页,可是书上说该函数不能映射RAM,书是LDD3
[code]
#include
static int remap_mmap(struct file *filp, struct vm_area_struct *vma) { int i = 0; int j = 0x0; if (remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, vma->vm_end - vma->vm_start, vma->vm_page_prot)) return -EAGAIN; vma->vm_ops = &remap_vm_ops; return 0; } 想用上述程序实现mmap,但是发现在用户态调用mmap大于2...
static int remap_mmap(struct file *filp, struct vm_area_struct *vma) { int i = 0; int j = 0x0; if (remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, vma->vm_end - vma->vm_start, vma->vm_page_prot)) return -EAGAIN; vma->vm_ops = &remap_vm_ops; return 0; } 想用上述程序实现mmap,但是发现在用户态调用mmap大于2...
本帖最后由 hhb0331 于 2012-12-27 15:19 编辑 书中page 449中: The following does the trick for a driver mapping a region of simple_region_size bytes, beginning at physical address simple_region_start (which should be page-aligned): (注释为我的理解) //off为设备上需要映射内存的偏移量(大小,单位字节),相对于simple_region_start而言 unsigned long off = vma->vm_pgoff << PAGE_SHIFT; //设备映射内存的起始...
今天看《深入linux设备驱动程序内核机制》,其中说道: 在x86下 io_remap_pfn_range 的 定义如下 # define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \ remap_pfn_range(vma, vaddr, pfn, size, prot) 也就是说 io_remap_pfn_range 和 remap_pfn_range 实质是一样的。 我的疑惑是: io 端口空间是用in out 指令来访问的。 io 内存空间 是用mov 这样的指令访问的。 假如说在两个地址空间中各存在...
在驱动程序中我用__get_free_pages申请了1MB的内存,将这1MB内存用remap_page_range映射到用户空间。但应用程序用mmap()的地址读不到数据,但用在驱动中增加一个IOCTL命令用copy_to_user却可以拿到数据。这是为什么?
在驱动程序中我用__get_free_pages申请了1MB的内存,将这1MB内存用remap_page_range映射到用户空间。但应用程序用mmap()的地址读不到数据,但用在驱动中增加一个IOCTL命令用copy_to_user却可以拿到数据。这是为什么?