myDog只是一条遛狗用的狗绳! ? 换句话说说,myDog并不是new出来的放在堆中的对象(object)!myDog只是一个指向这个对象实例的引用(reference)!...最后打印出来的还是1. 值传递和引用传递 上面提到的参数传递过程中的复制操作,说白了,就是 = 操作。...这个 = 操作,是值传递和引用传递的根本差别,这也导致了值传递和引用传递有以下直观上的差别: 如果参数是值传递,那么调用者(方法体外部)和被调用者(方法体内部)用的是两个不同的变量,方法体里面对变量的改动不会影响方法体外面的变量...如果参数是引用传递,那么调用者(方法体外部)和被调用者(方法体内部)用的是两个相同的变量,方法体里面对变量的改动会影响方法体外面的变量。...: Dog dog = new Dog(); dog = null;12 现在我们知道,dog=null就等于是把狗绳给咔嚓减掉了,这样狗就跑了,变成流浪狗了,就像Java中的对象被当做垃圾回收了一样:
本文将围绕着ARMv8的timer虚拟化来展开。 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的虚拟化还是比较简单,就此打住了。
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
进程独立的虚拟地址空间,通过基址/界限寄存器的访问指令,在进程切换时修改基址/界限寄存器的值,从而使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中。
开源项目Xen推进了半虚拟化,通过修改客户机操作系统的核心部分使其更适合在虚拟环境中运行,以此来提高性能。 另一个使用半虚拟化的原因是早期的体系结构并不是为虚拟化而设计的,存在虚拟化漏洞。...这就需要通过以陷入的方式产生异常,在异常处理程序中做相应的模拟。Armv8包含一些陷入控制来帮助实现 陷入(trapping) – 模拟(emulating)。...寄存器的访问 陷入 – 模拟的另一个用途是用来呈现虚拟寄存器的值。例如寄存器ID_AA64MMFR0_EL1是用来报告处理器内存相关特性的,操作系统可能会读取该寄存器来决定在内核中开启或关闭某些特性。...虚拟计数器是在物理计数器的基础上减去一个偏移。Hypervisor负责为当前调度运行的vCPU指定对应的偏移寄存器。这种方式使得虚拟时间只会覆盖vCPU实际运行的那部分时间。...下图展示了虚拟时间运作的原理 在一个6ms的时段里,每个vCPU分别运行了3ms。Hypervisor可以使用偏移寄存器来将vCPU的时间调整为其实际运行的时间。
当发生函数调用时,处理器通常会将当前的 PC (程序计数器) 寄存器值(即返回地址)和其他必要的寄存器保存在栈上,然后将 SP 寄存器减少一定量来为新的函数调用预留空间。...相反,在函数返回时,处理器会使用 SP 寄存器的内容来恢复之前保存的寄存器值并跳回到调用点。...在ARMv8中,将PE的状态抽象为PSTATE。...在实现上,则是一组标志位的集合 ARMv8体系结构提供了一组特殊寄存器,用于访问PSTATE状态位 CurrentEL寄存器 表示PSTATE寄存器中的EL字段 DAIF寄存器 表示PSTATE寄存器中的...(将内核态与用户态隔离的思想,在很多方面都提现了出来,比如内存管理中的内存隔离,内存映射等) PAN寄存器的值如下。 0:表示在内核态可以访问用户态内存。
开源项目Xen推进了半虚拟化,通过修改客户机操作系统的核心部分使其更适合在虚拟环境中运行,以此来提高性能。 另一个使用半虚拟化的原因是早期的体系结构并不是为虚拟化而设计的,存在虚拟化漏洞。...这就需要通过以陷入的方式产生异常,在异常处理程序中做相应的模拟。Armv8包含一些陷入控制来帮助实现陷入(trapping) – 模拟(emulating)。...图13:WFI指令模拟 2.3 寄存器的访问 陷入 – 模拟的另一个用途是用来呈现虚拟寄存器的值。...例如寄存器ID_AA64MMFR0_EL1是用来报告处理器内存相关特性的,操作系统可能会读取该寄存器来决定在内核中开启或关闭某些特性。Hypervisor可能会给VM呈现一个与实际物理寄存器不同的值。...Hypervisor可以使用偏移寄存器来将vCPU的时间调整为其实际运行的时间。
在armv8中,会指定一个异常向量表,将这个异常向量表的首地址交给一个寄存器,当异常发生的时候,则会跳转到相应偏移的处理程序中。...在sparc中,预留了一些可以配置的软件中断,使用ta n来触发系统进入特定的陷阱,其中n表示软件中断标号,这些都是设计者为芯片使用者留下的工具。...系统运行起来后,会初始化状态寄存器,初始化C语言执行需要的环境,比如清除bss段、设置sp栈指针等等。 然后程序进入C语言执行,其中汇编语言中的ret1会主动将pc值填充,然后跳转。...对于一个rtos来说,线程压栈的时候,会把当前的pc、和一些状态寄存器、通用寄存器的值读出来,保存在当前的线程栈中,也就是一块内存中,接着会将另外的一个线程栈的内容从内存中取出来,然后设置pc值、状态寄存器值...、以及通用寄存器值等等,这时在sparc v8上就需要执行ta 3指令了,其中ta n中的n是自己设定的,需要自己实现相关的处理函数,这里只是预留了一个陷阱,至于陷阱怎么处理,那是需要自己来设定的。
虚拟地址被分割为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汇编指令表示将通用寄存器的值存放到协处理器系统寄存器中
---从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目录项的有效性(
每个可细化块 可以定义为: 可细化网络架构将通过用恒等函数替换中间块来跳过每个 层的中间块, 下图显示了该研究的可细化二值化架构的形式化。 此外,该研究还提供了 的实例,如图所示。...为了优化提议的 TBA 的二值化感知训练,该研究采用统一层映射策略来更好地对齐和学习 HED 中的表示: 来自不同分支的梯度在反向传播过程中累积以共同更新权重。...根据 ARMv8 架构上的寄存器数量,该研究首先将内核中的寄存器重新分配为五个分区,以提高寄存器利用率并减少内存占用:分区 A 有四个寄存器(寄存器 v0 除外)用于一个输入(权重 / 激活),B 有两个用于另一个输入...A 中的每个寄存器存储一个输入并重复 8 次,而 B 中的每个寄存器存储 8 个不同的输入。...该研究先对 A 和 B 的一个寄存器进行 EOR 和 CNT,得到 32 个 INT8 结果到中间分区 C,然后执行 ADD 将 INT8 累加到 D,对 B 的另一个寄存器做同样的事情。
,大概流程都是加载数据到寄存器,然后进行计算,最后把寄存器的值写回内存。...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字节 // 之后的一段内存,当然这个偏移量是需要调的 // 因为内存加载是一段段加载的,太远之后的不合理
在ARMv8架构中,使用PSTATE用来描述当前处理器的状态信息。如下的图描述了PSTATE的每个字段的意义 ?...bit位 在ARMv8-A中可以使用特殊功能的寄存器MRS对PSTATE进行读,使用MSR寄存器来对PSTATE进行写操作 ARMv8提供了一些特殊的寄存器,可以直接来操作PSTATE的各个域 ?...比如可以直接使用NZCV来直接操作NZCV各个bit的值 ?...通用在ARMv7中使用的是CPSR寄存器来描述处理器的状态,只不过在ARMv8-A中已经取消了CPSR寄存器 下来看下ARMv7中CPSR寄存器的格式 ?...其中NZCV和AIF和ARMv8是保持一致的。
它们中的任何一种都可以做64位开发,但是对于指定电路板的系统开发还是有点不同。 注意:树莓派3有一个实现ARMv8 64位模式的CPU(Cortex-A53),技术上是能够运行一个64位系统。...创建一个hello.c,并在该文件中写入以下的代码。...(数据在.data指示之后) .globl main 这时另一个汇编器指示,该指示表明main是一个全局符号。...第六行是main标志(如上所述是一个全局的标志)。第七行和第八行是2个指令。第一个指令是设置寄存器w0里面的值为2(我们会在下一张看到什么是寄存器)。第二句式从main函数返回,我们的程序立刻结束。...当一个函数结束,w0寄存器内的内容被用来决定程序的错误码。这就是echo $0为什么会打印2。
ldp 命令将两个寄存器的数据从内存加载到两个参数命名的寄存器中。第三个参数描述了从哪里来读取数据,在这种情况下是 x16 的值再偏移 16 位上,这里存放着类的缓存信息。...mask 是重要的:它描述了哈希表的尺寸,方便用于与运算。它的值经常是一个2的幂减1,用二进制来标识就是像 0000000001111111 这样的后面以一堆 1 结尾的数。...0x0018 add x12, x10, x12, lsl #4 光得到索引是不够的。为了从表中读取数据,我们需要一个真实的地址来加载。这条命令通过表索引加上表指针来计算这个地址。...另一个 ldp,又从缓存的 bucket 中读取。这次它从当前缓存 bucket 偏移 0x10 的地址开始读取。在地址最后的感叹号是一个有趣的特性。...还有另一种情况就是在第一次扫描过程中同时有另一个线程在修改缓存能够让这个线程不命中也不丢弃。C 代码为了解决竞争来做额外的工作。
,偏移量 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 寄存器中的值
因为ARMv8-A为了兼容32位应用程序,所以放ARMv8-A中运行32位应用程序的时候,会时候W0-W30寄存器。只使用其中的低32位。 ?...可以看出每一个64位bits的通用寄存器,其中就存在一个32bits的寄存器。当在ARMv8-A中运行32位应用程序时,只使用低32位。...这里和ARMv8的区别是ARMv8-A的PC寄存器不属于通用寄存器了 同时ARMv7中也提供了CPSR(Current Program Status Register)描述当前处理器状态的寄存器。...因为ARMv8-A是兼容ARMv7的32位应用程序的,当在ARMv8-A中运行32位应用程序发生了异常,则寄存器的map如下 ?...而且各个处理器模式的SP,LR已经由ARMv8其余的寄存器替代了 当异常发生在EL1时,由SPSP_EL1来保存处理器的状态,放异常发生在EL2时,由SPSP_EL2保存处理器的状态等 这样一来ARM64
)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,中断
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 位模式下运行)。
这样,在ARM32中每切换一次进程就需要刷一次TLB表中的本地表项,如果进程切换的频繁,处理器损失的性能是比较大的。...ASID这项技术在ARMv7多处理器架构就开始使用了,只不过在ARMv7里,ASID是8位的,也就是256就溢出了,而在ARMv8架构中,ASID可以配置为16位,也就是计到65536才会溢出,ASID...TTBR寄存器的值,那么很容易知道Linux会为每一个进程分配一个独用的ASID码,Linux为每个为进程分配的ASID值都不相同。...这么一来,MMU再做页表转换时也会把当前的ASID值缓存到TLB快表里, ARM64的TLB机制 有了ASID后,TLB跟以前也不一样了,在进程切换的时候,操作系统也不需要去刷TLB了,因为MMU在做地址转换时会将...TLB表项里的ASID和当前进程的ASID值做比较,只有ASID值相等,MMU才认为这条表项是我需要的。
领取专属 10元无门槛券
手把手带您无忧上云