阅读:4683回复:14
内存分配问题:NonPagedPool,还是PagedPool?
最近看了一个例子:
??? 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;-->因为数组名称本来就是指向数组的指针,不是吗? 谢谢,各位指点! |
|
|
沙发#
发布于:2002-11-09 12:42
1。这样定义的变量应该在进程的stack中了,stack好像是非分页的
看这个 http://www.driverdevelop.com/forum/html_25297.html?1036817040 2. 这句说明descriptorBuffer是指向一个指针变量的指针,不能说对错,看他后面怎么用了 [编辑 - 11/9/02 by gung] |
|
板凳#
发布于:2002-11-09 13:57
最近看了一个例子: 1.驱动程序中的局部变量从系统堆栈中分配,是属于分页的 2.没有错误,不过更正确的写法应该如下: descriptorBuffer = &tempBuffer[0] 你会发现下面三种写法的结果是相同的: descriptorBuffer = &tempBuffer; descriptorBuffer = tempBuffer; descriptorBuffer = &tempBuffer[0]; 但第一种写法着实少见。 |
|
|
地板#
发布于:2002-11-09 14:50
[quote你会发现下面三种写法的结果是相同的:
descriptorBuffer = &tempBuffer; descriptorBuffer = tempBuffer; descriptorBuffer = &tempBuffer[0]; 但第一种写法着实少见。 [/quote] 是吗?我觉得第一种方法是错误的,除非他声明为PVOID * descriptorBuffer,让我试一下先。 |
|
地下室#
发布于:2002-11-09 15:44
:) :) :)呵呵,谢谢大家指点,我心里有了一点谱了
囊中羞涩,分不在多意思就行噢 |
|
|
5楼#
发布于:2002-11-09 16:06
[quote]最近看了一个例子: 1.驱动程序中的局部变量从系统堆栈中分配,是属于分页的 2.没有错误,不过更正确的写法应该如下: descriptorBuffer = &tempBuffer[0] 你会发现下面三种写法的结果是相同的: descriptorBuffer = &tempBuffer; descriptorBuffer = tempBuffer; descriptorBuffer = &tempBuffer[0]; 但第一种写法着实少见。 [/quote] 1.驱动程序中的局部变量从系统堆栈中分配,是属于分页的 我觉的系统堆栈是非分页的,否则在中断函数里面就不能用局部变量了。 |
|
6楼#
发布于:2002-11-09 16:42
不清楚,不过中断服务例程中也可以用分页内存的呀,只要锁定就行的
|
|
7楼#
发布于:2002-11-09 17:40
:)我看到正式的表述了:内核堆栈是驱动程序例程执行期间,系统为局部变量提供总量有限的非分页存储。在x86平台上,内核堆栈只有12k(又为生么?)。其它平台上,堆栈大小是16k.
|
|
|
8楼#
发布于:2002-11-09 19:04
局部变量是分页的,但是无所谓,因为它在你使用的时候不会被交换出去。
descriptorBuffer = &tempBuffer; 可能会没有错误,但最好强制转换一下 descriptorBuffer = (PVOID)&tempBuffer; 不过取得的指针地址肯定没有错误 |
|
|
9楼#
发布于:2002-11-10 10:07
在驱动程序中使用的内存资源:
1)系统堆栈,X86为12K大小,非分页,任何IRQL可用。 2)分页池, DISPATCH_LEVEL以下可用。 3)非分页池,任何IRQL可用。 |
|
|
10楼#
发布于:2002-11-10 10:40
:)我看到正式的表述了:内核堆栈是驱动程序例程执行期间,系统为局部变量提供总量有限的非分页存储。在x86平台上,内核堆栈只有12k(又为生么?)。其它平台上,堆栈大小是16k. 内核栈并不是简单的分页或不分页,每线程有其私属的核心栈,NT中与线程状态有关。上面的描述是准确的,注意“例程执行期间”这个限定词较为重要。核心栈是否固定由线程的一标志决定,一般来说,就绪队列中的内核线程此标志为一,其栈均常驻内存,所以当前线程栈自然视其为非分页的(努力存于cache)。 12k已比较大了(你能用得没这么多,大多少0x220字节左右),linux仅有7k左右,够用就行,再大当active的线程太多时太费内存。不过不要在里面验证你的递归算法:)。 |
|
11楼#
发布于:2002-11-10 13:51
哥们,说的有道理。佩服。哥们你是那个山头的好汉?上次多亏你帮忙。
|
|
12楼#
发布于:2002-11-10 22:37
据我所知,内核stack的大小并不跟处理器有关,而跟操作系统有关,具体看它的操作系统中是怎么写的了
看来他们是这样定义的 #ifdef __X86 AllocateStackPageNum=3 #else AllocateStackPageNum=2 因为在x86平台下页的大小为4k,而有的平台是8k的 x86当然是>=386的机器 |
|
13楼#
发布于:2002-11-10 22:45
分页内存和非分页内存的区别即是是不是把经过一段时间还没有用的内存交换到硬盘上,具体的实现么大概可以这样定义
if PageEntryX & 32 if PageEntryX 是分页内存 交换到硬盘上 else .... else .... PageEntryX为页表内的第X项 32为第六位,如此位置位则代表内存中的内容已经修改过,需交换到硬盘上 |
|
14楼#
发布于:2002-11-11 10:27
有点ft,如果你觉得上面的所有的话有什么问题可以直接说,不用让别人猜你的用意。
据我所知,内核stack的大小并不... ----------------------------------------------------------------------- 似乎不沾边,不知用意。 分页内存和非分页内存的区别即是... ---------------------------------------------------------------------- 是否针对“内核栈并不是简单的分页或不分页”这句话?NT架构系统的KTHREAD中的KernelStackResident即指出核心栈是否固定,对于当前栈系统锁定之,不可分页;对于挂起的线程的栈,可分页,实际上内存不充裕时大多都被换出。ft |
|