免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1606 | 回复: 8
打印 上一主题 下一主题

[内存管理] 双进程局部变量比较 [复制链接]

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-05-03 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-04-30 21:09 |只看该作者 |倒序浏览
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);

                            }
                        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;
}

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-05-03 06:20:00
2 [报告]
发表于 2016-04-30 21:10 |只看该作者
我的问题是     k_addr = kmap_atomic(pg,KM_USER1)+(addr&(PAGE_SIZE-1));这句话是啥意思?

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-05-03 06:20:00
3 [报告]
发表于 2016-04-30 21:17 |只看该作者
代码注释:
unsigned long v:要对比变量在从进程中的线性地址
head-task->mm:从进程的内存描述符
head->v_buf:主进程的线性地址经过copy_from_user(head->v_buf,v1,page_size[0]),其中v1是要对比变量在主进程中的线性地址

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-05-03 06:20:00
4 [报告]
发表于 2016-04-30 21:20 |只看该作者
追问ret = memcpy(k_addr,head->v_buf);写错了,改为memcmp,这句话的意思是?
这俩个问题困扰了一个月了,求大婶指教。不胜感激

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-05-03 06:20:00
5 [报告]
发表于 2016-04-30 21:21 |只看该作者
求大神指教!!!!!!!!!!!!!!!!!!!!!!!!!!

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-05-03 06:20:00
6 [报告]
发表于 2016-04-30 21:24 |只看该作者
所谓朱从进程指经fork()后两个完全相同的进程

论坛徽章:
0
7 [报告]
发表于 2016-05-02 09:25 |只看该作者
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位的内容代表页内地址,所以这么操作。
两者相加,即可得到内核地址。

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-05-03 06:20:00
8 [报告]
发表于 2016-05-02 10:53 |只看该作者
kmap_atomic(pg,KM_USER1)实现的是物理地址到线性地址的转换
,你的意思是线性地址到物理地址的转换?不能出现先内核地址的?

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-05-03 06:20:00
9 [报告]
发表于 2016-05-03 18:47 |只看该作者
你的回答完美解决了我的问题,只是当时不理解pte_page()得到的就是页描述符的起始地址。+偏移量是由于高端内存线性映射的原因。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP