虚拟地址和物理地址的存储与提取

sdsszk 2018-07-11 09:12:07
各位大神,我现在通过HI_MPI_SYS_MmzAlloc_Cached获得物理地址和虚拟地址,现在要把虚拟地址和物理地址存放在数组中,方便为了HI_MPI_SYS_MmzFree去根据虚拟地址来查询相对应的物理地址释放内存,应该怎么写啊,(就是my_malloc和my_free代替malloc和free)
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;
}
复制代码


代码结构如上,现在就是要my_malloc()存储虚拟地址和物理地址,然后my_free()根据对应的虚拟地址查询相应的物理地址来释放内存。

...全文
467 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wb757955 2021-04-16
  • 打赏
  • 举报
回复
怎么搞的呀,虚拟内存和申请空间
yiyefangzhou24 2018-07-13
  • 打赏
  • 举报
回复
到底已经获取了地址还是没有获取?
// ReadPEInfo.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <Dbghelp.h>

void ReadNTPEInfo(PIMAGE_NT_HEADERS pImageNtPE);
ULONG RvaToOffset(IMAGE_NT_HEADERS * pNtHeader,ULONG Rva);

#define pNtHeaders pImageNtHeaders

int _tmain(int argc, _TCHAR* argv[])
{

char file[]="win32.exe";

//DOS头
PIMAGE_DOS_HEADER pImageDosHeader;
//NT头(包括PE标识+Image_File_Header+OptionHeader)
PIMAGE_NT_HEADERS pImageNtHeaders;
//标准PE头、
PIMAGE_FILE_HEADER pImageFileHeader;

//扩展PE头
IMAGE_OPTIONAL_HEADER32 pImageOptionHeaders;


HANDLE hFile;
HANDLE hMapObject;
//DOS头
PUCHAR uFileMap;

hFile= CreateFile(file,GENERIC_READ,0,NULL,OPEN_EXISTING,0,0);
if(hFile==NULL)
{
printf("打开文件失败\n");
system("pause");
return 0;
}

hMapObject=CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL);
if(hMapObject==NULL)
{
printf("创建文件映射内核对对象失败\n");
system("pause");
return 0;
}

//PE基址
uFileMap=(PUCHAR)MapViewOfFile(hMapObject,FILE_MAP_READ,0,0,0);
if(uFileMap==NULL)
{
printf("映射到进程地址空间失败\n");
system("pause");
return 0;
}

pImageDosHeader=(PIMAGE_DOS_HEADER)uFileMap;
if(pImageDosHeader->e_magic!=IMAGE_DOS_SIGNATURE)
{
printf("不是PE结构\n");
system("pause");
return 0;
}

//定位到NT PE头
pImageNtHeaders=(PIMAGE_NT_HEADERS)((PUCHAR)uFileMap+pImageDosHeader->e_lfanew);

//导入表的相对虚拟地址(RVA)
ULONG rva_ofimporttable=pImageNtHeaders->OptionalHeader.DataDirectory[1].VirtualAddress;
//根据相对虚拟(rva)地址计算偏移地址(offset)
ULONG offset_importtable=RvaToOffset(pImageNtHeaders,rva_ofimporttable);
if(!offset_importtable)
{
printf("获取导入表偏移地址失败\n");
system("pause");
return 0;
}

PIMAGE_THUNK_DATA s;

//取得导入表的地址
IMAGE_IMPORT_DESCRIPTOR *pImportTable=(IMAGE_IMPORT_DESCRIPTOR *)((char*)uFileMap+offset_importtable);


IMAGE_IMPORT_DESCRIPTOR null_iid;
IMAGE_THUNK_DATA null_thunk;
memset(&null_iid, 0, sizeof(null_iid));
memset(&null_thunk, 0, sizeof(null_thunk));

//每个元素代表了一个引入的DLL。
for(int i=0; memcmp(pImportTable + i, &null_iid, sizeof(null_iid))!=0; i++)
{
char *dllName= (char*)(uFileMap+RvaToOffset(pImageNtHeaders,pImportTable[i].Name));

//拿到了DLL的名字

printf("模块[%d]: %s\n", i, (char*)dllName);
PIMAGE_THUNK_DATA32 pThunk=(PIMAGE_THUNK_DATA32)(uFileMap+RvaToOffset(pImageNtHeaders,pImportTable[i].FirstThunk));

while(pThunk->u1.Ordinal!=NULL)
{
PIMAGE_IMPORT_BY_NAME pname=(PIMAGE_IMPORT_BY_NAME)(uFileMap+RvaToOffset(pImageNtHeaders,pThunk->u1.AddressOfData));
printf("函数编号: %d 名称: %s\n",pname->Hint,pname->Name);
pThunk++;
}
}
system("pause");
return 0;
}


void ReadNTPEInfo(PIMAGE_NT_HEADERS pImageNtPE)
{
printf("运行平台: 0x%04X\n",pImageNtPE->FileHeader.Machine);
printf("节数量: %d\n",pImageNtPE->FileHeader.NumberOfSections);
printf("PE属性: 0x%04X\n",pImageNtPE->FileHeader.Characteristics);
}





//计算Offset
ULONG RvaToOffset(IMAGE_NT_HEADERS * pNtHeader,ULONG Rva)
{
//PE节
IMAGE_SECTION_HEADER *p_section_header;
ULONG sNum,i;
//取得节表项数目
sNum=pNtHeader->FileHeader.NumberOfSections;
//取得第一个节表项
p_section_header=(IMAGE_SECTION_HEADER *)
((BYTE *)pNtHeader+sizeof(IMAGE_NT_HEADERS));
for(i=0;i<sNum;i++)
{
//printf("PE 节名称: %s\n",p_section_header->Name);
if((p_section_header->VirtualAddress<=Rva)&&Rva<(p_section_header->VirtualAddress+p_section_header->SizeOfRawData))
{
return Rva-p_section_header->VirtualAddress+p_section_header->PointerToRawData;
}
p_section_header++;
}
return 0;
}
sdsszk 2018-07-13
  • 打赏
  • 举报
回复
昨天晚上搞成功了,谢谢哦
yiyefangzhou24 2018-07-12
  • 打赏
  • 举报
回复
定义一个全局变量呗
typedef struct mAddress    {
    int physicalAddress;
int virtualaddress;
    }Address;
Address.physicalAddress= xxxx;
mAddress.virtualaddress= xxxx;
sdsszk 2018-07-12
  • 打赏
  • 举报
回复
现在就是定义的一个全局变量的
typedef struct tagMyAddr
{
HI_U32 *pVirAddr ;
HI_U32 u32PhyAddr ;
}MYADDR;

static MYADDR *g_addr;


