如何在wince中将虚地址转为实地址

来源:互联网 发布:阿里云应用发布平台 编辑:程序博客网 时间:2024/05/24 22:41

在WinCE开发中,尤其是驱动程序开发中,有时候我们需要得到某个buffer的真实物理地址,用于些寄存器,但是通常我们只有它在当前段中的虚地址。这就对程序的操作造成了麻烦。

 

下面就是将虚地址转为实地址的方法。

 

输入:PVOID p, DWORD size //其中p为buffer的虚地址

输出:DWORD[] m_PhysAddrArray, DWORD pageSize //m_PhysAddrArray为一个数组,该数组中存放有buffer各个page的起始实地址。

 

   DWORD pageSize = UserKInfo[KINX_PAGESIZE];  //UserKInfo是一个WinCE predefined的数组,它存放一些关于内存分配的信息。

 

   //取得buffer所涉及的最后一个page的起始虚地址
   DWORD alignMask = ~(pageSize-1);
   DWORD dwEndPageAddress = ((DWORD) p + size) & alignMask;

 

   //取得buffer开始地址所在的page的起始虚地址
   DWORD dwStartPageAddress = ((DWORD) p) & alignMask;

 

   //buffer所涉及的全部page的数目
   m_dwNbElement = 1 + ((dwEndPageAddress - dwStartPageAddress) / pageSize);

 

   //存放各page起始实地址的数组
   m_PhysAddrArray = new DWORD[m_dwNbElement];
   DWORD flags = LOCKFLAG_WRITE|LOCKFLAG_READ;

 

   //Lock 所有涉及的page,并且获得page的编号,0 based
   LockPages(p,size,m_PhysAddrArray,flags);

 

   //将page的编号乘以page的大小,就得到了page的起始物理地址
   DWORD dwPageShift= UserKInfo[KINX_PFN_SHIFT];
   for (DWORD i=0;i<m_dwNbElement;i++)
   {
        m_PhysAddrArray[i] = m_PhysAddrArray[i] <<  dwPageShift;
   }

原创粉丝点击