忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT HPC论坛 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
楼主: Godbach

内核和用户空间共享内存的实现例程-proc和mmap [复制链接]

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
发表于 2009-06-08 19:16 |显示全部楼层
原帖由 garyv 于 2009-6-8 17:34 发表
看来大家对linux内核都蛮感兴趣的:wink:


本身就是Linux论坛啊,不管是搞驱动还是其他底层的开发,都得熟悉内核。

论坛徽章:
0
发表于 2009-06-09 11:52 |显示全部楼层
virt_to_phys 这个可以实现虚拟地址到物理地址的转换, 是应用层的那个mmap出问题, 在物理内存<4G的会有问题, mmap的那个文件句柄是 "/dev/mem"时会有问题.

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
发表于 2009-06-10 09:32 |显示全部楼层
原帖由 blue006 于 2009-6-9 11:52 发表
virt_to_phys 这个可以实现虚拟地址到物理地址的转换, 是应用层的那个mmap出问题, 在物理内存


直接使用open打开这个/dev/mem,然后按照地址偏移去读一下对应的位置看看是否正确。

论坛徽章:
0
发表于 2009-06-18 17:17 |显示全部楼层
其一是内核版有一个关于《内核可以从线性地址直接计算物理地址,用来做什么呢?》的讨论,偶说计算出物理地址可以共享给用户空间读写。dreamice兄说能否说一下详细的应用。

very interesting.

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
发表于 2009-06-18 19:46 |显示全部楼层
原帖由 nyquist892004 于 2009-6-18 17:17 发表
其一是内核版有一个关于《内核可以从线性地址直接计算物理地址,用来做什么呢?》的讨论,偶说计算出物理地址可以共享给用户空间读写。dreamice兄说能否说一下详细的应用。

very interesting.


本文也就是讲的这个问题。

论坛徽章:
0
发表于 2009-06-26 14:00 |显示全部楼层
要好好的支持支持呀

论坛徽章:
0
发表于 2010-06-05 15:30 |显示全部楼层

  1. wheelz.c => wheelz-funy.c |   22 +++++++++-------------
  2. 1 files changed, 9 insertions(+), 13 deletions(-)

  3. diff --git a/wheelz.c b/wheelz-funy.c
  4. index c0c5741..9a909ff 100644
  5. --- a/wheelz.c
  6. +++ b/wheelz-funy.c
  7. @@ -1,21 +1,17 @@
  8. static int __init init(void)
  9. {
  10. -        /*build proc dir "memshare"and two proc files: phymem_addr, phymem_size in the dir*/
  11. -        proc_memshare_dir = proc_mkdir(PROC_MEMSHARE_DIR, NULL);
  12. -        create_proc_info_entry(PROC_MEMSHARE_PHYADDR, 0, proc_memshare_dir, proc_read_phymem_addr);
  13. -        create_proc_info_entry(PROC_MEMSHARE_SIZE, 0, proc_memshare_dir, proc_read_phymem_size);
  14. -
  15.          /*alloc one page*/
  16.          kernel_memaddr =__get_free_pages(GFP_KERNEL, PAGE_ORDER);
  17. -        if(!kernel_memaddr)
  18. -        {
  19. +        if (! kernel_memaddr) {
  20.                  printk("Allocate memory failure!\n");
  21. +                return -ENOMEM;
  22.          }
  23. -        else
  24. -        {
  25. -                SetPageReserved(virt_to_page(kernel_memaddr));
  26. -                kernel_memsize = PAGES_NUMBER * PAGE_SIZE;
  27. -                printk("Allocate memory success!. The phy mem addr=%08lx, size=%lu\n", __pa(kernel_memaddr), kernel_memsize);
  28. -        }
  29. +        SetPageReserved(virt_to_page(kernel_memaddr));
  30. +        kernel_memsize = PAGES_NUMBER * PAGE_SIZE;
  31. +        /*build proc dir "memshare"and two proc files: phymem_addr, phymem_size in the dir*/
  32. +        proc_memshare_dir = proc_mkdir(PROC_MEMSHARE_DIR, NULL);
  33. +        create_proc_info_entry(PROC_MEMSHARE_PHYADDR, 0, proc_memshare_dir, proc_read_phymem_addr);
  34. +        create_proc_info_entry(PROC_MEMSHARE_SIZE, 0, proc_memshare_dir, proc_read_phymem_size);
  35. +        printk("Allocate memory success!. The phy mem addr=%08lx, size=%lu\n", __pa(kernel_memaddr), kernel_memsize);
  36.          return 0;
  37. }

复制代码

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
发表于 2010-06-06 11:52 |显示全部楼层
回复rtable:
rtable兄的意思是模块初始化的时候先申请内存,再创建proc文件。如果内存申请失败了,也就没有必要创建proc文件了。
不知小弟的理解是否正确。

论坛徽章:
1
天蝎座
日期:2014-02-28 16:08:53
发表于 2010-06-07 15:19 |显示全部楼层
good ,收藏,真是妙啊

论坛徽章:
1
天蝎座
日期:2014-02-28 16:08:53
发表于 2010-06-07 15:57 |显示全部楼层
本帖最后由 snriyt 于 2010-06-07 16:35 编辑

  1. [19272.418742] Allocate memory success!. The phy mem addr=5a911000, size=4096
  2. [19293.111342] Program mmap_ph_usr tried to access /dev/mem between 5a911000->5a912000.
  3. [19293.111355] mmap_ph_usr[6720]: segfault at ffffffffffffffff ip 00007fc14c366b20 sp 00007fff96e79ad8 error 6 in libc-2.11.1.so[7fc14c2e4000+178000]
  4. yz@yz-desktop:~/code/mm$ sudo ./mmap_ph_usr "abcdefs"
  5. phymem_addr=5a911000, phymem_size=4096
  6. Segmentation fault
复制代码
amd64
  1.   map_addr = mmap(0, phymem_size, PROT_READ|PROT_WRITE, MAP_SHARED, map_fd, phymem_addr);
复制代码
返回值为0xffffffffffffffff;
  1. map failed: : Operation not permitted
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP