免费注册 查看新帖 |

Chinaunix

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

MMU虚拟内存map的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-12 09:37 |只看该作者 |倒序浏览
在驱动编程时,可以用ioremap实现物理内存到虚拟内存的转换,

如果我用kmalloc申请了一段内存,返回内存指针,
通过什么方法可以把这个返回的内存指针转换到其对应的物理地址?

因为我想DMA进行数据传输,而DMA只认物理内存。

谢谢!!

论坛徽章:
0
2 [报告]
发表于 2013-07-12 14:29 |只看该作者
#include <asm/memory.h>//linux-3.2.36
#ifndef __virt_to_phys
#ifdef CONFIG_ARM_PATCH_PHYS_VIRT

/*
* Constants used to force the right instruction encodings and shifts
* so that all we need to do is modify the 8-bit constant field.
*/
#define __PV_BITS_31_24 0x81000000

extern unsigned long __pv_phys_offset;
#define PHYS_OFFSET __pv_phys_offset

#define __pv_stub(from,to,instr,type)                   \
        __asm__("@ __pv_stub\n"                         \
        "1:     " instr "       %0, %1, %2\n"           \
        "       .pushsection .pv_table,\"a\"\n"         \
        "       .long   1b\n"                           \
        "       .popsection\n"                          \
        : "=r" (to)                                     \
        : "r" (from), "I" (type))

static inline unsigned long __virt_to_phys(unsigned long x)
{
        unsigned long t;
        __pv_stub(x, t, "add", __PV_BITS_31_24);
        return t;
}

static inline unsigned long __phys_to_virt(unsigned long x)
{
        unsigned long t;
        __pv_stub(x, t, "sub", __PV_BITS_31_24);
        return t;
}
#else
#define __virt_to_phys(x)       ((x) - PAGE_OFFSET + PHYS_OFFSET)
#define __phys_to_virt(x)       ((x) - PHYS_OFFSET + PAGE_OFFSET)
#endif
#endif

你不用关这一大堆,用__virt_to_phys(x)就可以了。

论坛徽章:
3
卯兔
日期:2013-08-26 22:14:57未羊
日期:2013-09-08 19:16:05未羊
日期:2014-10-23 10:34:12
3 [报告]
发表于 2013-07-21 23:31 |只看该作者
LS正解

对于kmalloc申请的,X86上直接减去PAGE_OFFSET即是物理地址,一些嵌入设备上还需要加上PHYS_OFFSET
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP