ARM 独占访问机制

一、独占访问指令和非共享内存区域

对于非共享内存区域,独占访问指令依赖于局部独占监视器,使用Load-Exclusive指令访问的地址会被它标记,使用同一个处理器并且不会被打断的Store-Exclusive指令将清除该标记。

一条Load-Exclusive指令把数据从内存加载到寄存器中,并且:

  • 执行该指令的处理器将会把该地址标记为独占访问状态
  • 该处理器的局部监视器也转变为独占状态

1.1 Store-Exclusive指令

Store-Exclusive会执行条件存储,这个条件取决于局部监视器的状态,该指令中还包含了保存状态值的寄存器。

1.1.1 如果局部监视器处于独占访问状态

  • 并且Store-Exclusive指令的地址和监视器标记的地址相同,那么数据写入成功,否则数据是否写入取决于实现定义
  • 状态值写入到寄存器中
    • 如果写入成功返回0
    • 否则返回1
  • 执行该指令的处理器的局部监视器转换为开放访问状态

1.1.2 如果局部监视器处于开放访问状态

  • 数据存储不会成功
  • 状态值返回1
  • 局部监视器保持开放访问状态

如果向标记地址写入数据的处理器和标记该地址的处理器不是同一个,写入数据是否会清除局部监视器中的标记由实现定义。

1.2 不同指令对局部监视器状态的影响

在这里插入图片描述
任何的Load-Exclusive操作都将更新标记的地址为地址x中最重要的位。

二、独占访问指令和共享内存区域

2.1 共享内存区域中独占访问

对于共享内存区域,独占访问依赖于:

  • 系统中每个处理器的局部监视器,它保存了处理器执行Load-Exclusive指令之后的地址。对应的操作在已经在上一章描述过。
  • 除此之外对于共享内存区域,使用Store-Exclusive指令的地址都会交给全局监视器检查,如果该地址符合上述章节中的描述,下面至少有一个操作被执行:
    • 更新内存
    • 返回状态值为0
    • 本地监视器可以忽略其他处理器的访问
  • 全局的监视器将标记一个地址为某一个处理器独占访问,这个标记用于稍后决定使用Store-Exclusive访问局部监视器中访问未失败的地址是否会发生数据写入。成功写入共享内存区域将会清除标记,对于系统中的处理器,全局的监视器:
    • 可以容纳至少一个标记块
    • 为每个标记块维护一个状态机
    • 对于每个处理器,该架构只需要全局监视器支持单一的标记地址。

全局监视器可以存在于处理器中,在内存接口上作为辅助监视器存在,监视器的实现定义方面意味着全局监视器和本地监视器可以合并为一个单元。前提是该单元执行全局监视器和局部监视器定义的功能。

2.2 全局监视器的运行

Load-Exclusive指令从共享内存中加载数据,全局监视器将该地址标记为该处理器独占访问,该访问将会造成已经被该处理器标记的其他物理地址的独占标记被清除。

全局监视器只支持每个处理器对共享内存的单次独占访问。

一个处理器使用 Load-Exclusive 指令对其他处理器在全局监视器中的状态不会产生影响。

Store-Exclusive指令将会执行条件存储:

  • 只有处理器把某个地址在全局监视器和局部监视器中标记为该处理器独占访问状态,存储数据保证成功,在这种情况下:
    • 状态值0将会返回到寄存器中
    • 对请求的处理器而言,全局监视器状态机的最终状态是由实现定义的。
    • 如果该地址也被其他处理器标记为独占访问状态,那么全局监视器将会把这些标记清除,变为开放访问的状态。
  • 如果没有被请求的处理器标记为独占访问状态,该存储不会成功:
    • 状态值1将会返回到寄存器中,表明存储失败
    • 全局监视器中该地址的状态不会被影响,仍然保持为开放访问状态。
  • 如果全局监视器中该处理器将另外一个地址标记为独占访问状态,存储是否成功取决于实现定义:
    • 如果存储成功返回0,否则返回1
    • 如果在Store-Exclusive指令之前全局监视器中该地址的状态已经是独占访问状态,状态机是否会变成开放访问状态由实现定义决定。
  • 全局监视器为每个处理器实现了单独的状态机,状态机可以对处理器访问共享内存做出反应。这意味着他将对如下行为做出回应:
    • 处理器n的访问
    • 其他处理器对共享内存区域的访问,标识为(!n)

全局监视器为每个处理器实现了一个状态机,状态机可以在系统中产生一条 Load-Exclusive 或者 Store-Exclusive 指令。

2.3 不同指令对全局监视器状态的影响

在这里插入图片描述
对于全局监视器的状态机:

  • 该体系结构不需要load指令,这不是Load-Exclusive指令,不会对全局监视器产生任何影响。
  • Store-Exclusive指令是否成功依赖于发出Store-Exclusive指令的地址和CPU与全局监视器中标记的地址是否匹配,以及局部监视器和全局监视器中是否处于独占状态
  • Load-Exclusive指令可以将被标记的共享内存地址更新为Load-Exclusive指令中的地址。
  • 当处理器处于独占状态时,CLREX指令是否会将全局监视器中的状态从独占访问变成开放访问,由实现定义。
  • 以下由实现定义:
    • 修改一个非共享内存区域,全局监视器是否会从独占状态转变为开放访问状态。
    • 使用 Load-Exclusive 指令是否会从开放访问状态转换为独占访问状态。
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在 Linux ARM 平台上,要访问 PCI 总线设备,通常需要进行以下几个步骤: 首先,要先检查 Linux 版本以确保所使用的内核版本是否支持 ARM 平台上的 PCI 访问。如果是较新的版本,一般会已经自带了对 ARM 的 PCI 支持。 接下来,需要加载适当的内核模块来启用 PCI 的支持。在 ARM 平台上,常见的模块包括 pci, pcie, pci-mvebu, 等等。可以使用 `lsmod` 命令来查看当前已加载的模块,并使用 `modprobe` 命令加载需要的模块。 加载了适当的模块后,可以使用 `lspci` 命令来列出 PCI 设备的信息。该命令会显示出系统中已发现的所有 PCI 设备的详细信息,如设备 ID,厂商 ID,PCI 类型等。 要访问特定的 PCI 设备,需要知道它的总线号、设备号和功能号。可以使用 `lspci -t` 命令来查看系统中各个设备的拓扑结构,并找到需要访问的设备的 PCI 地址。 一旦确定了需要访问的设备的 PCI 地址,可以使用一些工具和库函数来进行访问。例如,可以使用 `pciutils` 软件包的工具 `lspci`, `setpci` 等来获取和设置 PCI 设备的配置寄存器的值。 此外,还可以使用一些编程接口来进行更灵活的访问。一种常见的接口是 `libpciaccess` 库,它提供了一组函数来访问 PCI 配置空间、I/O 空间和内存映射空间。 当程序需要访问 PCI 设备时,可以使用这些接口函数来打开设备、映射和操作设备的寄存器等。 总的来说,在 Linux ARM 平台上访问 PCI 设备需要检查内核支持、加载适当的模块、确定设备的 PCI 地址,使用工具和库函数或编程接口进行访问。 ### 回答2: 在Linux ARM平台上,要访问PCI(Peripheral Component Interconnect,外设组件互联)设备,需要进行一些特定的步骤。 首先,要理解在ARM架构上操作PCI的基本知识。PCI是一种标准化的总线架构,用于连接外部设备和主机系统。它允许主机系统与各种不同类型的设备进行通信和交互。在Linux系统中,访问PCI设备需要使用相关的驱动程序和库函数来实现。 其次,要了解系统上的PCI设备信息。可以使用命令`lspci`来列出系统中存在的PCI设备,包括设备ID、厂商ID、以及设备的地址和IRQ等信息。这些信息将有助于编写驱动程序并进行设备访问。 然后,需要编写相应的驱动程序。在Linux内核中,有一种叫做PCI驱动的模块,用于管理和控制PCI设备。驱动程序需要使用相关的函数和数据结构,如`pci_register_driver()`和`pci_dev`等,来与PCI设备进行通信。在编写驱动程序时,需要注意设备的地址映射、中断处理和数据传输等方面的实现。 最后,进行设备的访问和操作。根据设备的需求,可以通过读写设备的寄存器、发送命令和接收数据等方式来与设备进行交互。在ARM平台上,可能需要使用特定的函数或指令来进行设备的操作。 总之,在Linux ARM平台上访问PCI设备需要了解相关的基本知识,并编写相应的驱动程序来实现与设备的交互。这些驱动程序需要使用特定的函数和数据结构,并考虑设备映射、中断处理和数据传输等方面的实现。这样才能正确地访问和操作PCI设备。 ### 回答3: 在Linux ARM平台上,要访问PCI(Peripheral Component Interconnect)设备,我们需要遵循以下步骤: 1. 确认系统内核是否已配置PCI驱动程序,可通过运行命令`lspci`检查是否能识别到PCI设备。 2. 根据PCI设备的Vendor ID和Device ID,编写相应的驱动程序。可以使用内核提供的通用PCI驱动程序,或是根据具体的PCI设备编写特定的驱动程序。 3. 在设备树(device tree)中添加PCI设备的描述信息,描述该设备的资源分配和连接关系。 4. 在驱动程序中实现适当的操作,如初始化PCI设备、进行内存或IO映射等。 5. 在用户空间中,通过访问`/sys/bus/pci/devices`目录下的相应文件,获取PCI设备的资源信息,并进行访问控制。 6. 可以使用`lspci`命令来验证是否成功访问了PCI设备。 需要注意的是,在ARM平台上,由于其体系结构与x86平台有所不同,因此在编写驱动程序时可能需要考虑一些特殊因素。此外,还需要注意PCI设备所需的特定驱动程序是否可用,并确保内核版本与所需驱动程序的兼容性。 总之,在Linux ARM平台上访问PCI设备,需要编写相应的驱动程序,并进行适当的配置和操作,以实现对PCI设备的访问和控制。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咕咚.萌西

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值