iOS-底层原理 06:malloc 源码分析 思路

简介: iOS-底层原理 06:malloc 源码分析 思路

iOS-底层原理 02:alloc & init & new 源码分析文章中,alloc有3个核心操作,其中一个就是calloc,即申请内存,这就是今天需要探索的内容,其实探索的本质也是为了验证 ios中对象中实际的对齐方式是8字节对齐


objc4中分析calloc 源码


  • 首先从alloc进入objc的源码,找到obj = (id)calloc(1, size);操作,涉及的方法顺序是alloc --> _objc_rootAlloc --> callAlloc --> _objc_rootAllocWithZone --> _class_createInstanceFromZone

image.png

这里calloc的探索需要切换到 libmalloc源码中,可以在这里下载最新版,接着往下走


libmalloc中分析calloc源码


  • 在可编译的libmalloc中定义一个可编译的target,在main中使用calloc创建一个指针

进入calloc的源码实现,其中的关键代码在于1713行的 malloc_zone_calloc

  • 其中default_zone是一个默认的zone,目的就是引导程序进入一个创建真正zone的流程
    image.png

进入calloc的源码实现,其中的关键代码在于1713行的 malloc_zone_calloc


  • 其中default_zone是一个默认的zone,目的就是引导程序进入一个创建真正zone的流程

image.png进入malloc_zone_calloc的源码实现,关键代码是1441行的zone->calloc

image.png

  • 其中zone->calloc传入的zone 就是 上一步中的 default_zone
  • 这个关键代码的目的就是申请一个指针,并将指针地址返回


  • 在进入zone->alloc的源码,发现是一个calloc的声明,到此,源码就无法继续跟进了

image.png


那么重点来了!!!想要继续跟进源码,可以通过以下方式:


  • malloc_zone_calloc中的关键代码,即ptr = zone->calloc(zone, num_items, size);处,加一个断点,然后运行
  • 断点断在 ptr位置,想要进入zone->calloc源码实现,有两种方式:


  • 按住control + step into,进入calloc的源码实现
  • ,然后通过lldb命令p zone->callocde查找源码实现,通过打印得知zone->calloc的源码实现在default_zone_calloc方法,然后全局搜索default_zone_calloc方法,找到具体实现

image.png

进入calloc的源码实现,其中主要由两部分操作


  • 创建真正的zone,即runtime_default_zone方法
  • 使用真正的zone进行calloc

image.png

断点断在zone的位置,此时通过lldb命令p zone->alloc 是不行的,因为zone没有赋值


zone 未赋值的验证


  • 进入runtime_default_zone的源码实现
    image.png

进入inline_malloc_default_zone的源码实现,通过查看malloc_zones的值发现是NULL,可以得出,此时的zone还未赋值

image.png


继续跟踪源码


  • 回到default_zone_calloc方法,继续执行,断在zone->calloc部分,此时同样可以通过上述的两种方法任选其一进入 calloc的源码实现nano_calloc
    image.png

进入nano_calloc方法,其中的关键代码是 878,此时的p是pointer表示指针 和前面的  ptr一样,主要由两部分逻辑


  • 如果要开辟的空间小于 NANO_MAX_SIZE,则进行则进行nanozone_tmalloc
  • 反之,就进行helper_zone流程

image.png

进入_nano_malloc_check_clear源码,将if else 折叠,看主流程


  • 其中segregated_next_block 就是指针内存开辟算法,目的是找到合适的内存并返回
  • slot_bytes是加密算法的(其目的是为了让加密算法更加安全,本质就是一串自定义的数字)

image.png

  • 进入segregated_size_to_fit加密算法源码, 通过算法逻辑,可以看出,其本质就会16字节对齐算法
#define SHIFT_NANO_QUANTUM      4
#define NANO_REGIME_QUANTA_SIZE (1 << SHIFT_NANO_QUANTUM)   // 16
static MALLOC_INLINE size_t
segregated_size_to_fit(nanozone_t *nanozone, size_t size, size_t *pKey)
{
    size_t k, slot_bytes;
    //k + 15 >> 4 << 4 --- 右移 + 左移 -- 后4位抹零,类似于16的倍数,跟 k/16 * 16一样
    //---16字节对齐算法,小于16就成0了
    if (0 == size) {
        size = NANO_REGIME_QUANTA_SIZE; // Historical behavior
    }
    k = (size + NANO_REGIME_QUANTA_SIZE - 1) >> SHIFT_NANO_QUANTUM; // round up and shift for number of quanta
    slot_bytes = k << SHIFT_NANO_QUANTUM;                           // multiply by power of two quanta size
    *pKey = k - 1;                                                  // Zero-based!
    return slot_bytes;
}

