`
deepfuture
  • 浏览: 4397968 次
  • 性别: Icon_minigender_1
  • 来自: 湛江
博客专栏
073ec2a9-85b7-3ebf-a3bb-c6361e6c6f64
SQLite源码剖析
浏览量:80053
1591c4b8-62f1-3d3e-9551-25c77465da96
WIN32汇编语言学习应用...
浏览量:69999
F5390db6-59dd-338f-ba18-4e93943ff06a
神奇的perl
浏览量:103287
Dac44363-8a80-3836-99aa-f7b7780fa6e2
lucene等搜索引擎解析...
浏览量:285630
Ec49a563-4109-3c69-9c83-8f6d068ba113
深入lucene3.5源码...
浏览量:15001
9b99bfc2-19c2-3346-9100-7f8879c731ce
VB.NET并行与分布式编...
浏览量:67494
B1db2af3-06b3-35bb-ac08-59ff2d1324b4
silverlight 5...
浏览量:32099
4a56b548-ab3d-35af-a984-e0781d142c23
算法下午茶系列
浏览量:45965
社区版块
存档分类
最新评论

探密perl-解析perl源码(3)

阅读更多

本系列为刘兴(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

 

0
0
分享到:
评论

相关推荐

    GNU 编译器家族源码解析

    ### GNU编译器家族源码解析 #### 一、引言与背景介绍 GNU Compiler Collection (GCC) 是一套由自由软件基金会(Free Software Foundation, FSF)开发的编译器集合,它支持多种编程语言,如 C、C++、Objective-C、...

    任天堂游戏编程探密 游戏编程探密

    任天堂游戏编程探密  任天堂主机由6502处理器和一个特制的图形处理器组成。  CPU是6502,而不是传言中的65C02(CMOS)。  PPU的显存是和CPU的内存是分离的,可以通过对特殊端口的读/写来操作。  卡带可能包含的...

    MP3歌词显示探密 DELPHI

    ### MP3歌词显示探密——Delphi实现 #### 一、引言 随着数字音频技术的发展,MP3格式因其高质量的音质和较小的文件体积而受到广泛欢迎。对于喜欢边听音乐边看歌词的用户来说,能够实现在播放MP3的同时同步显示歌词...

    AMD K6-2CPU编号探密.pdf

    AMD K6-2 CPU 编号探密 AMD K6-2 CPU 编号探密是指 AMD 公司推出的 K6-2 系列 CPU 的编号系统,用于标识和区分不同型号的 K6-2 处理器。本文将深入探讨 AMD K6-2 CPU 编号的组成部分、编号规则、性能特点和实际应用...

    探密电动汽车的无线充电技术.pdf

    探密电动汽车的无线充电技术

    DDR探密.pdf DDR探密.pdf

    DDR探密.pdf

    Ajax.Hacks探密书籍

    **Ajax.Hacks探密书籍**是一本专注于Ajax技术的深入解析和实践指南,它揭示了Ajax(Asynchronous JavaScript and XML)技术的核心原理及其在Web开发中的广泛应用。Ajax是一种用于创建快速、动态网页的技术,通过在...

    计算机词典书硬件探密.pdf

    入门级的百科全书,系统地介绍了常用的计算机词汇

    幼儿园政治:其他教案-大鲨鱼探密.pdf

    【幼儿园政治:其他教案-大鲨鱼探密】 在幼儿教育阶段,政治教案并不局限于传统的政治概念,而是更广泛地涵盖了社会认知、道德情感、生态环保等多方面内容。这篇《大鲨鱼探密》教案就是一个很好的例证,旨在通过...

    GNURadio探密.pdf

    GNURadio探密.pdf

    任天堂游戏编程任天堂游戏编程探密

    本文将深入探讨“任天堂游戏编程探密”这一主题,解析相关知识点,旨在为那些对任天堂游戏开发感兴趣的程序员提供指导。 首先,我们要了解任天堂游戏机的基本架构。任天堂游戏平台如Switch、3DS等,都有其独特的...

    任天堂游戏编程探密

    让我们深入解析一下这个领域的关键知识点。 首先,我们要了解汇编语言。汇编语言是一种低级编程语言,它是计算机硬件可以直接理解的语言,每一个指令都对应一个特定的机器码。在游戏编程中,尤其是在早期的任天堂...

    探密嵌入式系统核心组件单片机-论文

    3. 转型阶段:随着测控系统要求的提高,MCS-51系列中的8051单片机通过外围电路与接口电路增加了控制模块,从而具备了智能化控制能力,单片机的微控制器特征更加明显。 4. 成熟阶段:单片机的研制和生产已经形成产业...

    《任天堂游戏编程探密》

    《任天堂游戏编程探密》是一本专注于探讨任天堂游戏开发技术的专业书籍,它主要侧重于硬件层面的解析,为读者揭示了游戏开发背后的神秘世界。任天堂作为全球知名的电子游戏公司,其游戏平台如GBA(Game Boy Advance...

    一汽大众工厂探密报告.doc

    一汽大众工厂探密报告.doc

    Ajax 探密 (Ajax Hacks )

    2. **JSON与XML**:Ajax最初与XML关联,但现在更常见的是使用JSON(JavaScript Object Notation),因为它更轻量、易于解析和生成。 3. **动态内容加载**:通过Ajax,可以动态地向页面添加或修改内容,如实时聊天、...

Global site tag (gtag.js) - Google Analytics