鱼C论坛

 找回密码
 立即注册
查看: 4899|回复: 2

分页和非分页内存

[复制链接]
发表于 2015-4-1 15:57:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

windows规定有些虚拟内存页面是可以交换到文件中的,这类内存被称为分页内存。还有一些虚拟内存是永远不会交换到文件中,这类内存被称为非分页内存。当程序的中断请求级别在DISPATCH_LEVEL之上的时候(包括DISPATCH_LEVEL层)。程序只能使用非分页内存,否则会导致蓝屏

我们可以指定某个例程和某个全局变量是载入分页内存还是非分页内存。需要做如下的定义


[cpp] view plaincopy


  • #pragma PAGEDCODE   
  • VOID SomeFunc()  
  • {  
  •     PAGED_CODE();  
  •   
  • }  


其中PAGED_CODE()是DDK的一个宏。他只在check版本中生效。他会检测这个函数是否运行在低于DISPATCH_LEVEL的中断请求级。如果高于或者等于这个中断请求级。他将产生一个断言。

PAGED_CODE宏定义如下:


[cpp] view plaincopy


  • #define PAGED_CODE() {                                                       \  
  •     if (KeGetCurrentIrql() > APC_LEVEL) {                                    \  
  •         KdPrint(("EX: Pageable code called at IRQL %d\n", KeGetCurrentIrql())); \  
  •         PAGED_ASSERT(FALSE);                                                    \  
  •     }                                                                        \  
  • }  


如果让函数加载到非分页内存。需要在函数的实现中加入如下东西

[cpp] view plaincopy


  • #pragma LOCKEDCODE   
  • VOID SomeFunc()  
  • {  
  •     PAGED_CODE();  
  •   
  • }  

其中事先做如下定义:

[cpp] view plaincopy


  • #define PAGEDCODE code_seg("PAGE")  
  • #define LOCKEDCODE code_seg()  
  • #define INITCODE code_seg("INIT")  
  •   
  • #define PAGEDDATA data_seg("PAGE")  
  • #define LOCKEDDATA data_seg()  
  • #define INITDATA data_seg("INIT")  


#pragma INITCODE的作用是初始化的时候载入内存,然后就可以从内存中卸载掉了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-4-7 14:49:21 | 显示全部楼层
I'm a Test
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-6 12:37:58 | 显示全部楼层
试一下,感谢分享!!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 10:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表