可是还是不行,需要初始化,我在free的时候怎么确定虚拟地址和物理地址是一一对应的那?还有怎么根据虚拟地址去寻找物理地址那?可以帮忙写下吗?
《企业级 VMware vSphere 6.7虚拟化技术配置与管理》课程共分为“上集”和“下集”两部分,本套视频为“上集”部分,从零基础讲起,由浅入深,是虚拟化入门与提高学习推荐课程。 通过本课程学习,可以全面、深入、系统掌握vSphere产品的规划、设计、安装、配置、管理等相关技能。结合课程实战,深入理解软件定义计算、存储、网络相关概念和运维技能。 《企业级 VMware vSphere虚拟化技术配置与管理》上集部分具体课程章节如下。 第1章 《vSphere技术基础》主要内容本章我们从理论上描述了虚拟化技术。第一部分重点讲解了什么是虚拟化技术;什么是vSphere。第二部分重点讲解了vSphere的设计思想,从虚拟化层、管理层、接口层进一步展开分析,使从业学习人员从技术层面对VMware vSphere进行深层次学习。 第2章 《VMware ESXi 安装和设置》主要内容本章我们重点讲解了两部分内容,第一部分主要讲解了安装ESXi程序的准备工作及安装过程。第二部分主要讲解了ESXi服务器的基本设置。这些内容是成为VMware工程师的必备技能,也是基础要求,希望各位朋友认真学习,踏实实践。 第3章 《vSphere Host Client管理单台ESXi主机》主要内容本章我们主要讲解了通过vSphere Host Client管理单台ESXi主机相关技能。包括vSphere Host Client的版本情况,基本理论知识;结合理论知识,重点给大家演示了使用vSphere Host Client对ESXi主机进行管理、对虚拟机进行管理、对网络进行管理、对存储进行管理等内容。操作内容比较多,希望朋友们认真理解理论知识的同时,踏实做好每一个实验,用实验检验理论,通过理论指导实践。 第4章 《vCenter Server 安装和设置》主要内容本章我们从理论上讲解了vCenter Server的安装类型、安装要求、安装分类、安装涉及到的组件和服务。在理论的基础上,我们分类分步进行了各种模型的构建,这些构建模型包括:* Windows环境部署具有嵌入式PSC的vCenter Server;* Windows环境部署具有外部PSC和外部SQL Server数据库的vCenter Server;* Linux环境部署具有嵌入式PSC的VCSA;* Linux环境部署具有外部PSC的VCSA。本章内容理论丰富,实验详细。希望朋友们认真学习理论说明,跟做章节中涉及的每一个实验,边看边做边总结。最终能够形成自己的知识。注释:PSC:亦指Platform Services ControllerVCSA:亦指vCenter Server Appliance 第5章 《vCenter Server基本配置和主机管理》 主要内容本章我们从理论上讲解了vSphere在数据中心的物理结构、软件组件、客户端使用界面、受管清单对象、可选vCenter Server组件和vCenter Server插件。在理论的基础上,详细介绍了vSphere Client的基本使用,包括对vCneter Server的管理操作、常规配置、高级属性定义、群集对象操作、vSphere标记和属性等。 第6章 《VMware vSphere 6.7 网络配置与管理》 主要内容软件定义网络,是虚拟化技术中的重要知识点。本章我们主要讲解了VMware vSphere网络的配置与管理。通过大量的理论和图例详细阐述了虚拟化环境中的网络模型和工作流程。课程中,我们对VMware vSphere虚拟化环境中的标准交换机和分布式交换机进行了分类讲解,并详细演示了涉及到的每一个实验。虽然理论和实践都做了比较详尽讲解,但对于初学者仍有一点的难度。克服困难的最好方式就是多做实验,验证理论。可谓实验三遍,其义自见。 第7章 《VMware vSphere 6.7 存储配置与管理》 主要内容本章我们通过理论结合实践的方式讲解了 VMware ESXi和 VMware vCenter Server提供的虚拟化和软件定义的存储技术。这些技术细节包括:将ESXi与iSCSI SAN配合使用;为VMware ESXi配置iSCSI共享存储;管理虚拟化环境中的存储设备;使用虚拟闪存读取缓存;在虚拟化环境中使用数据存储;虚拟化环境中的多路径和故障切换技术;裸设备映射技术;存储置备和空间回收技术;管理存储I/O资源。大家在学习过程中,可以以此为参考,构建自己的环境,逐步熟练课程中的术语和操作技能。 第8章 《VMware vSphere 6.7 虚拟机配置与管理》 主要内容本章我们对VMware vSphere 环境中部署虚拟机、部署 OVF 和 OVA 模板、使用内容库、配置虚拟机硬件、配置虚拟机选项、使用 vSphere vApp 管理多层应用程序、编辑虚拟机启动和关机设置等做了全面介绍。希望大家在掌握理论的基础上,参照课程实践部分,独立完成各个实验操作。 后续:在理论知识扎实,实践操作到位的情况下,《企业级 VMware vSphere虚拟化技术配置与管理》下集将深入讲解vSphere环境下的vMotion、DRS、High Available(HA)、fault tolerance(FT)、性能监控、安全备份等高可用性内容,敬请学习提高。 企业级 VMware vSphere 6.7虚拟化技术配置与管理(上集)视频课程:https://edu.csdn.net/course/detail/35162企业级 VMware vSphere 6.7虚拟化技术配置与管理(下集)视频课程:https://edu.csdn.net/course/detail/35171

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