首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

画小狗方法解释Java传递

myDog只是一条遛狗狗绳! ? 换句话说说,myDog并不是new出来放在堆对象(object)!myDog只是一个指向这个对象实例引用(reference)!...最后打印出来还是1. 传递和引用传递 上面提到参数传递过程复制操作,说白了,就是 = 操作。...这个 = 操作,是传递和引用传递根本差别,这也导致了传递和引用传递有以下直观上差别: 如果参数是传递,那么调用者(方法体外部)和被调用者(方法体内部)是两个不同变量,方法体里面对变量改动不会影响方法体外面的变量...如果参数是引用传递,那么调用者(方法体外部)和被调用者(方法体内部)是两个相同变量,方法体里面对变量改动会影响方法体外面的变量。...: Dog dog = new Dog(); dog = null;12 现在我们知道,dog=null就等于是把狗绳给咔嚓减掉了,这样狗就跑了,变成流浪狗了,就像Java对象被当做垃圾回收了一样:

86920

【原创】Linux虚拟化KVM-Qemu分析(七)之timer虚拟化

本文将围绕着ARMv8timer虚拟化展开。 2....和EL3下提供timer,具体取决于ARMv8版本; 有两种方式可以配置和使用一个timer:1)CVAL(comparatoer)寄存器,通过设置比较器,当System Count >= CVAL...时间段里,每个vCPU运行3ms,Hypervisor可以使用偏移寄存器将vCPU时间调整为其实际运行时间; 3....来处理; kvm_handle_sys_reg:调用emulate_sys_reg对系统寄存器进行模拟,在该函数首先会查找访问是哪一个寄存器,然后再去调用相应回调函数; kvm维护了struct...完成,实现功能就是根据物理count和offset计算等; timer虚拟化还是比较简单,就此打住了。

1.6K20
您找到你想要的搜索结果了吗?
是的
没有找到

Linux内存管理之MMU过程

ARMv8访问内存流程 我喜欢方式来说明问题,简单直接: ? 蓝色部分是cpu,灰色部分是内存,白色部分就是cpu访问内存过程,也是地址转换过程。...寄存器,User Space页表基地址存放在TTBR0_EL0寄存器,其中内核地址空间高位为全1,(0xFFFF0000_00000000 ~ 0xFFFFFFFF_FFFFFFFF),用户地址空间高位为全...从CR3寄存器读取页目录所在物理页面的基址(即所谓页目录基址),从线性地址第一部分获取页目录项索引,两者相加得到页目录项物理地址。...不管是页表还是要访问数据都是以页为单位存放在主存,因此每次访问内存时都要先获得基址,再通过索引(或偏移)在页内访问数据,因此可以将线性地址看作是若干个索引集合。...偏移 */ #define pgd_offset(mm, addr) (pgd_offset_raw((mm)->pgd, (addr))) #define pgd_offset_k(addr) pgd_offset

2.2K42

深入理解Linux内核页表映射分页机制原理

