- 博客(368)
- 资源 (50)
- 问答 (1)
- 收藏
- 关注
原创 XCode 编译 PAG 源码
最近工作中要使用PAG替换Lottie,为了方便阅读源码,使用XCode对其源码进行了编译。1 下载源码编译源码首先要下载源码,有关PAG源码可直接到github上下载。2 添加相关依赖下载源码之后,进入到PAG项目根目录,执行如下脚本:./sync_deps.sh3 构建 iOS PAGViewer 工程PAG项目包含多种平台下的代码,包括iOS,Windows,Linux等。我...
2024-07-28 15:46:00 329
原创 一文搞懂 ARM 64 系列: 一文搞懂 ARM 64 系列: 函数调用传参与返回值
函数调用涉及到传参与返回值,下面就来看下ARM 64中,参数与返回值的传递机制。1 整数型参数传递这里的整数型并不单指int类型,或者NSInteger类型,而是指任何能够使用整数表示的数据类型,包括char、BOOL、指针等。对于整数型参数,需要分成参数个数<=8个和>8个两种情形来看。如果参数个数 <=8个,那么参数全部使用Xn寄存器传递。比如,一个函数的参数只有...
2024-06-09 04:50:00 1093
原创 一文搞懂 ARM 64 系列: 寄存器
ARM 64中包含多种寄存器,下面介绍一些常见的寄存器。1 通用寄存器ARM 64包含31个64bit寄存器,记为X0~X30。每一个通用寄存器,它的低32bit都可以被访问,记为W0~W30。在这31个通用寄存器中,有2个寄存器比较特殊。X29寄存器被作为栈帧寄存器,也被称为FP(Frame Pointer Register)。X30寄存器被作为函数返回地址寄存器,也被称为LR(...
2024-06-08 21:44:00 1008
原创 一文搞懂 ARM 64 系列: ADCS
1 指令语法adcs <Xd>, <Xn>, <Xm>2 指令语义上面的指令等价于:(Xd, nzcv) = Xn + Xm + PSTATE.C也就是将寄存器Xn,寄存器Xm,进位标志PSTATE.C相加,将结果写入寄存器Xd,同时,这个指令还会影响PSTATE的NZCV标志。ADCS中的S,正式Set的意思,也就是这个指令会Set PSTATE...
2024-05-10 00:33:00 340
原创 一文搞懂 ARM 64 系列: ADC
1 指令语法adc <Xd>, <Xn>, <Xm>2 指令语义adc就是带「进位」加法,指令中的c就是英文carry。整个指令等价于:(Xd, _) = Xn + Xm + PSTATE.C也就是将寄存器Xn,寄存器Xm,PSTATE中的「进位」标志相加,将相加的结果写入寄存器Xd,但是丢弃相加产生的「进位」。也就是说,adc指令只是使用PST...
2024-05-09 02:19:00 409
原创 ARM64: ARDP
1 指令语法ardp <Xd>, <lable>2 指令语义1 获取程序计数器PC寄存器的值;2 将PC寄存器值的低12位全部取0;3 将lable的值乘以4096,也就是将label左移12位;4 将第2步的PC值与第3步的label值相加;5 将第4步所得结果写入寄存器Xd。从上面步骤可以看出,得到的结果低12位为0,所以得到的是一个4KB页大小的首地...
2024-03-24 14:18:00 244
原创 GCD Inside: GCD 数据结构
1 OS_objectOS_object由下面宏OS_OBJECT_DEC_BASE扩展而来:// 1. os/object.hOS_OBJECT_DECL_BASE(object, NSObject);// 2. os/object.h#define OS_OBJECT_DECL_BASE(name, ...) \ @interface OS_OBJECT_CLASS(name...
2023-11-13 03:02:00 177
原创 GCD Inside: GCD 宏
1 __OBJC____OBJC__宏的定义在 GCD 源码中找不到,它定义在 LLVM 的源码中:// initPreprocessor.cppstatic void InitializeStandardPredefinedMacros(const TargetInfo &TI, con...
2023-11-12 00:17:00 142
原创 UIKit Inside: frame bounds position anchorPoint center
iOS 中UIView的属性:frame、bounds、center以及CALayer的属性:position、anchorPoint与视图的位置与大小相关,理解这些属性是进行 iOS 视图编码的基础。下面从汇编角度看一下这些属性的实现以及相互关系。1 frameframe定义了视图在父视图坐标系下的位置与大小。上图中红色UIView的frame为 {x: 50, y: 50, w...
2023-11-06 04:53:00 211
原创 Mach-O Inside: 命令行工具集 otool objdump od 与 dwarfdump
1 otoolotool 命令行工具用来查看 Mach-O 文件的结构。1.1 查看文件头otool -h -v 文件路径-h选项表明查看 Mach-O 文件头。-v 选项表明将展示的内容进行"符号化"处理。上面命令行输出的一个例子如下:magic cputype cpusubtype caps filetype ncmds sizeofcmds flagsM...
2023-10-29 18:55:00 526
原创 Mach-O Inside: BSS Section
1 BSS 起源BSS(Block Started by Symbol)这个词最初是 UA-SAP 汇编器(United Aircraft Symbolic Assembly Program)中的一个伪指令,用于为符号预留一块内存空间。该汇编器由美国联合航空公司于 20 世纪 50 年代中期为 IBM 704 大型机所开发。后来,BSS 这个词被作为关键字引入了 IBM 709 和 7090...
2023-10-29 01:27:00 83
原创 WebKit Insie: Active 样式表
WebKit Inside: CSS 样式表的匹配时机介绍了当 HTML 页面有不同 CSS 样式表引入时,CSS 样式表开始匹配的时机。后续文章继续介绍 CSS 样式表的匹配过程,但是在匹配之前,首先需要收集页面里面的 Active 样式表。1 Active 样式表在一个 HTML 文件里面,可能会使用<style>标签与<link>标签引入许多样式表,但是这些样式...
2023-10-07 21:18:00 242
原创 WebKit Inside: CSS 样式表的匹配时机
WebKit Inside: CSS 的解析 介绍了 CSS 样式表的解析过程,这篇文章继续介绍 CSS 的匹配时机。无外部样式表内部样式表和行内样式表本身就在 HTML 里面,解析 HTML 标签构建 DOM 树时内部样式表和行内样式就会被解析完毕。因此如果 HTML 里面只有内部样式表和行内样式,那么当 DOM 树构建完毕之后,就可以进行样式表的匹配了。假设 HTML 里面的行内样式在...
2023-10-05 17:03:00 196
原创 WebKit Inside: CSS 样式表的解析
CSS 全称为层叠样式表(CascadingStyleSheet),用来定义 HTML 文件最终显示的外观。为了理解 CSS 的加载与解析,需要对 CSS 样式表的组成,尤其是 CSS Selector 有所了解,相关部分可以参看这里。HTML 文件里面引入 CSS 样式表有 3 种方式:1 外部样式表2 内部样式表3 行内样式不同的引入方式,CSS 加载与解析不一样。CSS ...
2023-10-02 23:02:00 164
原创 WebKist Inside: CSS 样式表的组成
1 StyleSheet一张 StyleSheet 由一系列 Rules 组成,这些 Rules 可以分成 2 大类: 1 Style Rule2 At-Rule下面的例子展示了 Style Rule 和 At-Rule:// Style Rulediv { background-color: red; font-size: 12px;}// At-Rule...
2023-10-01 01:02:00 73
原创 WebKit Inside: CSS 样式表解码字符集
CSS 样式表引入有3种方式: 外部样式表、内部样式表、行内样式,不同的引入方式,解码样式表的字符集原理不一样。外部样式表外部样式表由 link 标签引入,当 WebKit 解析到 link 标签时就会构造 CachedCSSStyleSheet 对象。这个对象持有 CachedResourceRequest 对象和 TextResourceDecoder 对象。CachedResource...
2023-09-30 17:13:00 98
原创 C++ 转换构造函数
在 C++ 中如果一个构造函数只有一个参数,那么这个构造函数就是转换构造函数(Converting Constructor),这个构造函数可以将参数类型转换成构造函数所在的类对应的类型。举个例子,假设有如下类 Complex: 1 class Complex { 2 private: 3 int i; 4 int j; 5 6 public: 7 // ...
2023-09-30 15:06:00 192
原创 CSS 样式表引入的3种方式
CSS 全称为层叠样式表(CascadingStyleSheet),用来定义 HTML 文件最终显示的外观。HTML 文件里引入 CSS 样式有3种方式: 外部样式表、内部样式表、行内样式。外部样式表外部样式表通过 link 标签引入:<link rel='stylesheet' type='text/css' href='https://www.test.com/test.c...
2023-09-30 00:32:00 227
原创 一文搞懂 x64 IA-64 AMD64 Inte64 IA-32e 架构之间的关系
想要搞清楚 x64、IA64、AMD64 指令集之间的关系,就要先了解 Intel 和 AMD 这两家公司在生产处理器上的发展历史。x86 处理器1978年 Intel 生产了它的第一款 16bit处理器8086,之后几款处理器名字也都以86结尾,包括80186,80286, 80386,80486,这些处理器的架构被统一称为 x86 架构。其中8086、80186、80286是 16b...
2023-05-03 12:07:00 2730
原创 Linux-0.11操作系统源码调试
学习操作系统有比较好的两种方式,第一种是跟着别人写一个操作系统出来,《操作系统真相还原》、《Orange's:一个操作系统的实现》等书就是教学这个的;另一种方式就是调试操作系统源码,相比第一种方式,调试源码可以更能感受真实操作系统的实现机制。Linux-0.11 是 Linux 最早期的代码,它包含现代操作系统的所有雏形,代码体量也不大,非常适合对操作系统进行源码学习。下面记录在 Ubuntu...
2022-11-12 15:45:00 978 1
原创 GDB 中内存打印命令
GDB 中使用 "x" 命令来打印内存的值,格式为 "x/nfu addr"。含义为以f格式打印从addr开始的n个长度单元为u的内存值。参数具体含义如下:a)n:输出单元的个数。b)f:是输出格式。比如x是以16进制形式输出,o是以8进制形式输出,等等。c)u:标明一个单元的长度。b是一个byte,h是两个byte(halfword),w是四个byte(wor...
2022-07-31 15:31:00 270
原创 iOS LLVM 中的宏定义
在阅读 Objc 库源码时常常会遇到很多宏定义,比如宏SUPPORT_INDEXED_ISA、SUPPORT_PACKED_ISA,代码如下所示:// Define SUPPORT_INDEXED_ISA=1 on platforms that store the class in the isa // field as an index into a class table.//...
2022-07-30 19:27:00 331
原创 @weakify 与 @strongify 实现原理
为了解决 Block 造成的循环引用,iOS 开发过程中常常使用 @weakify 与 @strongify 来解决这个问题。下面就来看下 @weakify 与 @strongify 的实现原理。准备知识宏参数(Arguments)的扩展可变参数宏宏定义中的重复副作用宏定义里面为什么要加括号?Block对变量的引用@weakify 和 @strongify 的实现原理就是宏展开,阅...
2022-03-20 16:03:00 732
原创 Block对变量的引用
如果在 Block 内部使用外部的变量,Block 会持有这个变量。下面来看几中特殊的情况,看 Block 对变量的持有情况如何。typeof@interface X : NSObject@property (nonatomic, copy) void(^testBlock1)(void);@property (nonatomic, copy) void(^testBlock2)(v...
2022-03-20 00:50:00 101
原创 宏参数(Arguments)的扩展
宏分为两种,一种是 object-like 宏,比如:#define STR "Hello, World!"另一种是 function-like 宏,比如:#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))对于 function-like 宏,定义时的参数叫 Parameters,比如上面宏 MIN 的参数 X、Y,当调用时,传递的参数叫 A...
2022-03-19 16:16:00 91
原创 可变参数宏
定义宏时可以让宏接收可变参数,对于可变参数的定义,标准 C 和 GNU C(GNU 对 C的扩展)是不一样的。标准 C标准 C 对于可变参数的定义如下,使用...:#define eprintf(...) fprintf (stderr, __VA_ARGS__)在宏定义中,__VA_ARGS__ 代表了所有的可变参数。比如像下面使用宏 eprintf:eprintf ("%s:...
2022-03-19 15:13:00 97
原创 宏定义中的重复副作用
副作用(Side Effect)在计算机当中,副作用指当调用一个函数时,这个函数除了返回一个值之外,还对主调函数产生了影响,比如修改了全局变量,修改了参数等等。宏的重复副作用对于求两个数中的最小数,常常可以定义一个宏 MIN,定义如下:#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))上面的宏在写法上完全没有问题。但是假如有下面的代码:i...
2022-03-19 14:47:00 147
原创 宏定义里面为什么要加括号?
在宏定义当中,常常可以看到宏的参数以及整个宏的定义都被小括号包围,就像下面的 MIN、MAX、ABS 宏一样:上面的图截取自 iOS 的系统库,那为什么它们需要这些括号包围起来呢?下面假如我们自定义了宏 ceil_div,代码如下:#define ceil_div(x, y) (x + y - 1) / y这个宏的本意是将 x 除以 y,然后将得到的结果向上取整。比如 x = 4,...
2022-03-19 13:50:00 1083 1
原创 WebKit Inside: DOM树的构建
当客户端App主进程创建WKWebView对象时,会创建另外两个子进程:渲染进程与网络进程。主进程WKWebView发起请求时,先将请求转发给渲染进程,渲染进程再转发给网络进程,网络进程请求服务器。如果请求的是一个网页,网络进程会将服务器的响应数据HTML文件字符流吐给渲染进程。渲染进程拿到HTML文件字符流,首先要进行解析,将HTML文件字符流转换成DOM树,然后在DOM树的基础上,进行渲染操...
2022-02-21 21:25:00 298
原创 WebKit中WTFMove实现
WTFMove定义位置: WTF/Source/wtf/StdLibExtras.h,其定义如下:#define WTFMove(value) std::move<WTF::CheckMoveParameter>(value)从定义可以看出,WTFMove实际上是封装的std::move方法。当使用WTFMove之后,value值会被置为空。...
2022-02-20 18:59:00 106
原创 HTML link标签中preload,prefetch,dns-prefetch,preconnect,prerender
Preload在我们的浏览器加载资源的时候,对于每一个资源都有其自身的默认优先级,倘若我们能修改每一个资源的默认优先级,那我们几乎可以按照我们的预期加载想要加载的资源。以谷歌浏览器为例,我们打开控制台,并切换到Network选项,点击刷新页面,在网络下面的title一行点击鼠标右键,勾选Priority即可看到加载资源的优先级,我们可以看到样式的级别比脚本的优先级高,毕竟页面的一加载进来...
2021-06-12 20:49:00 1227
原创 JS的异步加载
异步加载先看一张整体的异步加载对渲染的阻塞情况图,图片如下:从这张图里我们可以看到如下4点:默认情况HTML解析,然后加载JS,此时HTML解析中断,然后执行JS,最后JS执行完成恢复HTML解析defer情况下HTML和JS并驾齐驱,最后才执行JSasync情况则HTML和JS并驾齐驱,JS的执行可能在HTML解析之前就已经完成了最后module情况和defer的情况类似,只不...
2021-06-12 20:14:00 84
原创 link标签的media属性
media属性表示被链接的文档将显示在什么设备上。比如下面的例子:<head><link rel="stylesheet" type="text/css" href="theme.css" /><link rel="stylesheet" type="text/css" href="print.css" media="print"/></hea...
2021-06-12 17:35:00 202
原创 安装XMind如何安装到指定目录
在Win10系统上安装XMind,发现安装完成之后,XMind被安装到了C盘。由于C盘是系统盘,这让人很不爽。XMind在安装过程中也没有提供安装路径选择,而是点击安装程序之后,就一路开始安装到C盘。为了让XMind安装到我们指定的位置,我们需要做如下操作:1 按住Win + r,出现如下界面,在输入框中输入regedit,点击确定2 这个时候会弹出注册表编辑器,按如下路径选择:计算机...
2021-06-02 00:42:00 858
原创 显示器AVG、DVI、HDMI、DisplayPort、Type-C、雷电接口
在近十年的发展,显示设备的接口发生了巨大的改变。以前使用比较多的是蓝色VGA接口,接著出现了白色的DVI接口,当遇到不同接口时,还得买转接头进行转接。后来,又有了HDMI等接口,现在则出现DP和USB Type-C接口。那么,这么多接口,到底有什么区别,又应该用哪个呢?VGAVGA接口也称为D-Sub接口。在CRT显示器时代,VGA接口是必备的。因为CRT是模拟设备,而VGA采用的...
2021-05-30 18:59:00 2098
原创 SATA与PCI-E速度对比
SATASATA接口已经发展到了第三代,理论上的最大速度达到600MB/s。平时大家见到的SATA SSD使用的都是SATA三代,实际测试速度在550MB/s左右,这比普通的机械硬盘的速度100MB/s左右快了数倍。GenerationSpeedSpecial FeaturesSATA 1.01.5Gbs(150 MB/s)SATA 2.03Gbs(300 MB...
2021-05-30 18:23:00 1413
原创 SRAM、DRAM、Flash、DDR有什么区别
SRAMSRAM的全称是Static Rnadom Access Memory,翻译过来即静态随机存储器。这里的静态是指这种存储器只需要保持通电,里面的数据就可以永远保持。但是当断点之后,里面的数据仍然会丢失。由于SRAM的成本很高,所以像诸如CPU的高速缓存,才会采用SRAM。DRAMDRAM全称是Dynamic Random Access Memory,翻译过来即动态随机存取存储器,最...
2021-05-30 17:31:00 651
原创 USB3.0与Type-C接口的关系
USB全称为Universal Serial Bus,翻译过来就是通用串行总线,是连接计算机与外部设备的一种串口总线标准。USB的发展经历了一下阶段:USB1.0:1.5Mbps(192KB/s)低速(Low-Speed)500mA,1996年1月;USB1.1:12Mbps(1.5MB/s)全速(Full-Speed)500mA,1998年9月;USB2.0:480Mbps(60MB/s)高...
2021-05-30 16:27:00 749
原创 一图明白ACHI,SATA之间的关系
从上图中可以看到,SATA与PCI-E不仅可以指代物理的接口,还可以指代物理接口使用的传输协议。M.2物理接口可以使用SATA、PCI-E传输协议。U.2可以使用PCI-E传输协议。在网上搜了一下,U.2接口也是可以兼容SATA接口的,但是上面的图没有展示这一点。上层协议上层协议是主机内存与存储设备之间的一种通用接口,也就是说在不同操作系统与硬件中是通用的。AHCI全称是Advan...
2021-05-30 15:27:00 782
原创 U.2与M.2接口
U.2接口U.2接口别称SFF-8639,是由固态硬盘形态工作组(SSD Factor Work Group)推出的接口规范。U.2接口不但能支持SATA-Express(一种PCI-E与SATA混合的接口),还能兼容SAS、SATA接口。M.2接口M.2接口原名NGFF接口,它是为超极本量身定做的新一代接口标准,主要用来取代mSATA接口,具备体积小、传输速度快等优点。M.2接口可以兼容...
2021-05-30 14:38:00 680
Mac OS X and iOS Internals:To the Apple’s Core.pdf
2020-11-17
Ecma-262规范
2020-11-17
AdvanceAppleDebugging_v0.9.1_SourceCode
2020-11-17
Unicode Standrad
2015-09-24
Git书籍两本打包
2015-09-24
elementary functions
2015-09-24
由于axis2的三本英文书籍
2015-09-24
C89以及Rational
2014-11-26
linux只能连接无密码wifi,无法连接有密码wifi
2015-09-08
TA创建的收藏夹 TA关注的收藏夹
TA关注的人