免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Godbach
打印 上一主题 下一主题

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

论坛徽章:
0
31 [报告]
发表于 2009-06-08 13:55 |只看该作者
比方说物理内存是8G, kernel_memaddr的虚拟地址是0xffff81018aa7e000, virt_to_phys(kernel_memaddr)是0x18aa7e000,
可应用层读的结果还是不对,
感觉virt_to_phys()是象__pa那就做了个&操作, 没具体结合物理容量进行转换

论坛徽章:
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
32 [报告]
发表于 2009-06-08 14:21 |只看该作者
virt_to_phys

这个转换出来的是什么类型的值

论坛徽章:
0
33 [报告]
发表于 2009-06-08 15:54 |只看该作者
unsigned long

论坛徽章:
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
34 [报告]
发表于 2009-06-08 16:18 |只看该作者
原帖由 blue006 于 2009-6-8 15:54 发表
unsigned long


你的系统是不是64位的,sizeof(unsigned long) 是不是8啊?

论坛徽章:
0
35 [报告]
发表于 2009-06-08 16:37 |只看该作者
是64位的,  kernel_memaddr的虚拟地址是0xffff81018aa7e000 是16位,
virt_to_phys(kernel_memaddr) = 0x1,8aa7,e000,  前面省略了7个0
如果是32位的话不会超过0xFFFF,FFFF

论坛徽章:
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
36 [报告]
发表于 2009-06-08 16:45 |只看该作者
原帖由 blue006 于 2009-6-8 16:37 发表
是64位的,  kernel_memaddr的虚拟地址是0xffff81018aa7e000 是16位,
virt_to_phys(kernel_memaddr) = 0x1,8aa7,e000,  前面省略了7个0
如果是32位的话不会超过0xFFFF,FFFF


看一下这个函数的实现:
virt_to_phys


就像__pa,其实他的转换只是相当于减去0xC000 0000。

另外,你的内存是用什么方式申请的?

论坛徽章:
0
37 [报告]
发表于 2009-06-08 16:51 |只看该作者
virt_to_phys 有很多版本, 很多都是直接调用 __pa,
例子中的这个_get_free_pages(GFP_KERNEL, PAGE_ORDER)来分配内存

论坛徽章:
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
38 [报告]
发表于 2009-06-08 17:04 |只看该作者
原帖由 blue006 于 2009-6-8 16:51 发表
virt_to_phys 有很多版本, 很多都是直接调用 __pa,
例子中的这个_get_free_pages(GFP_KERNEL, PAGE_ORDER)来分配内存


刚刚看了这写个函数和宏的代码,主要就是定义的地方有好几处。

我建议自己hack一下这几个实现的流程,代码都很简单。顶多就是移位和加减法。调了那个函数,函数做了什么工作,这样你可以搞清楚问题在哪里。

[ 本帖最后由 Godbach 于 2009-6-8 17:06 编辑 ]

论坛徽章:
0
39 [报告]
发表于 2009-06-08 17:34 |只看该作者
看来大家对linux内核都蛮感兴趣的:wink:

论坛徽章:
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
40 [报告]
发表于 2009-06-08 19:16 |只看该作者
原帖由 garyv 于 2009-6-8 17:34 发表
看来大家对linux内核都蛮感兴趣的:wink:


本身就是Linux论坛啊,不管是搞驱动还是其他底层的开发,都得熟悉内核。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP