cquwyb
驱动牛犊
驱动牛犊
  • 注册日期2002-05-10
  • 最后登录2010-10-23
  • 粉丝0
  • 关注0
  • 积分160分
  • 威望16点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
阅读:4682回复:14

内存分配问题:NonPagedPool,还是PagedPool?

楼主#
更多 发布于:2002-11-09 11:02
最近看了一个例子:
???
PVOID descriptorBuffer = NULL;
???
// Get the configuration descriptor (first 9 bytes)
UCHAR tempBuffer[9];
descriptorBuffer = &tempBuffer;
???
问题出来了:
1,程序使用这样的定义UCHAR tempBuffer[9];
   那么这9个字节从NonPagedPool,还是PagedPool分配
2,好像这句descriptorBuffer = &tempBuffer;
   有语法错误吧:是否应当descriptorBuffer = tempBuffer;-->因为数组名称本来就是指向数组的指针,不是吗?

谢谢,各位指点!
HonestTreee
gung
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2008-04-21
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-09 12:42
1。这样定义的变量应该在进程的stack中了,stack好像是非分页的
看这个
http://www.driverdevelop.com/forum/html_25297.html?1036817040
2. 这句说明descriptorBuffer是指向一个指针变量的指针,不能说对错,看他后面怎么用了

[编辑 -  11/9/02 by  gung]
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-09 13:57
最近看了一个例子:
???
PVOID descriptorBuffer = NULL;
???
// Get the configuration descriptor (first 9 bytes)
UCHAR tempBuffer[9];
descriptorBuffer = &tempBuffer;
???
问题出来了:
1,程序使用这样的定义UCHAR tempBuffer[9];
   那么这9个字节从NonPagedPool,还是PagedPool分配
2,好像这句descriptorBuffer = &tempBuffer;
   有语法错误吧:是否应当descriptorBuffer = tempBuffer;-->因为数组名称本来就是指向数组的指针,不是吗?

谢谢,各位指点!

1.驱动程序中的局部变量从系统堆栈中分配,是属于分页的
2.没有错误,不过更正确的写法应该如下:
  descriptorBuffer = &tempBuffer[0]
你会发现下面三种写法的结果是相同的:
descriptorBuffer = &tempBuffer;
descriptorBuffer = tempBuffer;
descriptorBuffer = &tempBuffer[0];
但第一种写法着实少见。
Tom_lyd
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
地板#
发布于:2002-11-09 14:50
[quote你会发现下面三种写法的结果是相同的:
descriptorBuffer = &tempBuffer;
descriptorBuffer = tempBuffer;
descriptorBuffer = &tempBuffer[0];
但第一种写法着实少见。 [/quote]
是吗?我觉得第一种方法是错误的,除非他声明为PVOID * descriptorBuffer,让我试一下先。
cquwyb
驱动牛犊
驱动牛犊
  • 注册日期2002-05-10
  • 最后登录2010-10-23
  • 粉丝0
  • 关注0
  • 积分160分
  • 威望16点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-11-09 15:44
 :) :) :)呵呵,谢谢大家指点,我心里有了一点谱了
囊中羞涩,分不在多意思就行噢
HonestTreee
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-11-09 16:06
[quote]最近看了一个例子:
???
PVOID descriptorBuffer = NULL;
???
// Get the configuration descriptor (first 9 bytes)
UCHAR tempBuffer[9];
descriptorBuffer = &tempBuffer;
???
问题出来了:
1,程序使用这样的定义UCHAR tempBuffer[9];
   那么这9个字节从NonPagedPool,还是PagedPool分配
2,好像这句descriptorBuffer = &tempBuffer;
   有语法错误吧:是否应当descriptorBuffer = tempBuffer;-->因为数组名称本来就是指向数组的指针,不是吗?

谢谢,各位指点!


1.驱动程序中的局部变量从系统堆栈中分配,是属于分页的

2.没有错误,不过更正确的写法应该如下:
  descriptorBuffer = &tempBuffer[0]
你会发现下面三种写法的结果是相同的:
descriptorBuffer = &tempBuffer;
descriptorBuffer = tempBuffer;
descriptorBuffer = &tempBuffer[0];
但第一种写法着实少见。 [/quote]

1.驱动程序中的局部变量从系统堆栈中分配,是属于分页的

我觉的系统堆栈是非分页的,否则在中断函数里面就不能用局部变量了。
gung
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2008-04-21
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-11-09 16:42
不清楚,不过中断服务例程中也可以用分页内存的呀,只要锁定就行的
cquwyb
驱动牛犊
驱动牛犊
  • 注册日期2002-05-10
  • 最后登录2010-10-23
  • 粉丝0
  • 关注0
  • 积分160分
  • 威望16点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-11-09 17:40
 :)我看到正式的表述了:内核堆栈是驱动程序例程执行期间,系统为局部变量提供总量有限的非分页存储。在x86平台上,内核堆栈只有12k(又为生么?)。其它平台上,堆栈大小是16k.
HonestTreee
Buddha
驱动老牛
驱动老牛
  • 注册日期2001-04-29
  • 最后登录2013-05-18
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望17点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-11-09 19:04
局部变量是分页的,但是无所谓,因为它在你使用的时候不会被交换出去。
descriptorBuffer = &tempBuffer;
可能会没有错误,但最好强制转换一下
descriptorBuffer = (PVOID)&tempBuffer;
不过取得的指针地址肯定没有错误
<table style="filter: glow(color=sky blue, strength=10)"> <font color=white> 猫生病了, 老鼠大声朗诵诗集, 并修剪盆花. 猫生病了, 老鼠慢慢刷牙洗脸, 并打扫房间. 猫生病了, 老鼠倚在窗边欣赏夜色, 并对流星许愿. 猫生病了, 老鼠也病了, 它说:"我还是习惯那种时时紧张, 处处小心, 夜夜逃亡的生活." 午夜, 我听到老鼠在叹息, 且不再读诗了. </font></table>
monkeyy
驱动中牛
驱动中牛
  • 注册日期2001-12-06
  • 最后登录2010-10-10
  • 粉丝0
  • 关注0
  • 积分315分
  • 威望84点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-11-10 10:07
在驱动程序中使用的内存资源:
1)系统堆栈,X86为12K大小,非分页,任何IRQL可用。
2)分页池, DISPATCH_LEVEL以下可用。
3)非分页池,任何IRQL可用。
听说老虎会吃人,所以从没想过去摸老虎的屁股。:( :(
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-11-10 10:40
:)我看到正式的表述了:内核堆栈是驱动程序例程执行期间,系统为局部变量提供总量有限的非分页存储。在x86平台上,内核堆栈只有12k(又为生么?)。其它平台上,堆栈大小是16k.


内核栈并不是简单的分页或不分页,每线程有其私属的核心栈,NT中与线程状态有关。上面的描述是准确的,注意“例程执行期间”这个限定词较为重要。核心栈是否固定由线程的一标志决定,一般来说,就绪队列中的内核线程此标志为一,其栈均常驻内存,所以当前线程栈自然视其为非分页的(努力存于cache)。

12k已比较大了(你能用得没这么多,大多少0x220字节左右),linux仅有7k左右,够用就行,再大当active的线程太多时太费内存。不过不要在里面验证你的递归算法:)。
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-11-10 13:51
哥们,说的有道理。佩服。哥们你是那个山头的好汉?上次多亏你帮忙。
snk12
驱动牛犊
驱动牛犊
  • 注册日期2001-10-25
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望4点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
  • 社区居民
12楼#
发布于:2002-11-10 22:37
据我所知,内核stack的大小并不跟处理器有关,而跟操作系统有关,具体看它的操作系统中是怎么写的了

看来他们是这样定义的
#ifdef __X86
    AllocateStackPageNum=3
#else
    AllocateStackPageNum=2


因为在x86平台下页的大小为4k,而有的平台是8k的
x86当然是>=386的机器
snk12
驱动牛犊
驱动牛犊
  • 注册日期2001-10-25
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望4点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
  • 社区居民
13楼#
发布于:2002-11-10 22:45
分页内存和非分页内存的区别即是是不是把经过一段时间还没有用的内存交换到硬盘上,具体的实现么大概可以这样定义
if PageEntryX & 32
    if PageEntryX 是分页内存
        交换到硬盘上
    else
        ....
else
    ....

PageEntryX为页表内的第X项
32为第六位,如此位置位则代表内存中的内容已经修改过,需交换到硬盘上
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-11-11 10:27
有点ft,如果你觉得上面的所有的话有什么问题可以直接说,不用让别人猜你的用意。


据我所知,内核stack的大小并不...
-----------------------------------------------------------------------
似乎不沾边,不知用意。



分页内存和非分页内存的区别即是...
----------------------------------------------------------------------
是否针对“内核栈并不是简单的分页或不分页”这句话?NT架构系统的KTHREAD中的KernelStackResident即指出核心栈是否固定,对于当前栈系统锁定之,不可分页;对于挂起的线程的栈,可分页,实际上内存不充裕时大多都被换出。ft
游客

返回顶部