代码如下:
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_buflinear address(v1)的copy_from_user(head->v_buf,v1,page_size[0])主流程所谓的主从进程是继fork()+execv().They之后的另一个进程.
问题是:k_addr = kmap_atomic(pg,KM_USER1)+(addr&(PAGE_SIZE-1));的含义是什么?为什么?
发布于 2016-05-05 05:16:06
pg = pte_page(*pte);将得到一个页面描述.So原子(pg,KM_USER1),它将获得页面.then的高度+ k_addr =(addr&( page _SIZE-1)将得到内核的var地址。
https://stackoverflow.com/questions/36985657
复制相似问题