iOS-底层原理 05:内存对齐原理文末,已经提及过该算法,这里不再过多说明


  • 回到_nano_malloc_check_clear方法,进入segregated_next_block源码,这个方法主要就是获取内存指针


  • 但是如果是第一次走到segregated_next_block函数,band不存在,缓存也不会存在,所以会调用segregated_band_grow,来开辟新的 band

image.png进入segregated_band_grow源码,主要是开辟新的band


image.png

先记录libmalloc源码中malloc分析的思路,需要时间研究源码,后续再补充完善!!!

相关文章
|
23天前
|
存储 运维 安全
iOS加固原理与常见措施:保护移动应用程序安全的利器
iOS加固原理与常见措施:保护移动应用程序安全的利器
37 0
|
23天前
|
存储 运维 安全
iOS加固原理与常见措施:保护移动应用程序安全的利器
iOS加固原理与常见措施:保护移动应用程序安全的利器
43 0
|
9月前
|
C语言 索引
09-iOS之load和initialize底层调用原理分析
09-iOS之load和initialize底层调用原理分析
61 0
|
存储 缓存 监控
iOS 底层原理39:Instruments系列(一)Instruments介绍
iOS 底层原理39:Instruments系列(一)Instruments介绍
1692 0
iOS 底层原理39:Instruments系列(一)Instruments介绍
|
23天前
|
安全 前端开发 数据安全/隐私保护
【教程】 iOS混淆加固原理篇
本文介绍了iOS应用程序混淆加固的缘由,编译过程以及常见的加固类型和逆向工具。详细讨论了字符串混淆、类名、方法名混淆、程序结构混淆加密等加固类型,并介绍了常见的逆向工具和代码虚拟化技术。
|
23天前
|
安全 算法 前端开发
【完整版教程】iOS混淆加固原理篇
在iOS开发中,应用程序的安全性和保护显得尤为重要。由于iOS系统的开放性,一些逆向工具可以轻松地对应用程序进行反编译和分析,从而导致应用程序源代码、算法和敏感信息的泄露。为了保护应用程序的安全性,我们需要对应用程序进行混淆加固。本文将介绍iOS混淆加固的原理和常见的加固类型。
|
23天前
|
JSON 安全 数据安全/隐私保护
​iOS Class Guard github用法、工作原理和安装详解及使用经验总结
​iOS Class Guard github用法、工作原理和安装详解及使用经验总结
20 0
|
23天前
|
安全 数据安全/隐私保护 iOS开发
【iOS开发】iOS App的加固保护原理:使用ipaguard混淆加固
【iOS开发】iOS App的加固保护原理:使用ipaguard混淆加固
58 0
|
6月前
|
JSON 安全 数据安全/隐私保护
​iOS Class Guard github用法、工作原理和安装详解及使用经验总结
iOS Class Guard是一个用于OC类、协议、属性和方法名混淆的命令行工具。它是class-dump的扩展。这个工具会生成一个symbol table,这个table在编译期间会包含进工程中。iOS-Class-Guard能有效的隐藏绝大多数的类、协议、方法、属性和 实例变量 名。iOS-Class-Guard不是应用安全的最终解决方案,但是它绝对能让攻击者更难读懂你的程序。iOS-Class-Guard会加大代码分析和runtime检查的难度,这个工具可以认为是一个简单基础的混淆方法。由于OC的架构决定了iOS应用程序的剖析相当简单,check out一下链接就知晓了:
|
7月前
|
安全 数据安全/隐私保护 iOS开发
【iOS开发】iOS App的加固保护原理:使用ipaguard混淆加固 摘要
随着智能手机的普及,越来越多的用户使用iOS设备来处理日常任务,因此iOS应用程序的安全性变得越来越重要。为了防止应用程序被攻击或破解,开发人员需要采用一些保护措施来加固应用程序。本文将介绍一种使用ipaguard混淆加固的方法来保护iOS应用的安全。