ARMv8 架构百日谈 第一日

来源:互联网 发布:基督教歌曲下载软件 编辑:程序博客网 时间:2024/04/30 01:41

1、aarch64状态下,TCR寄存器决定了va有两个范围,包括EL1和EL0下。

2、x30一般用作函数返回的存储地址用

3、SP是否配置为16byte对齐是可以在EL1下配置的

4、尝试执行一条非word对齐的指令会导致对齐异常

5、PSTATE包含的基本标志有NZCV,分别表示负数,0,进位,溢出,这些标志的作用是为了执行跳转指令的时候进行判断,前面的指令有可能更新这些标志,所以分支预测的时候可能会情况复杂一些,如果你是cpu的设计人员,分支怎么预测呢?

6、PSTATE还包括DAIF四个bit,D在EL0下一般忽略,A是SError类型终端,I和F分别是IRQ和FIQ,取值为1表示mask,取值为0表示打开,值为1表示cpu不接受

7、在EL0下可以通过访问特殊的寄存器来访问PSTATE,包括NZCV和DAIF寄存器,访问的方式采用指令MSR和MRS

8、设置DAIF有两条指令,一个DAIFSET,把DAIF都设置为1,一个DAIFCLR,把DAIF都设置为0,EL0下是否能访问PSTATE,是由SCTLR_EL1.UMA决定的

9、设置DAIF有一些边界效应,不过需要保证两点:a、在设置DAIF之前的指令看不到设置的DAIF值  2、设置DAIF后要对设置DAIF之后的指令生效

10、EL0下,如果没有权限去访问system register的话,会导致undefined instruction异常

11、EL0下能访问的system register包括:cacheid寄存器,debug寄存器,pmu寄存器,线程id寄存器,timer寄存器,

12、ARM的异常包括:中断,内存系统abort,未定义指令,系统调用,secure monitor和hypevisor陷入

13、svc指令提供了一种系统调用的实现方式,未处于privelege的软件可以通过svc指令来实现系统调用

14、WFE和WFI指令都是在等待指令唤醒,没有指令的情况下,core进入低功耗模式,但是两种状态有啥区别,为啥设置这两种状态呢?

15、aarch64地址空间的63-56bit一般都是忽略处理,不会被更新到pc中

16、既然地址空间的63-56bit采用的是忽略处理,那么合法的地址范围到底是0xff 开始的还是0x00开始的,是由高EL的软件来决定的。

17、访问非法的地址空间会导致 MMU fault

18、ARMv8的地址空间有两种属性,分别为normal和device,normal的一般用于大段的地址空间,用来大量读写和只读,device的地址属性有三个特点:gather,reorder,early acknowledge ,分别是什么意思呢,就是读写操作合并,读写操作顺序,写可以提前收到响应,只要把数据放到中途的buf就认为完成。

19、cache的引入在smp系统中提进来两个点:pou和poc,pou的话主要是针对cluster内部,L2就是L1的pou,但是对于多个cluster而言,L3就是L2的poc

20、要想成功的使用cache,内存地址空间属性必须配置两个属性:cacheable和shareable属性

21、v8定义了一系列的cache的maint指令来维护一致性,不过要想在EL0下访问这些指令,需要在EL1进行控制打开,如果控制没有打开,直接执行这些指令会导致permission fault

22、数据一致性问题的几个解决方案:a、使用uncache或者write_through策略 2、关闭cache 3、使用cache的maint指令来解决软件一致性问题 4、使用硬件一致性机制来进行保证  

23、如果软件要来保证icache和memory之间的一致性,那么就需要使用isb指令和dsb指令以及 cache的maint指令来保证icache中的指令和memory中的指令是一致的

24、ARMv8 aarch64允许nocache空间的指令放在icache中运行

25、通过设置SCTLR_EL1.UCI可以决定在应用软件的EL是否能使用这些cache的maint指令

26、PRFM,LDNP,STNP这几条指令主要用来作cache的预取,core可以使用这几条指令去通知memory,提前把需要的指令放到cache中,至于具体的实现,则是由硬件来决定的

27、A64指令必须是word对齐的,如果试图从一个非对齐地址来取指令进行执行会导致一个misaligned pc异常

28、无论对任何类型的device属性空间进行非对齐访问,会导致alignment fault,device包括对g,r,e三种属性的配置

29、任何EL下的load或者store一个或者多个寄存器,非load-exclusive或者store-exclusive指令和load_acquire和store-release指令,非对齐的访问会导致两个结果:

         a、产生一个alignment fault  b、非对齐的访问被通过        这个主要是由于SCTLR_ELx.A来决定的,当A的值为1,align check就会被开启

30、SCTLR_EL1.A会对EL1和EL0的软件都生效,虽然SCTLR_EL1.A只能在EL1下访问

31、ARMv8的对齐一般是进行64bit或者128bit的对齐

32、一次失败的alignment check会导致data abort异常,如果是由于mmu的地址转换到device空间导致的,当前软件在非安全EL0或者EL1,如果是stage1转换的地址,那么异常就会陷入EL1进行处理,如果是stage2转换的地址,那么就陷入EL2进行处理;其他原因导致的alignment check失败,如果是EL0或者EL1,那就陷入EL1,除非HCR_EL2.tge重新指向,EL2下产生的就交给EL2处理,EL3下产生的就交给EL3处理

33、MSByte指的是最高有效字节,LSByte指的是最低有效字节

34、大小端决定的是取出word字节到底怎么解释,比如访问0x1000地址,顺带也会取出来0x1001,0x1002,0x1003,这个word怎么解释是取决于大小端的。

35、A64指令全部是32bits宽,并且是小端存储

36、SCTLR_EL1.E0E bit决定在EL0下执行的数据是大端还是小端,这个bit是在EL1或者更高的EL下进行配置

37、ARM提供了大小端转换的指令,包括REV32, REV, REV16等

38、ARM的原子操作分为一个single-copy和multi-copy,分别是什么意思?single-copy 和multi-copy见另一篇博客

39、ARMv8禁止一个theard执行的指令正在被另一个thread修改,没有经过明显的同步动作

40、IC IVAU在inner shareable区域会被进行广播,无论如何,当一个被修改的指令大家都能看到的时候,所有的PE都必须执行ISB指令保证执行的指令是已经被修改过的指令


今天看了两个半小时,暂时不看了,英文文档看的脑袋痛。

0 0
原创粉丝点击