2016-05-02 2 views
1

:コードでパラメータkmap_atomic()の(KM_USER1)コードがfolloingさ

asmlinkage s32 vir_to_kaddr(unsigned long v,struct p_header_s *head,u32){ 
    struct mm_struct *mm = head->task->mm; 
    pgd_t *pgd; 
    pmd_t *pmd; 
    #ifdef PTRS_PER_PUD 
     pud_t *pud; 
    #endif 
    pte_t *pte; 
    struct page *pg; 
    s32 ret = 0; 
    u32 addr = (u32)v; 
    s8 *k_addr ; 
    spin_lock(&mm->page_table_lock); 
    pgd = pgd_offset(mm,addr); 
    if (pgd_none(*pgd)) 
    { 
     ret = -1; 
     goto out; 
    } 
    #ifdef PTRS_PER_PUD 
    pud = pud_offset(mm,addr); 
    if (pud_none(*pud)) 
    { 
     ret = -2; 
     goto out; 
    } 
    pmd = pud_offset(pud,addr); 
    #else 
    pmd = pmd_offset(pgd,addr); 
    #endif 
    if (pmd_none(*pmd)) 
    { 
     ret = -3; 
     goto out; 
    } 
    pte = pte_offset_map(pmd,addr); 
    if (pte_present(*pte)) 
    { 
     pg = pte_page(*pte); 
     if (IS_ERR(pg)) 
     { 
      ret = -4; 
      goto out; 
     } 
     pte_unmap(pte); 
    } 
    else if (pte_none(*pte)) 
    { 
     pte_unmap(pte); 
     ret = -5; 
     goto out; 
    } 
    k_addr = kmap_atomic(pg,KM_USER1)+(addr&(PAGE_SIZE-1)); 
    ret = memcpy(k_addr,head->v_buf); 
    kunmap_atomic(k_)addr,KM_USER1); 
    if (ret) 
    { 
     ret = -6; 
    } 
    out: 
     spin_unlock(&mm->page_table_lock); 
     return ret; 
} 

  • パラメータv
  • head->task->mmスレーブ・プロセスの線形アドレス:メモリスレーブプロセスのディスクリプタ
  • head->v_buff:head->v_buf:マスタープロセスのlinear address(v1)copy_from_user(head->v_buf,v1,page_size[0])

いわゆるマスタプロセスとスレーブプロセスは、fork()+execv()の後の別のプロセスです。これらは同じです。

質問は次のとおりです:k_addr = kmap_atomic(pg,KM_USER1)+(addr&(PAGE_SIZE-1));の意味はなんですか?

答えて

1

pg = pte_page(* pte); (pg、KM_USER1)は、ページのハイムメイルを得るでしょう。そして、k_addr =(addr &(PAGE_SIZE-1)は、カーネルのvarアドレスになります。

関連する問題