免费注册 查看新帖 |

Chinaunix

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

用户空间与kernel空间通信的例子(利用mmap) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-05 11:33 |只看该作者 |倒序浏览
前些日子看到linuxforum上wheelz发的一个帖子, kernel空间和用户空间通信的经典的例子 。


特整理一下:

kernel代码:


#include linux/config.h>
#include linux/module.h>
#include linux/kernel.h>
#include linux/mm.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Wheelz");
MODULE_DESCRIPTION("mmap demo");
static unsigned long p = 0;
static int __init init(void)
{
    //分配共享内存(一个页面)
    p = __get_free_pages(GFP_KERNEL, 0); //得到的当然是一个虚拟地址了
    SetPageReserved(virt_to_page(p)); //#define virt_to_page(kaddr)    (mem_map + (__pa(kaddr) >> PAGE_SHIFT)) //12
    printk(" p = 0x%08x\n", p);
    //在共享内存中写上一个字符串
    strcpy(p, "Hello world!\n");
    return 0;
}
static void __exit exit(void)
{
    ClearPageReserved(virt_to_page(p));
    free_pages(p, 0);
}
module_init(init);
module_exit(exit);
用户空间的测试程序:
#include sys/mman.h>
#include sys/types.h>
#include sys/stat.h>
#include fcntl.h>
#include stdio.h>
#define PAGE_SIZE (4*1024)
#define PAGE_OFFSET        0xc0000000
#define KERNEL_VIRT_ADDR    0xcf9e5000 //这里是硬编址的, 可以通过ioctl 或者proc来实现的。
int main()
{
    char *buf;
    int fd;
    unsigned long phy_addr;
    fd=open("/dev/mem",O_RDWR);
    if(fd == -1)
        perror("open");
    phy_addr=KERNEL_VIRT_ADDR - PAGE_OFFSET;
    buf=mmap(0, PAGE_SIZE,
        PROT_READ|PROT_WRITE, MAP_SHARED,
        fd, phy_addr);
    if(buf == MAP_FAILED)
        perror("mmap");
    puts(buf);//打印共享内存的内容
    munmap(buf,PAGE_SIZE);
    close(fd);
    return 0;
}
希望对对大家有所帮助 , 其实从这里我们也可以拓展我们自己的代码呀 。
比如如何分配内存什么的, 我们可以试试很多内核的函数。
确实是个好例子。
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/76848/showart_1680718.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP