2014-10-03 5 views
1

이 코드 http://fivelinesofcode.blogspot.com/2014/03/how-to-translate-virtual-to-physical.html을 사용하면/proc/"pid"/ maps에서 가져온 주어진 가상 주소와 관련된 pfn을 덤프 할 수 있습니다./proc/<pid>/pagemap에서 pfn을 덤프하면 예상되는 내용이 제공되지 않습니다.

일단 PFN을 얻으면 특정 커널 모듈로 덤프합니다. 이 코드의 조각이다 : 그러나

static int write_pfn(phys_addr_t pfn) 
{ 
    struct page *p; 
    void *v; 
    int s =0,ret =0; 

    p = pfn_to_page((pfn) >> PAGE_SHIFT); 
    v = kmap(p); 

    DBG("Writing page %d(mapped addr=0x%lx) - pfn: 0x%lx", p,v,pfn); 

    s = write_vaddr(v, PAGE_SIZE); 

    if (s != PAGE_SIZE) { 
     DBG("Error sending page %d(addr=0x%lx)", s,v); 
     return (int) s; 
     ret-=1; 
    }    
    kunmap(p); 

    return ret; 
} 

, 나는 비교하면 PFN이 내용이 완전히 다른 것보다, 과정 내에서 해당 가상 주소의 실제 내용 커널 모듈 버려진 것으로 나타났습니다 . (gdb)의 "x"명령을 사용하여 프로세스 가상 주소의 내용을 덤프합니다.

아이디어가 있으십니까?

Linux 3.14.7-rt5 #1 SMP Mon Jun 23 14:55:19 CEST 2014 x86_64 GNU/Linux 

답변

0

논리적 솔루션이 정확하지만, i'am 페이지지도 리더 코드의 정확성 확실하지 않다 : 이것은 내 커널 버전입니다. 어쨌든, 그것을 확인하는 방법이 있습니다. 당신은 (대상 응용 프로그램의 맥락에서) 커널 내부에있는 동안이 커널 API를 사용하여 지정된 VA에 해당하는 페이지를 얻을 수 :

1. mm = current->mm 
2. struct vm_area_struct *find_vma(struct mm_struct *mm, unsigned long addr) 
3. static inline struct page *follow_page(struct vm_area_struct *vma, 
       unsigned long address, unsigned int foll_flags) 
4. page_to_pfn 

당신이를 구현할 수 및 결과와 비교, 희망이 도움이 될 것입니다.

0

알렉스. 솔루션에 문제가 있으므로 일부 기호가 내보내기되지 않았습니다 (예 : follow_page()). 따라서 모듈에서 사용할 수 없습니다.

그러나이 해결책을 찾았습니다 : mm = ts-> mm;

pgd_t * pgd = pgd_offset(mm, vaddr); 
pud_t * pud = pud_offset(pgd, vaddr); 
pmd_t * pmd = pmd_offset(pud, vaddr); 
pte_t * pte = pte_offset_map(pmd, vaddr); 
p = pte_page(*pte); 
if(p) 
    DBG("page frame struct is @ %p", p); 

v = kmap(p); 

DBG("Writing page 0x%lx(mapped addr=0x%lx) - pid: %d", v,vaddr,pidnr); 

s = write_vaddr(v, PAGE_SIZE); 

if (s != PAGE_SIZE) { 
    DBG("Error sending page %d(addr=0x%lx pid=%d)", v,vaddr,pidnr); 
    ret-=1; 
}    
kunmap(p); 
pte_unmap(pte);