前语: iOS底层原理根究是本人在平常的开发和学习中不断堆集的一段进阶之
路的。 记载我的不断根究之旅,希望能有协助到各位读者朋友。
目录如下:
- iOS 底层ios模拟器原理根究 之 alloc
- iOS 底层原理根究 之 结构体内存对齐
- iOS 底层原理根究 之 对象的实质 & is源码买卖网站源码a的底层完结
- iOS 底层原理根究 之 isa – 类的底层原理结构(上)
- iOS 底层缓存视频原理探缓存视频在手机哪里找求 之 isa – 类的底层原理结构(中)架构师
- i源码本钱OS 底层原理根究 之 isa – 类的底层原理结构(下)
- iOS 底层原理根究 之 Runtime运行时&办法的实质
前语
在上架构规划一篇,咱们根究了 Runtime 以及与架构规划 R源码网站untime 交互的三架构图模板种办法,和总结了 办法的实质其实是音讯发送的iOS进程。今天接着上ios最好玩的手游一篇持续 o缓存视频怎样转入相册bjc_m缓存视频怎样转入本地视频sgSend汇编剖析。
objc_msgSend汇编剖析
-
c缓存视频怎样转入本地视频mp p0, #0: p0为此次的音讯接受者,拿来和0比较,判别音讯接受者是否为0,假定没有音讯接受者,则此次 obj源码编辑器c_msgSend 没有意义。 -
#if SUPPORT_TAGGED_POINTERS判别是否为 SUPPORT_TAGGED_POINTERS 类型,假定是,则实施b.le LNilOrTaggios15正式版别什么时候发布ed, 否则, 实施b.eq LReturn源码本钱Zero,即回来此次音讯为空。 -
ldr p13, [x0]将x0存入到p13,x0是receiver,即类,即类的首地址,即isa,也便是说p13=isa。 -
进入
GetClassFromIsa_p16带入参数src缓存视频兼并app下载=p13,needs_auth=架构师需要把握哪些常识1,auth_address=x0. 判别是不是缓存文件在哪里 SU缓存视频怎样转入本地视频PPORT_INDEXED_ISA (32位isa),不满足此条件,接下来会进入__LP64__(这份源码里指ios是什么意思的是Mac OS X)分支。 -
因为
_need_auth=1,进入分支Extract源码编程器ISA p16, src, auth_address,此ExtractISA为宏,操作是将src(isa)、#ISA_MASK做与操作,得到了Class,作用存入到p16中。 -
LGetIsaDone:获取isa完结。接下来实施CacheLookup NORMAL, _objc_m架构师sgSend, __objc_msgSend_uncached6.1
mov x15,源码网站 x16隐藏isa,将x16寄存器赋值到 x156.2
ldr p11, [x16, #CACHE]#define CACHE 8,那么p11=x16+0x8,等同于 isa+0x8, 即isa向右偏移了8字节,拿到了cache_t,即 p11=cache_t (咱们根究真机环境也便是arm64的汇编,所以是CACHE_MASK_STORAGE == CACHE_MASK_STORAGE_HIGH_16分支)6.3 在
CONFIG_USE_PREOP源码编辑器编程猫T_CACHES分支中,咱们根究非A12及往后芯片,所以 不进入到#if __has_feature(ptrauth_calls)分支, 所以 实施and p10, p11, #0x0000fffffffffffe将p11与上#0x0000fffffffffffe (preoptBucketsMask) 得架构是什么意思到 buckets() 的地址,存储在 p10中源码编辑器编程猫。 然后实施tbnz p11, #0, LLookupPreoptFunction, 作用是验证p1缓存视频在手机哪里找1, 也便是 cache_t 是不是为0, 假定为0, 则证明没有缓存,ios是什么意思 没有向下持续查找 bucket的必要, 跳转至LLookupPios下载reopt。6.4
eor p12, p1, p1, LSR #7, 因为 p0 寄存器是 receiver, p1 寄存器为第二个参数, SEL _cmd, 所以p1 = _cmd,对应上面的指令便是得出, p12 = (_cmd >> 7) ^ _cmd6.5
and p12, p12, p1架构图1, LSR #48, p11 = cache_t = _bucketsAndMaybeMaske, 可以翻译成 p12 = p12 & (_bucketsAndMaybeMask >> 48), 这个指令毕竟的作用是找到已知bucke架构是什么意思ts的index。6.6
add p13, p10, p12, LSL #(1+PTRSHIFT), PTRSHIFT 在__LP64__下的值为3,否则为2, 咱们根究的64位的,所以, PTRSHIFT=3源码年代训练怎么样,p10 是 buckets, p12 是 index, 那么可以将上述指令翻译为 : p13 = p10 + (p12 << (1+3)), 将 index 左移4位, 然后将得到作用n, 在buckets架构图模板的首地址上移动相应n个步长,找到毕竟的bucket_t。6.7
1: ldp p17, p9, [x13], #-BUCKET_SIZE将 x13 寄存器的值取出来放缓存在 p17和p9, 因为x13 为bucket_t结构体,在arm64架构下,第一个值是imp,第二个值是sel,所以缓存的视频怎么保存到本地p缓存视频在手机哪里找17=imp,p9=sel。6.8
cmp p9, p1比较p1和p9,即比较在缓存中取出来的sel和objec_msgSend的第二个参数——cmd,假定不等,向后跳转,实施命令b.ne 3f,将实施三条指令:6.8.缓存视频兼并app下载1
cb缓存视频变成本地视频z p9, MissLabelDynamic:找不到sel6.8源码年代.2
cmp p13, p10循环查找的条件,当要查找的bucket_t的地址大于bucketsios8备忘录的首地址的时源码是什么意思分,持续查找6.8.3
b.hs 1b从头回到 1 实施sel的比较,假定相等,2:CacheHit Mode即命中了缓存中的办法,找到了缓存,进入到 CacheHit6.7
CacheHit分为 三种形式,NORMAL,GETIMP,LOOKUP;不论哪种,毕竟作用都是将去查找se源码编辑器l对应的imp,然后将其回来。流程图


评论(0)