进程独立虚拟地址空间,通过基址/界限寄存器访问指令,在进程切换时修改基址/界限寄存器,从而使MMU在做地址转换时找到各个进程对应地址映射表,从而实现不同进程虚拟地址完全独立。...以32位地址空间为例,分页大小为4KB(最常用分页大小),上述抽象例子X为12,那么VPN长度就是20bit,偏移量为12bit。...当页大小为4KB时,分页单元每级页表地址范围如下,其中TnSZmin和TnSZmax分别表示TCR_ELx.TnSZ最小最大,IA表示Input Address,即虚拟地址: 3.4 ARMv8...Paging 以页大小为4KB,虚拟地址位宽为48bit为例,符合上一节TCR_ELx.TnSZ为最小情况,如下图所示。...)1 [r0, #2048]为前索引寻址模式,地址为寄存器R0+立即数2048,偏移量为2048,计算出新地址回写到R0

3.1K10

万字剖析 Armv8 架构虚拟化

开源项目Xen推进了半虚拟化,通过修改客户机操作系统核心部分使其更适合在虚拟环境运行,以此提高性能。 另一个使用半虚拟化原因是早期体系结构并不是为虚拟化而设计,存在虚拟化漏洞。...这就需要通过以陷入方式产生异常,在异常处理程序做相应模拟。Armv8包含一些陷入控制帮助实现 陷入(trapping) – 模拟(emulating)。...寄存器访问 陷入 – 模拟另一个用途是用来呈现虚拟寄存器。例如寄存器ID_AA64MMFR0_EL1是用来报告处理器内存相关特性,操作系统可能会读取该寄存器决定在内核开启或关闭某些特性。...虚拟计数器是在物理计数器基础上减去一个偏移。Hypervisor负责为当前调度运行vCPU指定对应偏移寄存器。这种方式使得虚拟时间只会覆盖vCPU实际运行那部分时间。...下图展示了虚拟时间运作原理 在一个6ms时段里,每个vCPU分别运行了3ms。Hypervisor可以使用偏移寄存器将vCPU时间调整为其实际运行时间。

74030

ARMv8 寄存器

当发生函数调用时,处理器通常会将当前 PC (程序计数器) 寄存器(即返回地址)和其他必要寄存器保存在栈上,然后将 SP 寄存器减少一定量为新函数调用预留空间。...相反,在函数返回时,处理器会使用 SP 寄存器内容恢复之前保存寄存器并跳回到调用点。...在ARMv8,将PE状态抽象为PSTATE。...在实现上,则是一组标志位集合 ARMv8体系结构提供了一组特殊寄存器,用于访问PSTATE状态位 CurrentEL寄存器 表示PSTATE寄存器EL字段 DAIF寄存器 表示PSTATE寄存器...(将内核态与用户态隔离思想,在很多方面都提现了出来,比如内存管理内存隔离,内存映射等) PAN寄存器如下。 0:表示在内核态可以访问用户态内存。

15510

Armv8架构虚拟化介绍

开源项目Xen推进了半虚拟化,通过修改客户机操作系统核心部分使其更适合在虚拟环境运行,以此提高性能。 另一个使用半虚拟化原因是早期体系结构并不是为虚拟化而设计,存在虚拟化漏洞。...这就需要通过以陷入方式产生异常,在异常处理程序做相应模拟。Armv8包含一些陷入控制帮助实现陷入(trapping) – 模拟(emulating)。...图13:WFI指令模拟 2.3 寄存器访问 陷入 – 模拟另一个用途是用来呈现虚拟寄存器。...例如寄存器ID_AA64MMFR0_EL1是用来报告处理器内存相关特性,操作系统可能会读取该寄存器决定在内核开启或关闭某些特性。Hypervisor可能会给VM呈现一个与实际物理寄存器不同。...Hypervisor可以使用偏移寄存器将vCPU时间调整为其实际运行时间。

62020

Linux内存管理与KSMA攻击

虚拟地址被分割为5个部分,前4部分分别是4级页表索引,也可以理解成页表目录,最后1部分为虚拟地址对应实际物理地址页偏移量。...Table Base Register)寄存器获取Level1页表基址,内核地址TTBR1(代表EL1),用户地址TTBR0(代表EL0)。...上图第二行为TTBR寄存器内容表示,寄存器大小为64位,[47:12]指向Level1页表结构体,加上Level1偏移,完成Level1查找。...Linux实现 上面是ARMv8所支持页表分级策略,下面介绍在Linux内核代码具体实现。...SWAPPER_BLOCK_SIZE // next block cmp \start, \end b.ls 9999b .endm MMU 开启MMU代码如下,msr汇编指令表示将通用寄存器存放到协处理器系统寄存器

1.3K40

sparc v8架构异常处理

armv8,会指定一个异常向量表,将这个异常向量表首地址交给一个寄存器,当异常发生时候,则会跳转到相应偏移处理程序。...在sparc,预留了一些可以配置软件中断,使用ta n触发系统进入特定陷阱,其中n表示软件中断标号,这些都是设计者为芯片使用者留下工具。...系统运行起来后,会初始化状态寄存器,初始化C语言执行需要环境,比如清除bss段、设置sp栈指针等等。 然后程序进入C语言执行,其中汇编语言中ret1会主动将pc填充,然后跳转。...对于一个rtos来说,线程压栈时候,会把当前pc、和一些状态寄存器、通用寄存器读出来,保存在当前线程栈,也就是一块内存,接着会将另外一个线程栈内容从内存取出来,然后设置pc、状态寄存器...、以及通用寄存器等等,这时在sparc v8上就需要执行ta 3指令了,其中ta nn是自己设定,需要自己实现相关处理函数,这里只是预留了一个陷阱,至于陷阱怎么处理,那是需要自己设定

84120

深入理解虚拟 物理地址转换,页表--基于ARMV8

