免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2632 | 回复: 4

[转贴]用户态和内核共享内存--最简单的例子 [复制链接]

论坛徽章:
0
发表于 2006-03-18 17:55 |显示全部楼层
作者:wheelz
来自:
http://www.linuxforum.net/forum/gshowflat.php?Cat=&Board=linuxK&Number=587187&page=0&view=collapsed&sb=5&o=all&fpart=
例子中,用户态程序的KERNEL_VIRT_ADDR就是内核模块打印的地址p
这里是hard coding(先加载内核模块,再把打印的地址赋值给KERNEL_VIRT_ADDR),
可以采用其他的方式传递。

2.6内核验证。

内核模块-----------------------


  1. #include <linux/config.h>

  2. #include <linux/module.h>

  3. #include <linux/kernel.h>

  4. #include <linux/mm.h>



  5. MODULE_LICENSE("GPL");

  6. MODULE_AUTHOR("Wheelz");

  7. MODULE_DESCRIPTION("mmap demo");



  8. static unsigned long p = 0;



  9. static int __init init(void)

  10. {

  11.         //分配共享内存(一个页面)

  12.         p = __get_free_pages(GFP_KERNEL, 0);

  13.         SetPageReserved(virt_to_page(p));



  14.         printk("<1> p = 0x%08x\n", p);



  15.         //在共享内存中写上一个字符串

  16.         strcpy(p, "Hello world!\n");



  17.         return 0;

  18. }



  19. static void __exit fini(void)

  20. {

  21.         ClearPageReserved(virt_to_page(p));

  22.         free_pages(p, 0);       

  23. }



  24. module_init(init);

  25. module_exit(fini);



  26. 用户态程序---------------------------------

  27. #include <sys/mman.h>

  28. #include <sys/types.h>

  29. #include <sys/stat.h>

  30. #include <fcntl.h>

  31. #include <stdio.h>



  32. #define PAGE_SIZE (4*1024)



  33. #define PAGE_OFFSET                0xc0000000

  34. #define KERNEL_VIRT_ADDR        0xc5e3c000



  35. int main()

  36. {

  37.         char *buf;

  38.         int fd;

  39.         unsigned long phy_addr;



  40.         fd=open("/dev/mem",O_RDWR);

  41.         if(fd == -1)

  42.                 perror("open");

  43.         phy_addr=KERNEL_VIRT_ADDR - PAGE_OFFSET;



  44.         buf=mmap(0, PAGE_SIZE,

  45.                 PROT_READ|PROT_WRITE, MAP_SHARED,

  46.                 fd, phy_addr);

  47.         if(buf == MAP_FAILED)

  48.                 perror("mmap");

  49.         puts(buf);//打印共享内存的内容

  50.         munmap(buf,PAGE_SIZE);



  51.         close(fd);

  52.         return 0;

  53. }
复制代码

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2006-03-18 19:48 |显示全部楼层
都转的wheelz老大的帖子..

论坛徽章:
0
发表于 2006-03-20 13:33 |显示全部楼层
不错

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2006-03-20 14:47 |显示全部楼层
这样做的话,是单向的,还是双向的?

论坛徽章:
0
发表于 2006-09-13 16:29 |显示全部楼层
原帖由 flw 于 2006-3-20 14:47 发表
这样做的话,是单向的,还是双向的?


应该是双向的, 用户写的数据内核也能看到, 但这样的话, 二者采用何种方式同步好呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP