封锁记忆

封锁记忆

0个粉丝

39

问答

0

专栏

1

资料

封锁记忆  发布于  2018-07-11 17:36:55
采纳率 0%
39个问答
2632

虚拟地址和物理地址对应存放。

 
各位大神,我现在通过HI_MPI_SYS_MmzAlloc_Cached获得物理地址和虚拟地址,现在要把虚拟地址和物理地址存放在数组中,方便为了HI_MPI_SYS_MmzFree去根据虚拟地址来查询相对应的物理地址释放内存,应该怎么写啊,(就是my_malloc和my_free代替malloc和free)
[code]void *my_malloc(size_t size)
{       
        int s32Ret = 0;
        HI_U32 u32PhyAddr=0;
        HI_U32* pu32VirAddr = NULL;

        int array[] = {0};
        // 记录物理地址和虚拟地址;
       
        s32Ret = HI_MPI_SYS_MmzAlloc_Cached(&u32PhyAddr, (void**)(&pu32VirAddr),NULL, NULL, size);
        if(s32Ret != HI_SUCCESS)
        {
                printf("can't alloc ao buffer ! s32Ret =  %x, %d, %p\n",s32Ret,u32PhyAddr, pu32VirAddr);
        return -1;
        }

        //array[]  =
       
        printf("jw_mpi_osd_malloc success! s32Ret =  %x, %x, %p, size: %d\n",s32Ret,u32PhyAddr, pu32VirAddr, size );
        return pu32VirAddr;
}

int my_free(void *ptr)
{       
        int s32Ret = 0;
        HI_U32 u32PhyAddr=0;

        // 搜索虚拟地址对应的物理地址;
        s32Ret = HI_MPI_SYS_MmzFree(, ptr);
        if(HI_SUCCESS != s32Ret)
        {
                printf("mmz free failed with %x\n", s32Ret);
                return s32Ret;
        }
       
        printf("jw_mpi_osd_free success! s32Ret =  %x, %x, %p\n",s32Ret, ,  ptr);
        return ptr;
}[/code]

代码结构如上,现在就是要my_malloc()存储虚拟地址和物理地址,然后my_free()根据对应的虚拟地址查询相应的物理地址来释放内存。
我来回答
回答7个
时间排序
认可量排序

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2018-07-12 08:35:15
认可0
本帖最后由 zhuangweiye 于 2018-7-12 08:36 编辑

写个结构

typedef struct tagMyAddr
{
     HI_U32* pVirAddr;
     HI_U32   u32PhyAddr;
}MYADDR;

int my_malloc(MYADDR *addr, size_t size)
{
    。。。
    if (成功)
        return 0
    else
       return -1;
}

int my_free(MYADDR *addr)
{
...
}

jipd

0个粉丝

14

问答

0

专栏

0

资料

jipd 2018-07-12 09:24:12
认可0
顶顶顶顶顶

封锁记忆

0个粉丝

39

问答

0

专栏

1

资料

封锁记忆 2018-07-12 09:28:49
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=101372&ptid=51243]zhuangweiye 发表于 2018-7-12 08:35[/url]
写个结构

typedef struct tagMyAddr
[/quote]

本意是my_malloc()和my_free()的参数不变,即和Linux中的mallco和free保持一致,只需要my_malloc和my_free()分别代替malloc和free即可。
所以需要在my_malloc中获取到虚拟地址和物理地址分别保存,在my_free()中根据虚拟地址去寻找相对应的物理地址然后释放相对应的物理地址。

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2018-07-12 10:07:10
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=101379&ptid=51243]封锁记忆 发表于 2018-7-12 09:28[/url]
本意是my_malloc()和my_free()的参数不变,即和Linux中的mallco和free保持一致,只需要my_malloc和my_fre ...[/quote]

问题是有什么区别吗? 不都是要保存一个指针吗?

封锁记忆

0个粉丝

39

问答

0

专栏

1

资料

封锁记忆 2018-07-12 10:29:27
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=101389&ptid=51243]zhuangweiye 发表于 2018-7-12 10:07[/url]
问题是有什么区别吗? 不都是要保存一个指针吗?[/quote]

壮工,我写了之后还是不成功,应该是free的时候虚拟地址和物理地址不对应吗?
[code]typedef struct tagMyAddr
{
     HI_U32* pVirAddr ;
     HI_U32   u32PhyAddr ;
}MYADDR;

void *jw_mpi_osd_malloc(size_t size)
{       
        HI_VOID *v_ptr = NULL;
        HI_U32 p_addr = 0;
        int s32Ret = 0;

        MYADDR *addr;

        s32Ret = HI_MPI_SYS_MmzAlloc_Cached(&p_addr, &v_ptr, NULL, NULL, size);
        if(s32Ret != HI_SUCCESS)
        {
                printf("malloc mmz error 0x%x, %x, %p\n", s32Ret, p_addr,  v_ptr);
                return NULL;
        }
        // 记录物理地址和虚拟地址;

        addr->u32PhyAddr= p_addr;
        addr->pVirAddr = v_ptr;
       
        printf("jw_mpi_osd_malloc success! s32Ret =  %x, %x, %p, size: %d\n",s32Ret,  p_addr,  v_ptr, size );

        return v_ptr;
}

void  jw_mpi_osd_free(void *ptr)
{       
        int s32Ret = 0;
        MYADDR *addr;
        HI_U32 p_addr = addr->u32PhyAddr;
       
        printf("jw_mpi_osd_free start : %x,%p", p_addr, ptr);
       
        // 搜索虚拟地址对应的物理地址;
        s32Ret = HI_MPI_SYS_MmzFree(p_addr, ptr);
        if(HI_SUCCESS != s32Ret)
        {
            printf("mmz free failed with %x\n", s32Ret);
            return s32Ret;
        }
        printf("jw_mpi_osd_free success! s32Ret =  %x, %x\n",s32Ret, ptr);
       
        return 0;
}[/code]

在free的时候失败

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2018-07-12 11:02:48
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=101393&ptid=51243]封锁记忆 发表于 2018-7-12 10:29[/url]
壮工,我写了之后还是不成功,应该是free的时候虚拟地址和物理地址不对应吗?


[/quote]

您的C语言让我说什么好呢?

        MYADDR *addr;
   
       。。。

        // 记录物理地址和虚拟地址;
        addr->u32PhyAddr= p_addr;
        addr->pVirAddr = v_ptr;

就一个都不知道指到哪里的野指针,就敢赋值,不segmentation fault就很给面子了
退一万步说,一个局部变量赋了值,出了这个函数不就泥牛入海啥也没了,要来何用

        MYADDR *addr;
        HI_U32 p_addr = addr->u32PhyAddr;
这里一样,p_addr 天知道是什么东西

不要想着和malloc一样,您先把功能实现再讨论其他吧

封锁记忆

0个粉丝

39

问答

0

专栏

1

资料

封锁记忆 2018-07-12 15:22:08
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=101398&ptid=51243]zhuangweiye 发表于 2018-7-12 11:02[/url]
您的C语言让我说什么好呢?

        MYADDR *addr;
[/quote]

好的,谢谢壮工
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区