首先表示歉意的是这个问题也许不是内核调试的问题,但我觉得其它版面也不合适,因此放在这里咨询。
我最初了解PAGE_GUARD是看windows创建线程对线程堆栈进行分配的时候,我google和msdn了下,有个
http://msdn.microsoft.com/en-us/library/aa366549(VS.85).aspx
这个示例中,先用VirtualAlloc分配了一个页面,然后连续两次VirtualLock访问,结果第一次不行,第二次就可以了。
我发现有个奇怪的事情,在VirtualAlloc后,我立即对分配的页面进行读访问,发现在VC调试的情况下不会有问题,但不调试,就会出问题;而且调试的时候后面的第一次VirtualLock有时也不会出问题了,感觉很奇怪
lpvAddr = VirtualAlloc(NULL, dwPageSize, MEM_RESERVE | MEM_COMMIT, PAGE_READONLY | PAGE_GUARD); ...........
//下面这个代码是我添加的,发现调试情况下不会出问题,而且后面的第一次VirtualLock有时也不会出问题了,感觉很奇怪
DWORD * MYWORD; __asm { mov eax, lpvAddr } __asm { mov MYWORD, eax} printf("test1\n"); DWORD aa = MYWORD[0]; // Try to lock the committed memory. This fails the first time // because of the guard page. bLocked = VirtualLock(lpvAddr, dwPageSize); if (!bLocked) { fprintf(stderr, "Cannot lock at %lp, error = 0x%lx\n", lpvAddr, GetLastError()); } else { fprintf(stderr, "Lock Achieved at %lp\n", lpvAddr); }
bLocked = VirtualLock(lpvAddr, dwPageSize); if (!bLocked) { fprintf(stderr, "Cannot get 2nd lock at %lp, error = %lx\n", lpvAddr, GetLastError()); } else { fprintf(stderr, "2nd Lock Achieved at %lp\n", lpvAddr); }
jlflyfox, 因为解释比较长,所以写了篇博客:
http://advdbg.org/blogs/advdbg_system/articles/1354.aspx
如果还有疑问,那么请直言。使用WinDBG调试JVM也是我要做的一件事,很期待你能把你的想法、经历和收获拿出来讨论。