KeyStone I 笔记 阅读 | semaphores

1、semaphores 硬件模块的目的

在多核环境中,系统资源必须被共享,控制对可用资源的同时访问非常重要。为了确保系统的正确运行,有必要限制一次只能由一个核对资源的访问;也就是说,有必要为多个核共享的资源提供相互排斥。

Semaphore2模块提供了一种机制,应用程序可以用它来实现多个内核之间共享资源的相互排斥。

2、semaphores 硬件模块框图

该模块支持多达64个信号,可以被所有内核访问。该模块产生两组中断:信号授予中断(SEMINTn)和错误中断(SEMERRn)。

在图中, "N "表示可用的内核数量, "M"表示设备上可用的信号灯数量(最多64个)

图1  semaphores 硬件模块框图

3、架构

每个信号都是通过从三个寄存器中的一个读取或写入来控制的:SEM_DIRECT,SEM_INDIRECT,或者SEM_QUERY。

这三个寄存器组成一个集合,每个信号量都连接到一个这样的集合上, 如图1"Semaphore硬件模块框图"中所示。

semaphore模块可以使用三种方法之一来处理请求:直接请求方法、间接请求方法或组合请求方法。这三种方法为应用程序提供了灵活性,可以实现基于轮询的系统或基于中断的回调机制来获取或锁定信号。

模块上的所有信号都没有映射到设备上的任何资源或模块。应用程序可以选择映射任何可用的信号来保护任何资源。 semaphore模块没有提供支持来存储信号到资源的映射信息。该映射信息必须由软件应用程序来维护。

4、概要

信号量操作表
读取写入0写入1
SEM_DIRECT查询并请求查询并将请求信号量缓存释放相关的信号量
SEM_INDIRECT查询并把请求缓存查询并将请求信号量缓存释放相关的信号量
SEM_QUERY只查询查询并将请求信号量缓存释放相关的信号量

5、直接读取

直接请求是用来请求一个信号的最简单的方法。该请求表现为一个原子的读和设置操作。

请求的结果要么是将信号授予请求的内核,要么因为该信号已经被授予了另一个内核而别拒绝请求。

5.1 发出直接请求

直接请求是通过读取与所请求的信号对应的SEM_DIRECT寄存器发出的,有多达64个DIRECT寄存器,每个寄存器对应一个semaphores。

如果信号是空闲的,那么读取返回"0x1";如果请求被拒绝,那么读取返回当前拥有信号的内核的ID。

关于读取值的详细说明,参见 "直接寄存器(SEM_DIRECTn) "。

5.2 直接请求中断

当使用直接请求方法时,不会产生信号授予(SEMINTn)中断。但是,可能会产生一个错误中断。更多的信息,关于semaphore访问错误,请参见8-1页的"错误的产生和处理"。

6、间接请求

间接请求方法通过一次请求就能获得一个semaphore。如果使用直接请求方法不能释放一个信号,应用程序必须继续尝试,直到它被授予一个信号。使用间接方法,对信号量的请求被提交到一个队列中。请求队列由信号模块以"先入先出"的方式依次处理。信号被授予请求队列顶端的核心,并被标记为繁忙状态,直到它被释放,这时将处理下一个请求(如果有的话)。

6.1 发出间接请求

间接请求是通过向SEM_DIRECT、 SEM_INDIRECT或SEM_QUERY寄存器写0x0来发出的,这些寄存器与请求的信号相对应。 如图1"SemaphoreModuleBlockDiagram"(第1-3页) 所示, 这三个寄存器最多有64组,每组对应一个semaphores。当semaphore变得可用或空闲时,该emaphore会被授予将其请求放在队列顶部的核心。

6.2 间接请求中断

当一个信号通过使用间接方法提出的请求被授予一个内核时,会产生一个SEMINTn中断给该内。

7、混合请求

混合信号请求是直接和间接方法的一个混合版本。如果信号灯是空的,它的行为就像直接请求;否则,它的行为就像间接请求,并在队列中发布一个请求。

7.1 发出混合请求

通过读取与被请求的semaphore相对应的SEM_INDIRECT寄存器,发出一个组合请求。

如果semaphore是空闲的,它就会被授予提出请求的内核,并且读取时返回"0x1"。如果semaphore不是空闲的,那么读取结果将返回当前拥有该semaphore的内核的ID。对该信号的请求也会被发布到该信号的队列中。

关于读取值的详细说明,请参考10-7页的"间接寄存器(SEM_INDIRECTn) "。每当发布的请求被处理时,该信号就被授予。

7.2 混合请求中断

对于在提出请求时信号是空闲的联合请求,当信号被授予请求者时,不会产生SEMINTn中断。但是,如果因为在请求时信号没有空闲而被发布到请求队列中,当信号被授予该核心时,会产生一个SEMINT中断。

8、释放信号量

每当一个内核使用完一个共享资源时,它必须释放相关的信号,以便其他等待使用它的进程能够获得访问权。

要释放一个信号并将其状态设置为FREE,应用程序必须向SEM_DIRECT、SEM_INDIRECT或SEM_QUERY寄存器中的一个写上'0x1', 与该信号对应。

9、查询信号量

应用程序需要在不获取信号的情况下检查信号的状态,这是合理的。 semaphore模块提供了查询任何一个semaphores的状态的能力。

要查询一个信号灯的状态,应用程序需要读取与信号灯对应的SEM_QUERY寄存器("查询寄存器(SEM_QUERYn) "在第10-8页)。 查询返回的信息是关于该信号是否是自由的;如果不是自由的,应用程序会返回当前所有者的ID。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值