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

月吻长河 2006-05-10 09:39:02
问题:用户空间调用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了?
...全文
356 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jacky_emdoor 2007-02-09
  • 打赏
  • 举报
回复
pos = (unsigned long)(buffer);
该为pos = (unsigned long)(buffer)+offset;试试
月吻长河 2006-05-14
  • 打赏
  • 举报
回复
楼上的说得对
我查了一下,却实是改成remap_pfn_range()了
zgz 2006-05-13
  • 打赏
  • 举报
回复
from 2.6.15 (maybe elder version, I'm not sure now...), remap_page_range() changed to remap_pfn_range()
tb01412 2006-05-11
  • 打赏
  • 举报
回复
你需要找出在内核中到底是哪一地方出了错,跟踪到这个问题后来再提问,这样看不出有什么错误的

个人认为,你是映射的高端地址吗??对于常规的RAM地址,用MMAP好像不行

4,441

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