转换内存中的数据结构失败
答案:1 悬赏:0 手机版
解决时间 2021-08-19 12:45
- 提问者网友:玫瑰园
- 2021-08-18 12:06
读取二进制文件并把读入的文件内容专为内存中的数据结构,我用int()函数强制转换,但转换失败,哪位高手指点一下,,,读入的内容和长度不会有问题
最佳答案
- 五星知识达人网友:从此江山别
- 2021-08-18 12:35
一、 进程的虚拟地址空间每个进程都被赋予自己的虚拟地址空间,对于32位进程来说,这个地址空间为4G,因此进程中的地址可以为0x00000000至0xFFFFFFFF之间的任何一个值。其中4G空间中的低区的2G空间留给进程使用,而高区的2G空间则留给系统使用。在Windows2000下,分区情况为:1、 NULL指针分配的分区NULL指针分配的分区占据0x00000000至0x0000FFFF,该分区的设置是为了帮助程序员掌握NULL指针的分配情况。例如当malloc或new分配失败时就返回NULL,该分区的地址是禁止进入的,访问该分区内的地址将发生访问违规现象,同时终止该进程的运行。2、 用户方式分区该分区是进程私有的地址空间,对于应用程序来讲,该分区是维护进程的大部分数据的地方,所有的.exe和dll模块均加载在这个分区,每个进程可以将dll加载到不同的地址中。对于.exe而言,一般加载到0x00400000地址处。进程的栈和堆也是在该分区中开辟的。3、 禁止进入分区该分区是用户方式分区上禁止进入的分区,位于0x7FFF0000至0x7FFFFFFF,访问该分区的任何企图均将导致访问违规,该分区的存在是为了防止用户从用户区访问内核区的代码。如:BYTE buf[70000];DWORD numWritten;WriteProcessMemory(GetCurrentProces(), (PVOID)0x7FFEEE90, buf, sizeof(buf), &numWritten);将有可能成功地将数据写入只能有内核方式代码访问的内存。4、 内核方式分区该分区是存放操作系统代码的地方,用于线程调度、内存管理、文件系统支持、网络支持和所有设备驱动程序的代码全部在这个分区加载驻留在该分区的一切均可被所有近进程共享。二、 虚拟内存的实现本质上虚拟内存就是要让一个程序的代码和数据再没有全部载入内存的情况下运行程序。运行过程中,当执行到尚未载入的内存代码,或者要访问还没有载入到内存的数据时,虚拟内存管理器动态的将这部分代码或数据从硬盘载入到内存中。而且在通常情况下,虚拟内存管理器也会相应的将内存中某些代码或者数据置换到硬盘中,为即将载入的代码或数据腾出地方。Win32中用来辅助实现虚拟内存的硬盘文件称为“调页文件”,调页文件用来存放被虚拟内存管理器置换处内存的数据,当这些数据再次被进程访问时,虚拟内存管理器会先将它们从调页文件中置换进内存,这样进程可以正确访问这些数据。程序代码(包括exe和dll文件)不会被修改,所以他们所在的页被置换处内存时,并不会被写进调页文件中,而是直接抛弃,当再次被需要时,虚拟内存管理器直接从存放他们的exe或dll文件中找到他们并调入内存。三、 虚拟内存的状态近处虚拟地址空间中的页有三种状态:自由(free)、预留(reserved)和提交(committed)。1、自由自由表示此页尚未分配出去,可以用来满足新的内存分配请求。2、预留预留是指从虚拟地址空间中划出一块区域(页的整数倍大小),划出之后的区域中的页不能用来满足新的内存分配请求,只是用来供要求“预留”此段区域的代码以后使用,预留状态的区域并没有分配物理存储,只是增加了一个描述进程虚拟地址空姐使用状态的数据结构,用来记录这块区域已倍预留。 3、提交提交内存时会从调页文件中开辟空间,并修改VAD中的相应项。当然,此时并没有立刻从物理内存中分配空间,只是从磁盘的调页文件中开辟空间。当有代码第一次访问这段提交内存中的某些数据时,系统发现并没有真正的物理内存,抛出缺页异常,虚拟内存管理器处理该异常,此时才会真正的分配物理内存。四、 虚拟内存状态的管理Win32虚拟内存管理器使用一个数据结构(Virtual Address Descriptor, VAD)来记录和维护每个进程4G的虚拟地址空姐的使用及状态,美国进程都有自己的VAD集合,这个集合被组织成一个自平衡二叉树。只有预留或提交的内存块才有VAD,自由的内存块没有VAD,因此不在VAD数据结构中的虚拟地址就是自由的。每块VAD数据结构记录了该块的起始地址以及当前状态。五、 访问虚拟内存时的处理流程对某虚拟内存区域进行了预留并提交之后,就可以对该区域中的数据进
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