双进程局部变量比较
asmlinkages32 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);
}
elsse 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;
}
我的问题是 k_addr = kmap_atomic(pg,KM_USER1)+(addr&(PAGE_SIZE-1));这句话是啥意思? 代码注释:
unsigned long v:要对比变量在从进程中的线性地址
head-task->mm:从进程的内存描述符
head->v_buf:主进程的线性地址经过copy_from_user(head->v_buf,v1,page_size),其中v1是要对比变量在主进程中的线性地址 追问ret = memcpy(k_addr,head->v_buf);写错了,改为memcmp,这句话的意思是?
这俩个问题困扰了一个月了,求大婶指教。不胜感激 求大神指教!!!!!!!!!!!!!!!!!!!!!!!!!! 所谓朱从进程指经fork()后两个完全相同的进程 k_addr = kmap_atomic(pg,KM_USER1)+(addr&(PAGE_SIZE-1));这句话是啥意思?
-------------------
以下是我的个人建议:
kmap_atomic(pg,KM_USER1) : pg是addr所在虚拟页面号,通过kmap_atomic转换成了对应的内核页面号
addr&(PAGE_SIZE-1):得到addr的页内地址。假设PAGE_SIZE为12,那么页面大小为4KB, 且addr低11位的内容代表页内地址,所以这么操作。
两者相加,即可得到内核地址。 kmap_atomic(pg,KM_USER1)实现的是物理地址到线性地址的转换
,你的意思是线性地址到物理地址的转换?不能出现先内核地址的? 你的回答完美解决了我的问题,只是当时不理解pte_page()得到的就是页描述符的起始地址。+偏移量是由于高端内存线性映射的原因。
页:
[1]