---从addr中提取页中间目录表项索引 pmd_offset(pud,addr) ---接受页上级目录指针,和虚拟地址作为参数,这个宏产生目录项addr在页中间目录项偏移地址...armv8规定,所有页级别都是同一个描述符格式,PGD只能输出下一级目录表基地址。...PTE描述符不能指向另一个基地址,只能输出块地址。...页表查询,因此在进程切换时,TTBR0(task_struct.mm.pgd)是要同时改变,这也与linux每一个进程都独占整个虚拟(此为512G)地址空间相对应; 三、转换流程 据此可以画出如下转换框图...6,PMD包含512个64位PTE表,从虚拟地址获取VA[30:21]进行索引,PMD+(index[30:21]8),MMU从PMD表项读取PTE表基地址; 7,MMU检查PMD目录项有效性(

16400

IJCAI 2022 | 推理速度22.3倍提升,北航、字节跳动提出二化关键字识别模型

每个可细化块  可以定义为: 可细化网络架构将通过恒等函数替换中间块跳过每个  层中间块, 下图显示了该研究可细化二化架构形式化。 此外,该研究还提供了  实例,如图所示。...为了优化提议 TBA 化感知训练,该研究采用统一层映射策略更好地对齐和学习 HED 表示: 来自不同分支梯度在反向传播过程累积以共同更新权重。...根据 ARMv8 架构上寄存器数量,该研究首先将内核寄存器重新分配为五个分区,以提高寄存器利用率并减少内存占用:分区 A 有四个寄存器寄存器 v0 除外)用于一个输入(权重 / 激活),B 有两个用于另一个输入...A 每个寄存器存储一个输入并重复 8 次,而 B 每个寄存器存储 8 个不同输入。...该研究先对 A 和 B 一个寄存器进行 EOR 和 CNT,得到 32 个 INT8 结果到中间分区 C,然后执行 ADD 将 INT8 累加到 D,对 B 另一个寄存器做同样事情。

56620

移动端arm cpu优化学习笔记第4弹--内联汇编入门

,大概流程都是加载数据到寄存器,然后进行计算,最后把寄存器写回内存。...arm v8 有 31 个 64-bit 通用寄存器 x0-x30 表示,和v7不一样是,这31个寄存器也可以作为 32-bit 寄存器来用, w0-w30 表示,其中 wn 是 xn 低32...armv7 包含 16 个 128-bit 向量寄存器 q0-q15 表示,其中每个q寄存器又可以拆分成两个 64-bit 向量寄存器来用, d0-d31 表示,对应关系: $q{n} = (.../aliqing777/article/details/50847440] armv8 则有更多向量寄存器,32个 128-bit 向量寄存器 v0-v31 表示, 而其表达形式比起v7更加灵活...,需要读取数据已经 // 在cache,所以可以看到预加载arr1Ptr偏移128字节 // 之后一段内存,当然这个偏移量是需要调 // 因为内存加载是一段段加载,太远之后不合理

2.9K00

AArch64教程第一章

它们任何一种都可以做64位开发,但是对于指定电路板系统开发还是有点不同。 注意:树莓派3有一个实现ARMv8 64位模式CPU(Cortex-A53),技术上是能够运行一个64位系统。...创建一个hello.c,并在该文件写入以下代码。...(数据在.data指示之后) .globl main 这时另一个汇编器指示,该指示表明main是一个全局符号。...第六行是main标志(如上所述是一个全局标志)。第七行和第八行是2个指令。第一个指令是设置寄存器w0里面的为2(我们会在下一张看到什么是寄存器)。第二句式从main函数返回,我们程序立刻结束。...当一个函数结束,w0寄存器内容被用来决定程序错误码。这就是echo $0为什么会打印2。

1.4K10

iOS - Dissecting objc_msgSend on ARM64

ldp 命令将两个寄存器数据从内存加载到两个参数命名寄存器。第三个参数描述了从哪里来读取数据,在这种情况下是 x16 偏移 16 位上,这里存放着类缓存信息。...mask 是重要:它描述了哈希表尺寸,方便用于与运算。它经常是一个2幂减1,二进制标识就是像 0000000001111111 这样后面以一堆 1 结尾数。...0x0018 add x12, x10, x12, lsl #4 光得到索引是不够。为了从表读取数据,我们需要一个真实地址加载。这条命令通过表索引加上表指针计算这个地址。...另一个 ldp,又从缓存 bucket 读取。这次它从当前缓存 bucket 偏移 0x10 地址开始读取。在地址最后感叹号是一个有趣特性。...还有另一种情况就是在第一次扫描过程同时有另一个线程在修改缓存能够让这个线程不命中也不丢弃。C 代码为了解决竞争做额外工作。

63040

Dalvik指令集

