ARMv8-A编程指导之多核处理器(2)

本文讨论了支持SMP(对称多处理)操作系统的内核任务调度器,它负责在多核心之间分配时间片。系统定时器在确保任务切换中起关键作用,而同步则依赖于互斥锁和独家访问指令,如LoadExclusive和StoreExclusive。在多核环境中,数据访问的同步至关重要,防止资源冲突。文章还提到了ARM架构中的同步指令和其在内存模型中的应用。
摘要由CSDN通过智能技术生成

1.3 Timers

        支持SMP操作的操作系统内核通常会有一个任务调度器,它负责core的时间片在多个任务之间的分配。它动态的决定了单个任务的优先级和决定哪个任务运行在每个core上。一个定时器被要求来保证任务在每个core上的运行可以被周期性的打断,给调度器机会来选择不同的任务来执行。

        当所有core竞争相同的资源时这会存在问题。每个core执行调试器来决定它应该执行哪个任务且这是在固定时间发生的。内核调试代码要求一些共享数据的使用,如一系列任务,它们可以通过exclusive(由mutex提供)来保护同步访问。mutex仅允许在任何时刻只在一个core上执行调度器。

        系统定时器架构描述了一个通用的系统计数器,该计数器能够对每个core提供4个定时器通道。系统计数器运行在一个固定的时钟频率。存在安全和非安全物理定时器,两个虚拟化目的的定时器。每个通道有一个比较器,它与一个64位宽的系统计数作比较,它从0开始计数。你可以配置定时器,因此当计数大于或等于编程的比较器值时,中断会产生。

        虽然系统定时器必须有一个固定的频率,通常MHZ,更新粒度也是允许的。这意味着取代通过加1增加计数,每个时钟tick,你可以通过更大量比如10或100增加定时器,对应的每10或100cycle。这通过更新的粒度给出了相同的频率。这在低功耗状态下很有用。

        CNTFRQ_EL0寄存器报告系统定时器的频率。

        一个通常的误区为CNTFRQ_EL0由所有的core共享。实际上该寄存器是每core的,仅从firmware的视角来看:其它软件应该看到在所有的core上被初始化为正常的值。但是计数器频率是全局的且对所有的core都是固定的。CNTFRQ_EL0提供了更便利的方法来引导ROM或firmware来告诉其他软件全局计数器频率是多少,但是不会控制硬件的行为。

        CNTFRQ_EL0寄存器报告当前计数值。CNTKCTL_EL1控制是否EL0可以访问系统定时器。

        为配置定时器,需要完成以下步骤:

  1. 写一个比较值到CNTP_CVAL_EL0,64位寄存器;
  2. 在CNTP_CTL_EL0中使能计数器和中断产生;
  3. 轮询CTP_CTL_EL0报告EL0定时器中断的初始状态;

        你可以使用系统定时器作为countdown定时器。在这种情况下,要求的计数被写入到CNTP_TVAL_EL0寄存器。硬件计算正确的CNTP_CVAL_EL0值。

1.4 同步

        在SMP系统中,数据访问必须在任何时候都被限制在一个修饰符(?)。这对外设来说是对的,通过超过一个线程或进程访问的全局变量和数据结构也是对的。这种共享资源的保护通常是通过称为mutual exclusion的方法。在多core系统中,你可以使用spinlock,它是一个共享的有效标志,通过测试和设置它的值。

        ARM架构提供三个与独自访问的指令,这些指令的变量可以运行在byte,半字,或双字。

        指令依赖core或内存系统标记特定地址的能力,以便使用独自访问monitor进行独自访问监控。这些指令的使用在多core系统中实现运行在同一个core上多个线程同步操作是通用的,但也在单core系统中使用。

A64指令集有如下指令来实现这种同步功能:

  1. Load Exclusive(LDXR): LDXR W|Xt, [Xn]
  2. Store Exclusive(STXR): STXR Ws, W|Xt, [Xn],其中Ws表示是否store成功完成。0=成功。
  3. Clear Exclusive access monitor(CLREX),这用于清除本地Exclusive monitor的状态。

        LDXR发出内存加载,但也标记物理地址,该物理地址由core独自访问并监控。STXR发出内存的条件的store,若目标地址被标记时成功。若store没有成功,指令在通用寄存器Ws中返回非零值,若store成功,返回0。在汇编程序语法中,它通常被指定为W寄存器,而不是X寄存器。另外,STXR清除独自的标记。

Load exclusive和Store exclusive操作仅保证对被映射到如下属性的normal内存:

  1. Inner or Outer shareable
  2. Inner Write-Back
  3. Outer Write-Back
  4. Read和Write分配暗示
  5. 非短暂的

        mutex或spinlock可以用于控制对外设的访问。Lock的位置在正常RAM中。你不用load exclusive或store exclusive来访问外设。

        每个core仅有一个标记的地址。Exclusive monitor不会阻止其他core或线程来读或写监控的位置,但简单monitor是否位置由LDXR被写。

        虽然架构和硬件支持exclusive访问的实现,但是它们仍依赖于程序者实施正确的软件行为。mutex仅为一个标志,exclusive访问机制使这个标志以原子方式。任何访问标志的线程或程序可以知道它是否正常设置。但是,mutex控制的实际资源仍可以被不正确的软件直接访问。类似的,用于store mutex的内存没有特别的属性。当exclusive access时序完成时,它仅为内存的另一片数据。

        此外,当使用mutex写代码来保存资源时,理解弱时序内存模型是十分重要的。比如,没有正确使用barrier以及其他内存顺序考虑,预测可能意味着数据在mutex被授予之前被加载,或mutex在重要资源被更新之前被释放。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值