社区
嵌入开发(WinCE)
帖子详情
关于VirtualAlloc 函数的PAGE_NOACCESS问题:
jiereliyi
2009-12-28 04:42:18
1. PAGE_NOACCESS参数问题
PAGE_NOACCESS 为任何访问该区域的操作将被拒绝
pVMem = (PUCHAR)VirtualAlloc(0, PAGE_SIZE*3, MEM_RESERVE, PAGE_NOACCESS);
这里如果分配一快虚拟内存不能访问,分配它有什么用。2.我在看驱动的时候看到下面代码
...全文
440
10
打赏
收藏
关于VirtualAlloc 函数的PAGE_NOACCESS问题:
1. PAGE_NOACCESS参数问题 PAGE_NOACCESS 为任何访问该区域的操作将被拒绝 pVMem = (PUCHAR)VirtualAlloc(0, PAGE_SIZE*3, MEM_RESERVE, PAGE_NOACCESS); 这里如果分配一快虚拟内存不能访问,分配它有什么用。2.我在看驱动的时候看到下面代码
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
jiereliyi
2009-12-30
打赏
举报
回复
谢谢
FLandY1982
2009-12-29
打赏
举报
回复
学习了..
-小仙-
2009-12-29
打赏
举报
回复
很多驱动里面 尤其是在5.0之前 ! 直接用的是
0xB1200000
定义一个该设备控制器相关的结构体,然后将0xB1200000指向这个结构体就可以访问设备寄存器,而不用
VirtualAlloc :
和
VirtualCopy:
-小仙-
2009-12-29
打赏
举报
回复
VirtualAlloc :
MSDN:
This function reserves or commits a region of pages in the virtual address space of the
calling process.
所以 保留一段在calling process. 中的虚拟空间! 这段空间在MEM_RESERVE, PAGE_NOACCESS和参数下不可以被访问,只有通过VirtualCopy才可以直接使用!
-------------------
VirtualCopy:
MSDN:
This function dynamically maps a virtual address to a physical address by creating a new page-table entry.
其实我发现在很多驱动里面!VirtualCopy:是将VirtualAlloc过后的虚拟地址和与
设备寄存器关联
的地址进行绑定。
我这里用“设备寄存器关联” 是因为这样的例子:
pVMem = (PBYTE)VirtualAlloc(0, PAGE_SIZE*2, MEM_RESERVE, PAGE_NOACCESS);
if (pVMem) {
BOOL fSuccess = VirtualCopy(pVMem, (LPVOID)pContext->dwIOBase,
pContext->dwIOLen, PAGE_READWRITE | PAGE_NOCACHE);
}
dwIOBase, 是从注册表中读到的! 我这里取的是USB的例子 那么dwIOBase,就是0xB1200000
而0xB1200000就是virtual addresses。 0x91200000映射到Uncache field就是了!
DCD 0x91200000, 0x52000000, 1 ; USB device register
jiereliyi
2009-12-29
打赏
举报
回复
[Quote=引用 2 楼 guopeixin 的回复:]
主要用在首先预留内存,后面再进行使用的情况,如下:
一个比较好的分配512块特殊内存的方法是这样做:
#define PAGESIZE 1024 // Assume we're on a 1-KB page machine.
// Reserve a region first.
pMemBase = VirtualAlloc (NULL, PAGESIZE * 512, MEM_RESERVE,
PAGE_NOACCESS);
for (i = 0; i < 512; i++)
pMem[i] = VirtualAlloc (pMemBase + (i*PAGESIZE), PAGESIZE,
MEM_COMMIT, PAGE_READWRITE);
代码首先保留了一块区域,页面将在以后被提交。因为区域已经被先保留了,提交页就不受64-KB限制(译者注:只有保留页最小值受64KB限制),等等,如果你系统中有512KB的可用内存,分配将会成功。
[/Quote]
上边是预留MEM_RESERVE----只是在虚拟内存分配,下边是提交MEM_COMMIT参数指定----与物理内存关联,这样就可以使用了。
如果要和具体的内存地址关联,就需要调用VirtualCopy函数。
我这样理解对不对?
FrankBIBI
2009-12-29
打赏
举报
回复
学习了~~~~
guopeixin
2009-12-29
打赏
举报
回复
[Quote=引用 4 楼 jiereliyi 的回复:]
引用 2 楼 guopeixin 的回复:
主要用在首先预留内存,后面再进行使用的情况,如下:
一个比较好的分配512块特殊内存的方法是这样做:
#define PAGESIZE 1024 // Assume we're on a 1-KB page machine.
// Reserve a region first.
pMemBase = VirtualAlloc (NULL, PAGESIZE * 512, MEM_RESERVE,
PAGE_NOACCESS);
for (i = 0; i < 512; i++)
pMem[i] = VirtualAlloc (pMemBase + (i*PAGESIZE), PAGESIZE,
MEM_COMMIT, PAGE_READWRITE);
代码首先保留了一块区域,页面将在以后被提交。因为区域已经被先保留了,提交页就不受64-KB限制(译者注:只有保留页最小值受64KB限制),等等,如果你系统中有512KB的可用内存,分配将会成功。
上边是预留MEM_RESERVE----只是在虚拟内存分配,下边是提交MEM_COMMIT参数指定----与物理内存关联,这样就可以使用了。
如果要和具体的内存地址关联,就需要调用VirtualCopy函数。
我这样理解对不对?
[/Quote]
必须得,呵呵,就是这么回事
FLandY1982
2009-12-28
打赏
举报
回复
MSDN上是这样说的:
If you call VirtualAlloc with dwSize >= 2 MB, flAllocationType set to MEM_RESERVE, and flProtect set to PAGE_NOACCESS, it automatically reserves memory at the shared memory region. This preserves per-process virtual memory.
guopeixin
2009-12-28
打赏
举报
回复
主要用在首先预留内存,后面再进行使用的情况,如下:
一个比较好的分配512块特殊内存的方法是这样做:
#define PAGESIZE 1024 // Assume we're on a 1-KB page machine.
// Reserve a region first.
pMemBase = VirtualAlloc (NULL, PAGESIZE * 512, MEM_RESERVE,
PAGE_NOACCESS);
for (i = 0; i < 512; i++)
pMem[i] = VirtualAlloc (pMemBase + (i*PAGESIZE), PAGESIZE,
MEM_COMMIT, PAGE_READWRITE);
代码首先保留了一块区域,页面将在以后被提交。因为区域已经被先保留了,提交页就不受64-KB限制(译者注:只有保留页最小值受64KB限制),等等,如果你系统中有512KB的可用内存,分配将会成功。
-小仙-
2009-12-28
打赏
举报
回复
留着 下面的函数用!
VirtualCopy(pVMem, (LPVOID)pContext->dwIOBase,
pContext->dwIOLen, PAGE_READWRITE | PAGE_NOCACHE);
C++第3课:C++内存泄露检测原理及案例实战
C++第3课:C++内存泄露检测原理及案例实战本课程侧重于C++的内存管理及泄露检测。我将带领大家学习OS的内存管理机制、C++的堆和栈、内存泄露及检测等。本课程具体的内容主要包括C++内存泄露案例、VS2015内存泄露检测、野指针、
Virtu
a
lAlloc
/HeapAlloc/malloc/new的区别、C++堆和栈的内存管理、栈简介、堆简介、堆与栈区别、栈的内存分配、Windows的虚拟内存技术、Windows的内存映射文件技术、Linux的虚拟内存技术、Linux的Valgrind内存泄露检测、Windows的VLD内存泄露检测、C++内存泄露检测方式之对象计数、C++内存泄露检测方式之重载new和delete、C++内存泄露检测方式之智能指针等。
关于Windows API -
Virtu
a
lAlloc
最近在从事Driver的相关工作,碰到一个Windows API -
Virtu
a
lAlloc
。以前看到这样的API,便匆匆扫过,知道大概功能后便不去深究。今晚突然兴致来了,准备好好看下这个API. 1.
函数
功能:在调用进程的虚地址空间,预定或者提交一部分页 如果用于内存分配的话,并且分配类型未指定MEM_RESET,则系统将自动设置为0; 2.
函数
声明:
Virtu
a
lAlloc
的声
【游戏保护】监视内存页(基址 关键数据)非法访问
原理:对内存页面设置
PAGE
_NO
ACCESS
保护 当程序内访问改页面内数据时产生
ACCESS
_VIOLATION 产生异常被VEH捕获 VEH处理
函数
内还原内存页面
PAGE
_READWRITE属性 然后设置ExceptionInfo->ContextRecord->EFlags |= 0x100 单步异常 返回EXCEPTION_CONTINUE_EXECUTION 程序再次执行 触发单步异常 单步异常处理内再次对内存页面设置
PAGE
_NO
ACCESS
等待下次异常访问 用途:检测非法模块 内
操作系统:内存分配(C语言 winapi)
要求实现: 编写一个程序,创建两个线程,一个用于内存分配,另一个用于跟踪内存的分配情况并打印信息。 将
Virtu
a
lAlloc
函数
的参数ftAllocahonType分别改为MEM_RESET或MEM_TOP_DOWN,将nProtect参数分别改为
PAGE
_GUARD、
PAGE
_NO
ACCESS
或
PAGE
_NOCACHE,再进行本实验的各项操作,以及查看内存分配的各个结果,分析原因。 ...
Virtu
a
lAlloc
|
Virtu
alFree|
Virtu
alCopy |
Virtu
alProtect |
Virtu
alQuery - WINDOWS API 第七弹 为进程申请虚拟内存
我们知道计算机为了更加高效的使用物理内存,设计出了虚拟内存给进程使用,进程需要运行的话只需要将虚拟内存映射到物理内存即可,当然这也属于非常繁琐的计算机科学了,我们一步一步揭开这个api的神秘面纱吧。vitua
lalloc
系列的
函数
实现了windows进程虚拟内存向物理内存的转换,是比较底层和重要的api。还有一些,这些大家自己去找吧。夜已深,好梦。
嵌入开发(WinCE)
19,500
社区成员
41,567
社区内容
发帖
与我相关
我的任务
嵌入开发(WinCE)
硬件/嵌入开发 嵌入开发(WinCE)
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章