Linux内核-基本处理器架构

本系列参考《奔跑吧linux内核》第二版,进行汇总和精简,如有错误还请指正。

ARM系列

Linux主要应用在x86和arm架构,而arm又是嵌入式领域的主力芯片,用的是精简指令集,而x86是复杂指令集。

ARMv7架构以Cortex命名,支持虚拟化和安全特性。A系列针对移动端,R系列针对实时性系统,M系列针对单片机,但是一般是32位(大内存模式可以支持40位寻址)

ARMv8是64位处理器,还能兼容v7,能够实现大内存。

处理器架构

大小端

大端模式:数据高位在低内存

小端模式:数据低位在高内存

大端模式符合人类视觉的读取顺序,小端模式符合物理内存地址的存储顺序

指令执行

指令通常是顺序读取,找出其中无地址和数据依赖指令,接着一起乱序执行,然后顺序提交结果到LSQ load store queue--读取存储队列,接着将存储器请求发送倒存储器子系统。

分支预测

分支预测技术是指处理器在遇到分支指令时不再傻傻地等待分支结果,而是直接在取指阶段预测分支“跳”或者“不跳”以及跳转目标地址,目的是根据预测结果来实现不间断的指令流,从而让处理器的CPI再度接近理想情况中的1 

从上一段的表述中可以知道,分支预测要预测两件事分支指令的跳转方向,分支指令的跳转目标地址。这两个信息的预测方法是不一样的。

如果预测出错,处理器要flush掉pipelines, 回滚到之前的分支,然后重新热启动,选择另一条路径。一般现代分支预测硬件命中率能达到90%。

x86执行指令

从L1指令高速缓存读出指令,进行分支预测并译码为微操作,微操作会进入整数单元和浮点数单元,最终结果会进入LSQ单元,LSQ会准备一级缓存使用的地址,开始在L1、L2、L3尝试命中,如果没有命中,访问内存。

ARM执行指令

存储指令通过主存储器或者L2高速缓存加载到L1指令高速缓存,指令预取时进行分支预测,指令分为预测队列和指令队列进入译码,之后进行寄存器重命名,避免指令不必要顺序化,分发、执行后写入寄存器。存储指令会计算有效地址并发送到LSU(load store unit),最终LSU访问L1。

多处理器还要考虑高速缓存一致性

内存屏障

1.编译器可能优化执行顺序,导致内存访问顺序和c语言编写不一致,可以通过内联汇编取消

2.执行时候,多个cpu间交互引起内存乱序访问

乱序执行可能导致程序的读写顺序互换,一般不会影响最终的结果执行。但是在开发操作系统内核等非应用开发领域,需要考虑内存屏障的问题。

高速缓存

处理器访问存储器的时候。会将虚拟地址同时传给TLB和高速缓存。TLB存储着部分虚拟地址到物理地址的对应关系。TLB如果查找到虚拟地址,则得到相应物理地址。否则还是得通过MMU和页表来查找到对应的物理地址。

同时高速缓存会根据编码地址的索引找到对应域。并将该域和mmu转换后的实际物理地址进行比较。如果相同且状态位匹配,发生高速缓存命中。如果没有命中,就需要去主存储器找对应数据了。

高速缓存分为物理高速缓存、虚拟高速缓存还有两者兼有的缓存方式。

物理高速缓存:先找TLB,没有对应物理地址就用MMU转换,通过转换后地址查找高速缓存,找到就返回,没找到去内存找。目前Cortex-A系列采用该方式。

虚拟高速缓存:直接用虚拟地址找是否在高速缓存里,没有再转化为物理地址去内存里面找。可能导致高速缓存同名度高,且每次虚拟地址和物理地址映射改变时候,需要清洗高速缓存,导致性能降低。

两个都用:可能导致多个虚拟地址对应一个物理地址,这样如果一处缓存对应的物理地址的信息已经改变,其它对应到该物理地址且仍然在缓存中的信息还是之前的状态。

页表创建与查询

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值