免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1772 | 回复: 2
打印 上一主题 下一主题

mmap中遇到的问题? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-30 15:07 |只看该作者 |倒序浏览
安装的CentOS 5.3,内核版本2.6.18-128 DELL R710服务器
在一个ko中申请内存
     g_ct_addr = __get_free_pages(GFP_ATOMIC, 1);
        mem_map_reserve(virt_to_page(g_ct_addr));
        create_proc_read_entry("abc", 0, NULL, aaa, NULL);
        memcpy((void *)g_ct_addr, "abcdefghijklmnopqrstuvwxyz", 27);

在应用程序中读出来
     int fd=open("/dev/mem",O_RDWR);
        int fd_procaddr = open("/proc/abc",O_RDONLY);
        if( fd_procaddr == 0)
        {
                printf( "zero mem file no found!n";
                exit(0);
        }

        char abc[4*1024] = {0};
        read(fd_procaddr,abc,;
        close(fd_procaddr);
        off_t CTRLADDR = 0;
        sscanf( abc, "%08x", &CTRLADDR );
        void *g_ct_addr = mmap(0, 1, PROT_READ, MAP_SHARED|MAP_LOCKED, fd, CTRLADDR);
        if (MAP_FAILED == g_ct_addr)
        {
                printf("AAA %lu %s\n", errno, strerror(errno));
                exit(0);
        }

mmap是时候返回EPERM,dmesg显示tried to read /dev/mem between 3770e000->3770f000

看了一下内核代码,
int devmem_is_allowed(unsigned long pagenr)
{
   if (pagenr <= 256)
{
printk("AAA: %lu\n", pagenr);
       return 1;
}
   if (!page_is_ram(pagenr))
{
printk("BBB: %lu\n", pagenr);
       return 1;
}
   return 0;
}返回了0

if (!devmem_is_allowed(pfn))
{
        printk ("rogram %s tried to read /dev/mem between %Lx->%Lx.\n",
        current->comm, from, to);
        return 0;
}也返回0
这是怎么回事

论坛徽章:
0
2 [报告]
发表于 2009-07-01 09:38 |只看该作者
http://www.lslnet.com/linux/dosc1/42/linux-297384.htm

根据这个文章提到的以及代码
devmem_is_allowed
->  if (!page_is_ram(pagenr))
            return ALLOWED;

应该就是内核现在限制了不再随便给访问了吧

论坛徽章:
0
3 [报告]
发表于 2009-07-01 10:37 |只看该作者
问题是我看了redhat 5.0的代码,这一段是完全一样的,但在5.0里面是没有问题的,到了5.3就不行了,不知道怎么回事
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP