设为首页 收藏本站
查看: 533|回复: 0

[经验分享] 探密perl-解析perl源码(3)

[复制链接]

尚未签到

发表于 2017-5-17 06:00:07 | 显示全部楼层 |阅读模式
  本系列为刘兴(http://deepfuture.iteye.com/)原创,未经笔者授权,任何人和机构不能转载 
  如果是调试模式,则定义Perl_pending_Slabs_to_ro、S_Slab_to_rw、Perl_op_refcnt_inc、Perl_op_refcnt_dec
  否则定义空的Slab_to_rw(op)
  Slab_to_rw(op)
  #ifdef PERL_DEBUG_READONLY_OPS,
  void
  Perl_pending_Slabs_to_ro(pTHX) {将所有分配片区转为只读
  /* Turn all the allocated op slabs read only.  */
  

  U32 count = PL_slab_count;
  I32 **const slabs = PL_slabs;
  /* Reset the array of pending OP slabs, as we're about to turn this lot
  read only. Also, do it ahead of the loop in case the warn triggers,
  and a warn handler has an eval */
     重置片区数组,我们将其转化为只读,当提前循环时,发出警告,警告程序有一个eval
  PL_slabs = NULL;
  PL_slab_count = 0;
  /* Force a new slab for any further allocation.  */
  PL_OpSpace = 0;
  while (count--) {//处理slabs数组中的每个片区,使用mprotect(start, size, PROT_READ)将其转化为只读,如果出错,则提示
  

  mprotect改变使用mmap映射区域的权限,因为每个片区在调试模式下使用mmap映射的内存区域
  void *const start = slabs[count];
  const size_t size = PERL_SLAB_SIZE* sizeof(I32*);
  if(mprotect(start, size, PROT_READ)) {
     Perl_warn(aTHX_ "mprotect for %p %lu failed with %d",
       start, (unsigned long) size, errno);
  }
  }
  free(slabs);
  }
  STATIC void
  S_Slab_to_rw(pTHX_ void *op)
  {将所有分配片区转为读写
  I32 * const * const ptr = (I32 **) op;
  I32 * const slab = ptr[-1];
  PERL_ARGS_ASSERT_SLAB_TO_RW;
  assert( ptr-1 > (I32 **) slab );
  assert( ptr < ( (I32 **) slab + PERL_SLAB_SIZE) );
  assert( *slab > 0 );
    if(mprotect(slab, PERL_SLAB_SIZE*sizeof(I32*), PROT_READ|PROT_WRITE)) {
  Perl_warn(aTHX_ "mprotect RW for %p %lu failed with %d",
   slab, (unsigned long) PERL_SLAB_SIZE*sizeof(I32*), errno);
      }
  }
  OP *
  Perl_op_refcnt_inc(pTHX_ OP *o)
  {增加OP引用
      if(o) {
  Slab_to_rw(o);
  ++o->op_targ;//使用OP可读写,然后修改
      }
      return o;
  

  }
  PADOFFSET
  Perl_op_refcnt_dec(pTHX_ OP *o)
  {减少OP引用
      PERL_ARGS_ASSERT_OP_REFCNT_DEC;
      Slab_to_rw(o);//使用OP可读写,然后修改
      return --o->op_targ;
  }
  #else
  #  define Slab_to_rw(op)
  #endif

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-378214-1-1.html 上篇帖子: 安装Perl及Perl模块Net::SSH2 下篇帖子: Perl Language(I)Beginning of Perl
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表