当前位置:  技术问答>linux和unix

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

    来源: 互联网  发布时间:2016-01-03

    本文导语:  问题:用户空间调用mmap时老是返回NULL 用户空间代码      char * p;                                                                int i;                              ...

问题:用户空间调用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  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  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了?

|
你需要找出在内核中到底是哪一地方出了错,跟踪到这个问题后来再提问,这样看不出有什么错误的

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

|
from 2.6.15 (maybe elder version, I'm not sure now...), remap_page_range() changed to remap_pfn_range()

|
pos = (unsigned long)(buffer);
该为pos = (unsigned long)(buffer)+offset;试试

    
 
 

您可能感兴趣的文章:

  • 编译linux2.6内核启动报错:
  • linux2.6.30内核要裁减到130K?
  • linux2.6内核移植问题
  • linux2.6内核 如何自动加载当前所需要的模块
  • 哪位朋友有linux2.6.9的内核?
  • linux2.6(4)的内核
  • ubuntu和win7下编译linux2.6内核
  • 新安的linux2。6。4 内核 启动不了了
  • rh9内核升级到linux2.6.10问题
  • 升级linux2.6的内核,还需要升级mkinitrd吗?
  • linux2.6内核升级问题。
  • 求:linux2.4进程调度内核原代码的完全注解!!!
  • 谁能给我一个linux2.4升级到2.6内核的成功文章呢
  • 求助:如何移植DM9000网卡驱动到linux2.6内核?
  • 关于linux2.6.x内核使用RPM 包的提问,100分,请大侠帮忙!!!!!!!!!!!
  • linux2内核谈忻?
  • 请问linux2.4以前内核源代码在什么地方下载?
  • 求一个Linux2.6内核的U盘设备完整驱动!!!!
  • 请教高手:如何把USB驱动程序从Linux2.4内核移植到2.6
  • linux2.6 进入了start_kernel死掉是内核参数设置不对吗
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 从linux2.4到linux2.6升级出现的问题?
  • 从linux2.6.22 到linux2.6.33 s3c2410 驱动的移植,哭了!!!
  • Video4Linux2
  • 在什么地方可以下载到完整的LINUX2.4原代码呢??绝对送分!!
  • 请问:linux2.4能不能升级到2.6呀
  • 在pxa255建立linux2.4的系统,需要哪些补丁啊?
  • 求linux2.6.29系统下载
  • linux2.6.29 usb摄像头驱动的名字是什么
  • 移植Linux2.6.36到mx27问题 iis7站长之家
  • 我装的是红旗LINUX2.4,声卡和网卡同用一个中断IRQ5,怎么解决?
  • 有人用“蓝点linux2.0”的吗?
  • 在红旗桌面Linux2.0中KDE环境下如何访问Windows分区中的文件???
  • 谁做过基于at91rm9200 linux2.4核的 SPI驱动?
  • linux2.4到2.6,信号的概念有哪些变化?
  • 移植Linux2.6.36到mx27问题
  • 移植linux2.6.24到S3C2410却无法ping同主机
  • 关于linux2.6的makefile
  • linux2.6.8下移植SPI驱动都需要修改哪些文件
  • 一个郁闷的问题(linux2.6.34)
  • linux2.6 i2c驱动的几个问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3