偏移量 AAAA 不能为0 goto/32 +AAAAAAAA 无条件跳转到指定偏移处 packed-swtich vAA, +BBBBBBBB vAA 寄存器为 swtich 分支需要判断,...BBBBBBBB指向一个packed-swtich-payload格式偏移表,表时 递增 偏移量 sparse-swtich vAA, +BBBBBBBB vAA 寄存器为 swtich 分支需要判断..., BBBBBBBB指向一个packed-swtich-payload格式偏移表,表时 无规律 偏移量 if-test vA, vB, +CCCC 条件跳转指令用于比较 vA 和 vB 寄存器...if-testz vAA, +BBBB 将 vAA 寄存器与 0 比较,如果满足或者为 0,则跳转到 BBBB 偏移处,BBBB 不能为0 if-test 指令如下: 指令 作用 if-eq...vBB 和 vCC 寄存器进行 异或运算 vBB XOR vCC shl-type 将 vBB 寄存器(有符号数)左移 vCC 位 vBB<<vCC shr-type 将 vBB 寄存器

64320

ARMv8-A vs ARMv7 Registers

因为ARMv8-A为了兼容32位应用程序,所以放ARMv8-A运行32位应用程序时候,会时候W0-W30寄存器。只使用其中低32位。 ?...可以看出每一个64位bits通用寄存器,其中就存在一个32bits寄存器。当在ARMv8-A运行32位应用程序时,只使用低32位。...这里和ARMv8区别是ARMv8-APC寄存器不属于通用寄存器了 同时ARMv7也提供了CPSR(Current Program Status Register)描述当前处理器状态寄存器。...因为ARMv8-A是兼容ARMv732位应用程序,当在ARMv8-A运行32位应用程序发生了异常,则寄存器map如下 ?...而且各个处理器模式SP,LR已经由ARMv8其余寄存器替代了 当异常发生在EL1时,由SPSP_EL1保存处理器状态,放异常发生在EL2时,由SPSP_EL2保存处理器状态等 这样一ARM64

96731

ARMv8-A architecture overview

)MMU用于将虚拟地址转化为物理地址 每个Core中都有一个L1 指令和数据Cache,一般每四个core会在一个Cluster 存在一个L2 cache 多个core可能通过Coherent Bus...可以看到一个Cluster每个core都有一个L1 Cache,一个Cluster存在一个L2cache用于多个core之间共享数据。...而在ARMv8-A下使用是EL0-EL3 ARMv8-A增加了通用寄存器数量,可以减少函数栈大小。...ARMv8-A下使用了30个通用寄存器,ARMv7下只有15个通用寄存器 ARMv8-A增加了TLB大小,减少TLB MISS概率 ARMv8-A架构完全支持ARMv7架构下应用程序 等等等 下面的几节文章从以下几个模块分析...ARMv8-A下通用寄存器和ARMv7通寄存器做对比 ARMv8-A新引入Exception Level ARMv8异常 ARMv8下Memory,MMU, LTB ARMv8下GIC,中断

1.2K11

Windows程序设计学习笔记(一)Windows内存管理初步

在早期16位8086CPU我们使用段与段内偏移偏移方式寻址,得到是真实物理地址,当时寄存器是16位而地址总线是20位,为了充分利用这些地址总线,Intel工程师采用是分段方式,将段寄存器与通用寄存器数值通过地址加法器合成...所以32位通用寄存器都可以访问4GB内存空间,这个时候段寄存器不在存储段首地址段,寄存器DS、CS、ES等寄存器存储是段选择子索引。...,将段寄存器16位数据作为段描述符表索引,称为选择子。...为了确定所在段描述符位置,段寄存器16位数据只有13位表示段描述索引。...对于一个虚拟地址XXXX:YYYYYYYY首先判断XXXXTI位,当TI = 0时表示是全局段描述符表,这个时候首先利用GDTR确定GDT位置,然后直接取段寄存器中高13位作为索引

49210

aarch64 和 ARMV8 区别

aarch64 和 ARMv8 是紧密相关但涵义不同术语,在解释他们区别之前,让我们先简单理解它们各自含义: ARMv8: ARMv8 是指 ARM 架构第八个版本,这是由 ARM Holdings...这个版本首次引入了对 64 位处理器支持,它被设计提供增强性能,更好电能效率,以及对现代计算需求支持,比如高级多媒体和安全性能等。...AArch64: AArch64 是 ARMv8 架构中用来描述 64 位处理器状态和对应指令集术语。当处理器运行在这个状态下时,它可以执行 64 位指令集并访问 64 位寄存器。...而 aarch64 指的是 ARMv8 架构 64 位指令集。也就是说,aarch64 是 ARMv8 一部分。...所有运行在 aarch64 模式下ARM处理器都基于 ARMv8 架构,但 ARMv8 架构也包括对之前架构如 ARMv7 兼容支持(例如,在 32 位模式下运行)。

97510
领券