300分向各位同行請教一下關於內存分配的問題,300分求三個問題的解,謝謝你的幫助!


由於當前的項目需要,我需要在計算機的物理內存中分配一塊64K字節大小的連續地址長度給應用程序!
直接訪問物理內存以及鎖定已分配的物理內存為我獨占不允許系統操作等工作我已經完成了,現在讓我困惑的是:
1.我不知道內存中那一地址區域是我可以進行讀寫操作的,如何得到內存地址表?
2.如何知道某一塊內存空間是否被其它程序或系統占用?
3.最重要的是我分配的64K字節的空間如何保存為可安全讀寫且未被使用的連續地址空間?
謝謝!300分求這3個問題的解,每個問題各一百分!解決一個問題給一個問題的分!

22 个解决方案

#1


xxxx

#2


1和2
IsBadReadPtr();IsBadWritePtr();
申明如下
BOOL IsBadWritePtr(
  LPVOID lp,     // memory address
  UINT_PTR ucb   // size of memory block
);

3既然你可以獨占,保存應該不是問題吧

#3


發表下意見,探討下好了:
1.GlobalAlloc或者AllocateUserPhysicalPages不能用嗎(Win2000以上版本)?
2.如果將內存分配交給系統,應該就不會有這個問題了吧。
3.迷惑中...

#4


TO: bobob(靜思--潛心研究PDF)
IsBadReadPtr()和IsBadWritePtr()兩個函數只能判斷某一空間是否具有完整的內存讀寫的能力,而不能幫我找到這樣的64K字節可以讀寫的並且沒有被其它程序以及系統占用的空間,我關鍵是要在內存中找到這樣一段空間!

#5


第一個參數是空間開始位置,第二個是長度.
我不明白你的意思?

#6


IsBadReadPtr();IsBadWritePtr();

#7


mark

#8


TO: bobob(靜思--潛心研究PDF)
既然第一個參數是空間開始位置,第二個是長度,那么這段內存空間就唯一確定了,但如果我分配的這段內存空間在我使用之前已被其它程序或者系統使用了,那么我還要去重新找第二段內存空間,這個尋找過程太麻煩了,而且有可能根本不能找到,我的意思就是如何自動分配一塊64K字節大小且未被使用的連續的內存空間,就是說在內存中找到具有我說的特性的物理內存空間的起始地址返回就行了,不知這次我說清楚沒有?

#9


直接new不可以嗎?

#10


樓主我想問一下你這樣作的目的是什么?

#11


TO: bobob(靜思--潛心研究PDF)
也可以,但有一個問題.
直接NEW出來的是線性地址,那么我如何得知這段線性地址所對應的物理地址?

#12


進程的線性地址到物理地址的映射關系是通過“頁表”來完成的,也就是說進程的線性
地址是由若干的(很可能是不連續的)物理內存頁“拼”出來的。
我現在的問題就是如何得到一段連續的並且未被使用的物理內存?

#13


該回復被版主刪除

#14


保證連續(至少在我電腦上是這樣:VC6+XP):
#include <winbase.h>

/////////////
char far* m_pChar;
//////////////////
void CMemoryTestDlg::OnButton1() 
{
// TODO: Add your control notification handler code here
m_pChar=(char far*)VirtualAlloc(NULL,\
  64*1024,     // size of region
  MEM_RESERVE,
                    // type of allocation
  PAGE_READWRITE   // type of access protection
);
 

}

void CMemoryTestDlg::OnButton2() 
{
// TODO: Add your control notification handler code here
DWORD dwBaseAdd;
char ch[20];
         CString str;
if(!m_pChar)
AfxMessageBox("VirtualAlloc Failed");
else
{

dwBaseAdd=(DWORD)m_pChar;
_i64toa(dwBaseAdd,ch,16);
                  str.Format("起始地址:%s",ch);
AfxMessageBox(str);
AfxMessageBox("VirtualAlloc Successed!");
}
}

void CMemoryTestDlg::OnButton3() 
{
if(m_pChar)
{
m_pChar=(char far*)VirtualAlloc(m_pChar,\         //將其轉化為可操作
  64*1024,     // size of region
 MEM_COMMIT,    // type of allocation
PAGE_READWRITE   // type of access protection
);
for(int i=0;i<64*1024;i++)
{//填充該區域
*m_pChar=(char)(i%255);
m_pChar++;
}
}
}

void CMemoryTestDlg::OnButton4() 
{
if(!m_pChar)
AfxMessageBox("VirtualAlloc Failed");
else
{

AfxMessageBox("VirtualAlloc Successed!");
if(VirtualFree(m_pVoid,64*1024,MEM_DECOMMIT|MEM_RELEASE))
AfxMessageBox("VirtualFree Successed!");
else
AfxMessageBox("VirtualFree Failed!");
}
}

#15


為什么要連續的?就是在驅動中也很少有這樣的要求。通常都是分配一頁,然后末尾值指向Next頁。
樓主還是把原因說明白好。說不定可以用其他方法繞過

#16


mark!

#17


具體要談原因就要說很多了,可以簡單地說一下,在DSP和HOST進行數據傳輸時我采用了EDMA方式,該方式必須指定HOST端一段連續的且未被使用物理地址以保證運行正常!

#18


感謝xhzxlqt(真的真的好想你)的回答,我按照你的方法試了一下,但遇到以下幾個問題(我的運行平台和你一樣,也是XP+VC6)
1.為什么我每次運行程序,申請的m_pChar地址都是同一個值,都是0XC10000?
2.為什么我用VirtualFree釋放空間時每次都是VirtualFree Failed!"?
3.請問利用該方法申請的內存空間是物理內存還是線性內存?m_pChar的物理內存首地址和線性內存首地址是同一個值嗎?
4.如何保證我們申請的這一段存儲空間未被其它程序或者系統使用?
5.你是如何保證這段空間是連續的,在你的電腦上面你是如何測試的?

#19


在你另一貼中已經回答
該函數能滿足你的要求
如果你需要的內存更大,可以使用VLM(VERY LARGE MEMORY)系列函數

#20


謝謝各位的回答,可能是我沒說清楚,我想得到的是計算機物理內存中一段連續可用的大小為64K字節的空間,並知道這段空間的首地址!這里指的是實實在在的計算機內存的物理地址,並不是說得到由系統分配的線性內存空間!請問如何得到這樣一段物理內存空間,並得知其物理首地址?

#21


物理內存的空間,只有Windows自己能得到了

#22


個人以為一般程序能知道首地址已經可以了,除非你是開發操作系統

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com