#2023年v8源码分析(v8引擎源码)- 知乎
920GG游戏网相关导读
Android中的armeabi、armeabi-v7a、arm64-v8a及x86的详解
一. lib和libs
放在lib中的是被reference的v8源码分析,放在libs中的是被include的。
放在libs中的文件会自动被编辑器所include。所以不要把API放到libs里去。
lib的内容是不会被打包到APK中,libs中的内容是会被打包进APK中
二. .so库
NDK编译出来的动态链接库。
一些重要的加密算法或者核心协议一般都用c写然后给java调用。这样可以避免反编译后查看到应用的源码。
三. .so库该如何存放
放置 .so 文件的正确姿势其实就两句话:
• 为了减小 apk 体积,只保留 armeabi 和 armeabi-v7a 两个文件夹,并保证这两个文件夹中 .so 数量一致
• 对只提供 armeabi 版本的第三方 .so,原样复制一份到 armeabi-v7a 文件夹
存放so的规则:
v8源码分析你应该尽可能的提供专为每个ABI优化过的.so文件,但要么全部支持,要么都不支持:你不应该混合着使用。你应该为每个ABI目录提供对应的.so文件。
四. libs下armeabi等的作用是什么
存放.so库,主要针对不同的设备兼容,也可以说是专门针对不同Android手机下CPU架构的兼容。
Android 设备的CPU类型(通常称为”ABIs”)
早期的Android系统几乎只支持ARMv5的CPU架构,后面发展到支持七种不同的CPU架构:ARMv5,ARMv7 (从2010年起),x86 (从2011年起),MIPS (从2012年起),ARMv8,MIPS64和x86_64 (从2014年起),每一种都关联着一个相应的ABI。
应用程序二进制接口(Application Binary Interface)定义了二进制文件(尤其是.so文件)如何运行在相应的系统平台上,从使用的指令集,内存对齐到可用的系统函数库。在Android 系统上,每一个CPU架构对应一个ABI:armeabi,armeabi-v7a,x86,mips,arm64- v8a,mips64,x86_64。
armeabi-v7a: 第7代及以上的 ARM 处理器。2011年以后生产的大部分Android设备都使用它.
arm64-v8a: 第8代、64位ARM处理器,很少设备,三星 Galaxy S6是其中之一。
armeabi: 第5代、第6代的ARM处理器,早期的手机用的比较多。
x86: 平板、模拟器用得比较多。
x86_64: 64位的平板。
如果项目只包含了 armeabi,那么在所有Android设备都可以运行;
如果项目只包含了 armeabi-v7a,除armeabi架构的设备外都可以运行;
如果项目只包含了 x86,那么armeabi架构和armeabi-v7a的Android设备是无法运行的; 如果同时包含了 armeabi, armeabi-v7a和x86,所有设备都可以运行,程序在运行的时候去加载不同平台对应的so,这是较为完美的一种解决方案,同时也会导致包变大。
最后,如果我们只想支持armeabi-v7a,那么需要在gradle中配置
因为默认情况下,打包后会自动生成armeabi 到 x86的所有文件夹。这就有可能导致一些x86的设备因为在x86文件夹下找不到so文件而崩溃。
QuickJS 源码剖析:垃圾回收原理
QuickJS 是一个轻量级的 JavaScript 引擎,可以代替 V8 实现 JS 脚本的执行,如果要使用 QuickJS,必须要弄懂其垃圾回收原理,否则容易出现野指针或内存泄漏,从而导致程序崩溃,本文通过源码剖析 QuickJS 的垃圾回收原理。
QuickJS 是使用引用计数法来判断对象是否可以被释放,引用计数法非常简单,通过给对象分配一个计时器来保存该对象被引用的次数,如果该对象被其它对象引用就会加1,如果删除引用就会减1,当引用的计数器为0时,那么就会被回收。
JSRuntime 是 QuickJS 最底层的执行环境,不使用的时需要及时释放。
一个 JSRuntime 可以创建多个 Context,每个 Context 之间是相互隔离的,不使用的时需要及时释放。
如果我们需要自己创建和关联JS对象时,我们需要处理好引用问题,必须通过 c 创建一个JSValue对象,那么我们就需要手动释放它,否则就会导致内存泄漏,同时我们也不能多次释放,这也会导致野指针,从而导致程序崩溃,如果我们只是纯粹运行js脚本就无需我们关心这个问题,引擎已经处理好了。
通过上面示例,我们得知引用计数法是通过JS_DupValue记录引用+1,JS_FreeValue引用减1实现计数,接下来就通过源码分析如何实现。
引用计数器头是一个结构体,目前只有一个int值,用于记录对象的引用次数。
引用计数器+1
JS_FreeValue 处理引用计数器-1,如果引用属于小于0时候就会执行垃圾回收,这里引入引用计数器最大的问题,如果a引用b,b也引用了a,这样的相互应用是不是就会导致a和b都无法回收?
JS_RunGC 函数就是用来解决相互引用问题,会在特定的时机触发。
经过上面两个函数,tmp_obj_list 就只会剩下环形引用的对象,gc_free_cycles() 回收 tmp_obj_list 列表的对象,并且对属性的引用-1。
arm如何对ddr分区存储
adrp指令
1)创建项目在mian 文件中写个方法然后执行此方法在汇编模式调试断点。详细操作
将debug - Debug Overflow - Always Show DisAssembly 选中运行查看混编代码。如果想恢复再点下就可以了.
2) 得到以下界面
3)原理 adrp操作步骤adrp x0, 1
1. 将1的值,左移12位 1 0000 0000 0000 == 0x1000
2.将PC寄存器的低12位清零 0x1045228b0 == 0x104522000
3.将将1 和 2 的结果相加 给 X0 寄存器!!
注:地址为pc寄存器左边的地址,adrp是找出要获取参数的地址范围,然后下个pc寄存器执行的代码会定位到准确的物理地址。
指令区域
由于adrp的为范围寻址并不会精确到具体地址所以地址的最后三位,即12bit位为0是需要系统下一步执行的时候补上的。
根据cpu总线的计算规则12bit相当于12根总线器地址范围为2的12次方即4KB。
点击阅读全文
打开CSDN APP,看更多技术内容
ARM64基础8:A64其他常用指令_科学边界的博客_arm64 svc...
ADRP: 加载PC相对地址,label地址,并且4KB对齐,范围+/- 4GB; /* others inst */ .align 3 .global my_test_data my_test_data: .dword 0x12345678abcdeeff .global adrp_test adrp_test: adr x0, my_test_data adrp x1, ...
继续访问
arm64 linux 中断,ARM64 中断处理流程_论智的博客
adrp x1, handle_arch_irq ldr x1, [x1, #:lo12:handle_arch_irq] mov x0, sp blr x1 .endm 继续往下追踪,在文件 arch/arm64/kernel/irq.c 中,handle_arch_irq 是一个全局函数变量,通过函数 set_handle_irq 将该变量设...
继续访问
最新发布 ARM64体系结构编程4-比较指令和其他指令
判断 cond 是否为真,如果为真,就返回 Xn,否则,返回 Xm,把结果写入 Xd 寄存器中,
继续访问
ARM64体系结构编程3-算数和移位指令
b 指令的操作由后缀 cs 决定,cs 表示判断是否发生无符号溢出,3 + not(2) + 1 , not(2) = 0xfffffffffffffffd , 3 + 0xfffffffffffffffd + 1 = 1, ,这个过程发生了溢出,C 标志位置为 1, 所以 b.cs 的判断条件成立,跳转到标签 1 处,继续执行。BFI 指令把 X1 寄存器中的 Bit[3,0] 设置为 X0 寄存器中的 Bit[7,4], X0 寄存器中的 Bit[7,4] ,X0 寄存器的值是 0x50。
继续访问
ARM64启动过程分析_内核新视界的博客
不过adrp是page对齐的(adrp中的p就是page的意思),boot_args这个符号当然不会是page size对齐的,因此不能直接使用adrp,而是使用adr_l这个宏进行处理。 这里使用dmb sy指令,在armv8手册中说明:除了dc zva外,所有指定地址的数据缓存指令...
继续访问
ARM 64指令小记_FarmGuo的博客_arm64 指令
call 为x86的跳转指令 bl 为arm的跳转指令 其他 adrp 指令,将pc低12位清零,然后将立即数左移12位进行相加 adrp x8, 10,此时pc 0x00000001026c4478 x8 = 0x00000001026c4000 + 0xa000 = 0x00000001026ce000 在第一次由adrp取得页...
继续访问
arm64 寄存器
arm64 寄存器
继续访问
Linux内存管理:知识点总结(ARM64)
目录 Linux内存管理之CPU访问内存的过程 虚拟地址转换为物理地址的本质 Linux内存初始化 创建启动页表 Linux是如何组织物理内存的? Linux分区页框分配器 Linux页框分配器之伙伴算法 Buddy 分配算法 Buddy 分配函数 Linux分区页框分配器之水位 水位初始化 Linux页框分配器之内存碎片化整理 什么是内存碎片化 碎片化整理算法 碎片化整理的三
继续访问
arm32位和arm64位架构、寄存器和指令差异分析总结_yebanguhe的博客-CSDN...
ARM32位neon寄存器和ARM64位neon寄存器差异: 32位下 NEON寄存器: 包括: 32个S寄存器,S0~S31,(单字,32bit) 32个D寄存器,D0~D31,(双字,64bit) 16个Q寄存器,Q0~Q15,(四字,128bit) ...
继续访问
[register]-ARM64重要寄存器介绍_代码改变世界ctw的博客_sctl...
ENTRY(idmap_cpu_replace_ttbr1) mrs x2, daif //将DAIF寄存器的值,保存在X2寄存器中 msr daifset, #0xf //对DAIF寄存器的值的bit0-3位置1 adrp x1, empty_zero_page msr ttbr1_el1, x1 isb tlbi vmalle1 dsb nsh ...
继续访问
万字整理,肝翻Linux内存管理所有知识点
Linux的内存管理可谓是学好Linux的必经之路,也是Linux的关键知识点,有人说打通了内存管理的知识,也就打通了Linux的任督二脉,这一点不夸张。有人问网上有很多Linux内存管理...
继续访问
arm64汇编adrp指令作用和使用举例
文章目录adrp作用举例1举例2 adrp作用 adrp 寄存器,立即数,作用是把pc寄存器跟立即数按照一定规则计算后赋值给寄存器. 举例1 adrp x8,1 adrp指令是给寄存器赋值.赋值的规则是: 先把pc寄存器里的数值先按照16进制表示,后3位清零,再把adrp 右边的立即数,左移3位,也就是在末尾+3个0 .然后让2个结果相加. 例如上面的例子 pc = 0x0000000104ff6754 然后把pc后3位清零 得到0x0000000104ff6000 adrp x8,1 右边的立即数
继续访问
arm64 架构之入栈/出栈操作_maimang09的博客_arm64 stp
arm64 架构之入栈/出栈操作 - 掘金31 个R0 ~ R30,每个寄存器可以存取一个 64 位大小的数。 当使用 x0 - x30访问时,是一个 64位的数;当使用 w0 - w30访问时,是一个 32 位的数,访问的是寄存器的 低 32 位,如图: (也...
继续访问
ARM64基础7:A64的比较和跳转指令
pstate的nzcv标志位 条件标志位 描述 N 负数标志(上次运算结果为负值,则N=1,否则N=0) Z 上次运算结果为0 C 对于加法运算,无符号溢出,C=1, 其他不变 V 有符号溢出 条件码 后缀助记符 标志位 定义 0000 EQ Z=1 相等 0001 NE Z=0 不相等 0010 CS/HS C=1 无符号大于或者等于 0011 CC/LO C=0 无符号小于 0100 MI N=1 负值 0101 PL N=0 正值或0
继续访问
ARMv8汇编指令-adrp、adr、adr_l
1.概述 在阅读Linux内核代码时,经常能碰到汇编代码,网上能查的资料千篇一律,大多都描述的很模糊。俗话说,实践是检验真理的唯一标准,我们就参考官方文档,自己写汇编代码并反汇编,探寻其中的奥妙。 2.adrp 在Linux内核启动代码primary_entry中,使用adrp指令获取Linux内核在内存中的起始页地址,页大小为4KB,由于内核启动的时候MMU还未打开,此时获取的Linux内核在内存中的起始页地址为物理地址。adrp通过当前PC地址的偏移地址计算目标地址,和实际的物理无关,因此属于位置无关码
继续访问
ARM64汇编入门
现在iOS设备几乎已经都是ARM64架构,此外,Mac M1芯片的电脑也是基于ARM64架构,本文首先对ARM64汇编做一个简单的介绍,然后通过一个Swift枚举的汇编代码窥探枚举的底层实现逻辑,发现了一个超出意料之外的结果。
继续访问
ARM指令解析之ADRP
先反汇编 $ aarch64-linux-gnu-objdump -d -S vmlinux vmlinux.txt 然后再分析5.0内核的相关指令 8068709 ffff000011c30040 __create_page_tables: 8068710 mov x28, lr 8068711 ffff000011c30040: aa1e03fc mov x28, x30 8068712 adrp ...
继续访问
arm64汇编ldr和ldur和ldp指令在xcode中传入地址调用方法
文章目录ldr指令的作用arm.h文件中的声明oc文件中的调用 ldr指令的作用 ldr作用是把 中括号[]中的地址里存的值存入到前面的寄存器中 有下面几种格式: LDR R0, [R1] ; R0←[R1] LDR R0,[R1,#4] ;R0←[R1+4] LDR R0,[R1,#4]! ;R0←[R1+4]、R1←R1+4 LDR R0,[R1] ,#4 ;R0←[R1]、R1←R1+4 LDR R0,[R1,R2] ;R0←[R1+R2] arm.h文件中的声明 #ifndef arm_h #def
继续访问
adrp指令
转自: adrp x0, 1 其实做了下面的步骤 1. 将1的值,左移12位 1 0000 0000 0000 == 0x1000 2.将PC寄存器的低12位清零0x104bee870 == 0x104bee000,这里的PC寄存器的值是到adrp x0 1的那里的PC寄存器里面的值 3.将1 和 2 的结果相加给X0 寄存器!! ...
继续访问
ARM64内联汇编
ARM64内联汇编简单介绍
继续访问
ARM64-memcpy.S 汇编源码分析
汇编源代码文件: 内存拷贝优先级: 数据块地址: 源码分析: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
继续访问
热门推荐 ARM指令浅析2(adrp、b)
其实这篇文章的初衷是分析alpha架构下和arm架构下,为什么相同的用例arm生成的汇编指令会少一些,由于工作的保密性,暂时不介绍alpha生成的指令,因此先来主要分析一下,arm架构之所以少生成汇编指令的原因——adrp指令。 环境依然是ARM架构下的gcc编译器,编译选项为 -O2。 4.Adrp指令 再来看一下arm编译器中的adrp指令 在了解adrp...
继续访问
ARM v8指令集(手册)
1、Conditional Branch - B.cond labelBranch: conditionally jumps to program-relative label if cond is true. - CBNZ Wn, labelCompare and Branch Not Zero: conditionally jumps to program-relative label i
继续访问
arm64汇编篇-常用指令篇
本篇主要记载汇编语言中常用的指令及其代表的含义,实时不断跟新。 CMP w0 , w1 CMP (compare)的意思是比较的意思 相当于将w0减去w1但是不会改变两个寄存器的值即两个寄存器不会变化,但是其结果会影响cpsr状态寄存器的标记值(nzcv)。(把一个寄存器的内容和另一个寄存器的内容或立即数进行比较。但不存储结果,只是正确的更改标志。) BL 跳转到标号处执行 B...
继续访问
ARMv8架构下程序运行时栈帧布局
结合ARM相关文档和在飞腾机器上使用gdb调试实际程序来研究ARM的指令和运行时栈帧布局。主要参考了三篇文档。 1. Procedure Call Standard for the ARM 64-bit Architecture。参考其中的过程调用标准和运行时栈帧布局。 2. ARMv8 Instruction Set Overview。参考其中的指令概述。 3. ARM Com
继续访问
ARM64汇编(一)
CPU概述 CPU的内部部件有寄存器、运算器和控制器。其中运算器负责信息处理,由CPU硬编码指令完成;控制器负责协调控制计算机的其他器件进行工作;寄存器进行数据的临时存储,程序员只需关心寄存器的数据存取即可改变运行CPU运行结果。它们之间由总线连接。 高速缓存 CPU每执行一条指令前都需要从内存中将指令读取到CPU内并执行。而寄存器的运行速度相比内存读写要快很多,为了性能,CPU还集成了一个高速缓...
继续访问
arm64汇编篇-03寄存器
寄存器CPU由控制器、运算器还有寄存器构成,其中寄存器作用就是进行数据的临时存储。CPU的运算速度是非常快的,为了性能CPU在内部开辟一小块临时存储区域,并在进行运算时先将数据从内存复制到这一小块临时存储区域中,运算时就在这一小快临时存储区域内进行。我们称这一小块临时存储区域为寄存器。iPhoneX上搭载的ARM处理器A11它的1级缓存的容量是64KB,2级缓存的容量8M.CPU每执行一条指令前都...
继续访问
adrp arm64
ios
内存
评论列表 (0)