SMMU软件指南之系统架构考虑
安全之安全(security²)博客目录导读
目录
5.1 I/O 一致性
5.2 客户端设备
5.2.1 地址大小
5.2.2 缓存
5.3 PCIe 注意事项
5.3.1 点对点通信
5.3.2 No_snoop
5.3.3 ATS
5.4 StreamID 分配
5.5 MSI
本博客介绍与 SMMU 相关的一些系统架构注意事项。
5.1 I/O 一致性
如果一个设备的事务窥探(snoop)PE cache以寻找内存的可缓存区域,那么它与PE cache的I/O是一致的。这可以通过避免缓存维护操作(Cache Maintenance Operation, CMO)来提高性能。设备无需访问外部内存,而 PE 也不会嗅探设备cache。
如果设备与 PE cache保持 I/O 一致性,则不需要对与设备共享的内存进行 CMO。此内存在 CPU 上映射为Inner Write-Back (iWB), Outer Write-back (oWB), and Inner shareable (ISH)。如果设备与 PE 缓存不保持 I/O 一致性,则需要对映射为 iWB-oWB-ISH 的共享内存进行 CMO。
以下类型的 SMMU 访问可以是 I/O 一致的:
• SMMU 发起的事务
◦ 翻译表遍历
◦ 获取 L1STD、STE、L1CD 和 CD
◦ 命令队列、事件队列和 PRI 队列访问
◦ MSI 中断写入
• 设备发起的事务
◦ 如果SMMU与系统的接口支持I/O一致性,则可以使简单的非一致性设备实现I/O一致性。SMMU 可以重写来自客户端设备的事务的可缓存性和共享性属性,使得输出到互连中的事务能够嗅探 PE 缓存。
SMMU 是否支持发出一致访问由 SMMU_IDR0.COHACC 指示。
【注意】Arm 基础系统架构要求翻译表和配置结构访问支持 I/O 一致性。
为了支持 I/O 一致性访问,SMMU 需要提供正确一致性保证的互连端口。例如,AMBA 互连中的 ACE-Lite 端口可以支持 I/O 一致性访问。
5.2 客户端设备
本节描述了客户端设备的一些要求,包括:
• 地址大小
• 缓存
• 对 PCIe 设备或根端口的要求
• StreamID 分配
• 消息信号中断(Message Signalled Interrupts)
5.2.1 地址大小
SMMU 的架构输入地址大小为 64 位。如果发生以下任一情况:
• 客户端设备输出的地址小于 64 位。
• 客户端设备与 SMMU 输入之间的互连支持的地址小于 64 位。
则较小的地址会以系统特定的方式转换为 64 位的 SMMU 输入地址。SMMU 会对扩展后的 64 位地址执行输入范围检查:
• N 被定义为 VA(虚拟地址)区域的大小,由 CD.T0SZ 或 CD.T1SZ 控制,例如 40 位。
• 如果使用了高字节忽略(Top Byte Ignore),即 CD.TBI0 或 CD.TBI1,则 VA[55:N-1] 的所有位都相同。
• 如果未使用高字节忽略,则 VA[63:N-1] 的所有位都相同。
5.2.2 缓存
连接在 SMMU 后面的设备不能包含与系统其余部分完全一致的缓存,因为嗅探(snoop)与物理缓存行有关,而 SMMU 无法从物理地址(PA)反向转换为虚拟地址(VA)。这些设备可能包含不支持硬件一致性的缓存,此类缓存必须通过软件维护。
然而,包含通过 SMMU 使用 ATS(地址转换服务)填充的 TLB 的客户端设备可以保持完全一致的物理地址缓存,利用 TLB 将内部地址转换为物理地址后再进行缓存访问。SMMU 上游的任何物理地址缓存都必须保持一致性。例如,使用 ATS 来转换虚拟地址和一致性物理地址缓存的 CXL.cache 或 CCIX 客户端设备。
5.3 PCIe 注意事项
在与 PCIe 子系统配合使用时,SMMU 实现必须支持至少完整的 16 位 PCIe 请求者 ID 范围。系统必须确保根端口以一对一或线性方式将 PCI 请求者 ID 生成 StreamID,以便满足 StreamID[15:0] == RequesterID[15:0] 的关系。可以通过串联来自多个 PCI 域(或“段”)的请求者 ID 来构建更大的 StreamID,例如:
• StreamID[17:0] == { pci_rp_id[1:0], pci_bus[7:0], pci_dev[4:0], pci_fn[2:0] },即 StreamID[17:0] == { pci_domain[1:0], RequesterID[15:0] };
在支持 PASID 的 PCIe 系统中,系统必须确保根端口以一对一方式从 PCI PASID 生成子流 ID(SubstreamID)。建议 SMMU 支持与客户端根端口相同或更少的 PASID 位数,以便软件能够通过 SMMU 检测端到端的子流 ID 功能。这是因为软件可以查看 SMMU_IDR1.SSIDSIZE 寄存器字段来了解有多少位的 PASID 可用。如果根端口支持的位数少于 SMMU_IDR1.SSIDSIZE,则需要在其他地方提供此信息,例如固件表。
Arm 基础系统架构要求如果系统支持 PCIe PASID,则至少支持 16 位 PASID。该支持必须是从根端口到需要 PASID 支持的 SMMU 的完整系统支持。
属于 PCIe 终端设备的流不应被阻塞(stall)。终止(terminate)模型是唯一可行的选择。阻塞 PCIe 事务可能会导致来自 PCIe 终端设备的超时(恢复可能较难),或在某些场景中导致死锁。系统允许出于安全原因实施终止模型。例如,LTI 协议包括 LAFLOW 信号,AXI/ACE-Lite 问题 H 包括 AxMMUFLOW 信号,DTI 协议包括 DTI_TBU_TRANS_REQ.FLOW。所有这些信号和消息均支持 NoStall 模式,可以实施终止模型。如果发生转换错误,即使 SMMU 已为此转换上下文启用了 Stall Faulting,也会在不依赖于 SMMU 软件配置的情况下返回错误响应。
特别地,PCIe 流量不应等待任何 PE 操作,包括清空事件队列或重新启动被阻塞的事务。PCIe通信必须始终向前推进,而不受软件的无限延迟的影响。
5.3.1 点对点通信
PCIe 点对点(P2P)通信允许两个 PCIe 设备在彼此之间直接传输数据,而无需使用主机内存作为临时存储。是否支持通过系统的 P2P 流量取决于系统的具体情况。在支持 PCIe 层级进行 P2P 通信而无需经过 SMMU 的系统中,SMMU 无法隔离 PCIe 设备。为了解决此问题,PCIe 规范包含对 PCIe 访问控制服务(Access Control Services, ACS)的支持:
• 使用 ACS 时,当交换机端口看到对对等交换机端口的请求时,它将 P2P 请求上行传输至根端口进行请求验证,以检查事务是否被允许以对等设备为完成者。
• 根端口决定是否可以将此请求转发至其预期目标设备。
• PCIe 规范指示,此决定借助重定向请求验证逻辑做出。
• SMMU 是唯一可以实施此隔离的代理,因此其扮演了重定向请求验证逻辑的角色。
• 如果 P2P 请求在 SMMU 查找中导致错误响应,则其为 ACS 违规错误。这可能由以下原因之一引起:
◦ 请求没有访问目标位置的必要权限。
◦ 请求的 VA 没有与请求设备上下文的转换表结构中存在的有效 VA 到 IPA 或 VA 到 PA 转换。
◦ 存在配置错误或某些暂时性错误。
5.3.2 No_snoop
PCIe 事务包含一个 No_snoop 属性。如果 PCIe 事务中设置了 No_snoop 属性,则表示允许该事务“退出”硬件缓存一致性。软件缓存一致性确保该访问不会命中缓存,从而允许 I/O 访问避免嗅探缓存。与该事务关联的内存属性必须被替换为 Normal-iNC-oNC-OSH。
No_snoop 的支持取决于系统。如果实现了 No_snoop,则其会将最终访问属性从 Normal 可缓存类型转换为 SMMU 下游的 Normal-iNC-oNC-OSH。
5.3.3 ATS
PCIe 功能可能会认为在地址转换缓存(ATC)中缓存转换是有益的。功能或软件可以考虑以下情况:
• 在较长时间内频繁访问的内存地址范围,或相关的缓冲区内容具有较高的更新速率。
• 例如,以下内存地址范围:
◦ 工作和完成队列结构
◦ 低延迟通信的数据缓冲区
◦ 图形帧缓冲区
◦ 用于缓存特定功能内容的主机内存
5.4 StreamID 分配
系统设计人员为请求方分配一个唯一的 StreamID 以输入 SMMU。StreamID 命名空间是每个 SMMU 单独的,因此 StreamID 必须在每个 SMMU 内唯一。
在具有 RME DA 扩展的 SMMU 的机密计算架构(CCA)系统中,设备接口可以在可信或非可信模式下操作:
- 在非可信模式下操作时,SEC_SID = 非安全(Non-secure)
- 在可信模式下操作时,SEC_SID = 领域(Realm)
在这两种模式下,提供给 SMMU 的 StreamID 是相同的。例如,请求者 ID 为 0x100 的 PCIe 设备将以 StreamID 0x100 输入到 SMMU,但由于设备配置的更改,SEC_SID 可能会改变。
【注意】:在 Linux 中,SMMUv3 驱动程序不支持多个设备在相同 SMMU 下使用相同的 StreamID。
有关 PCIe 设备 StreamID 生成,请参见 PCIe 注意事项。
由于与物理设备关联的 StreamID 是系统特定的,系统软件通过固件描述将 StreamID 提供给操作系统。ACPI 表和设备树均可将 StreamID 呈现给每个设备的操作系统。
5.5 MSI
在 Arm GICv3 架构中,GIC 中断翻译服务(Interrupt Translation Service,ITS)隔离了 MSIs。参见《区域特定外设中断(LPls) Arm 通用中断控制器 v3 和 v4》。
ITS 接收包含 EventID 和 DeviceID 输入的 MSI 写入信息,并使用这些信息选择正确的 PE 或虚拟 PE 和 IRQ 号以触发中断。
ITS 需要 DeviceID 输入来隔离中断源。Arm 基础系统架构提供了如何从 StreamID 生成 DeviceID 的规则,该 StreamID 通过 SMMU 传递。最简单的方法来实现相同粒度的中断源的区分和
SMMU DMA区分是从设备的SMMU StreamID生成设备的DeviceID。这种关系越简单,对高级软件和固件系统描述越有利。DeviceID 可以一对一地或通过简单线性偏移从 StreamID 派生。
ITS 寄存器映射提供一个包含一个 MSI 目标寄存器的页面。此页面可以通过 SMMU 安全地暴露给设备,例如:
- 当设备分配给用户空间驱动程序时,该页面可以通过一级转换映射到设备,以便用户空间驱动程序用 VA 目标编程 MSIs。
- 当设备分配给虚拟机(VM)时,该页面可以通过二级转换映射到设备,使得guest操作系统使用 IPA 目标编程 MSIs。
在非 CCA 系统中,设备总是以 SEC_SID = 非安全(Non-secure)的方式向 SMMU 提供 MSIs。
在具有 RME DA 扩展的 CCA 系统中,兼容 TEE 设备接口安全协议(TDISP)的设备可以以两种方式发送 MSIs:
- 如果通过配置空间的 MSI 功能配置 MSI,则它以 T = 0 发送到主 SoC,并因此以 SEC_SID = 非安全的方式呈现给 SMMU。
- 如果通过设备接口的受保护 MMIO 区域中的 MSI-X 功能配置 MSI,则它以 T = 1 发送到主 SoC,并因此以 SEC_SID = 领域的方式呈现给 SMMU。
来自单个设备接口的 MSIs 不论使用哪种 MSI 机制,都会以相同的 DeviceID 呈现给 GIC ITS 接口。MSI 的目标 PA 空间由转换表中的配置决定。
相关文章:

SMMU软件指南之系统架构考虑
安全之安全(security)博客目录导读 目录 5.1 I/O 一致性 5.2 客户端设备 5.2.1 地址大小 5.2.2 缓存 5.3 PCIe 注意事项 5.3.1 点对点通信 5.3.2 No_snoop 5.3.3 ATS 5.4 StreamID 分配 5.5 MSI 本博客介绍与 SMMU 相关的一些系统架构注意事项。 5.1 I/O 一致性 如…...

使用高云小蜜蜂GW1N-2实现MIPI到LVDS(DVP)转换案例分享
作者:Hello,Panda 大家晚上好,熊猫君又来了。 今天要分享的是一个简单的MIPI到LVDS(DVP)接口转换的案例。目的就是要把低成本FPGA的应用潜力充分利用起来。 一、应用背景 这个案例的应用背景是:现在还在…...

「C++笔记」unordered_map:哈希化的无序映射函数(键值对)
unordered_map 是 C 中一个经过哈希函数(Hash)处理的映射(map)容器。 本文中的map和set是差不多的,unordered_map与unordered_set也是对应的。所以不再单独写一篇了。 这里的内容建议看完本文之后再回过头来看 二者虽然…...

Linux 安装jdk
1、官网下载jdk https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html2、以tar包为例,在window或者Linux解压都可以,这里直接在win解压了,上传到服务器 3、在/usr/local/ 创建jdk目录,将jdk上传到…...
asp.net core 发布到iis后,一直500.19,IIS设置没问题,安装了sdk,文件夹权限都有,还是报错
原因就是没有安装ASP.NET Core 9.0 Runtime (v9.0.0) - Windows Hosting Bundle,我是只安装了.net core的sdk,下面介绍下sdk和hosting bundle的关系 在 .NET Core 和 ASP.NET Core 的开发中,SDK(Software Development Kit&#x…...

【Go】运行自己的第一个Go程序
运行自己的第一个Go程序 一、Go语言的安装Go环境安装查看是否安装成功配置GOPROXY(代理) 二、Goland安装三、Goland破解四、新建项目 开一篇专栏记录学习Go的过程,一门新语言从hello world开始,这篇文章详细讲解Go语言环境搭建及hello world实现 一、Go语…...
qt qss文件的使用
qt样式的修改方式 一 通过ui界面的改变样式表来直接修改显示效果。 不推荐,其他人不好修改,不够直观,不易维护。 二 通过setStyleSheet接口修改。 一般,界面很少的时候可以使用。一旦界面多起来,代码部分就显得杂乱…...

【管道——二分+区间合并】
题目 思路 区间合并 1、按照左端点排序2、遍历窗口,若窗口非法,继续遍历;否则执行33、若是第一个窗口,设定合并结果初值,判断结果左端点是否造成“起点过大”,是,FALSE退出;否则执行…...

宽带、光猫、路由器、WiFi、光纤之间的关系
1、宽带(Broadband) 1.1 宽带的定义宽带指的是一种高速互联网接入技术,通常包括ADSL、光纤、4G/5G等不同类型的接入方式。宽带的关键特点是能够提供较高的数据传输速率,使得用户可以享受到稳定的上网体验。 1.2 宽带的作用宽带是…...

如何排查 Apache Doris 中 “Failed to commit txn“ 导入失败问题?
今天来聊聊 Doris 数据导入那些事儿。你是不是在数据导入的时候遇到各种状况,让人头疼不已?别担心,这篇文章给你答案! 在 Doris 的版本里,< 2.0.3 的时候,数据迁移存在一些已知的问题,比如可…...

回归预测 | MATLAB实现CNN-GRU卷积门控循环单元多输入单输出回归预测
回归预测 | MATLAB实现CNN-GRU卷积门控循环单元多输入单输出回归预测 目录 回归预测 | MATLAB实现CNN-GRU卷积门控循环单元多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现CNN-GRU卷积门控循环单元多输入单输出回归预测 数据准备&#x…...

HCIA-Access V2.5_7_3_XG(S)原理_关键技术
为什么需要测距 因为上行链路只有一根纤,而且每一个ONU到OLT的距离是不一样的,虽然上行通过TDMA技术,让每一个ONU在不同的时间段发送数据,但是仍然有可能在同一时刻到达分光器,产生数据冲突。 有测距的信元传输 所以为了避免碰撞冲突,通过ONU在注册的时候就会启动测距…...
leetcode hot 100 不同路径
62. 不同路径 已解答 中等 相关标签 相关企业 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )…...

智慧工地解决方案 1
建设背景与挑战 工地施工现场环境复杂,人员管理难度大,多工种交叉作业导致管理混乱,事故频发。传统管理方式难以实现科学、有效、集中式的管理,特别是在环境复杂、地点分散的情况下,监管困难,取证复杂。施…...
LeetCode -Hot100 - 53. 最大子数组和
前言 本专栏主要通过“LeetCode 热题100”,来捡起自己本科阶段的算法知识与技巧。语言主要使用c/java。如果同样正在练习LeetCode 热题100的朋友欢迎关注或订阅本专栏。有疑问欢迎留言交流~ 题目描述 题目链接 示例 1: 输入:nums [-2,1…...
php 多进程那点事,用 swoole 如何解决呢 ?
在 PHP 中,多进程的处理通常会遇到一些挑战,比如资源共享、进程间通信、性能优化等。Swoole 是一个高性能的协程和多进程框架,旨在为 PHP 提供异步、并发、协程等功能,解决了传统 PHP 环境中的多进程管理问题。通过使用 Swoole&am…...

探索AI在地质科研绘图中的应用:ChatGPT与Midjourney绘图流程与效果对比
文章目录 个人感受一、AI绘图流程1.1 Midjourney(1)环境配置(2)生成prompt(3)完善prompt(4)开始绘图(5)后处理 1.2 ChatGPT不合理的出图结果解决方案 二、主题…...

【竞技宝】CS2:HLTV 2024 TOP11-w0nderful
北京时间2025年1月4日,HLTV年度选手排名正在持续公布中,今日凌晨正式公布了今年的TOP11为NAVI战队的w0nderful。 选手简介 w0nderful是一名来自于乌克兰的CS选手,现年20岁,目前在比赛中司职狙击手。w0nderful于2020年开启了自己的…...
Lua迭代器如何使用?
在Lua中,迭代器是一种用于遍历集合元素的重要工具。掌握迭代器的使用方法,对于提高Lua编程的效率和代码的可读性具有重要意义。 1.迭代器概述 12.1.1 迭代器介绍 迭代器是一种设计模式,它提供了一种访问集合元素的方法,而不需要…...
qt中如何判断字符串是否为数字,整数,浮点数?
在 Qt 中,可以使用多种方法来判断字符串是否为数字、整数或浮点数。Qt 提供了一些方便的字符串和数值处理函数,可以帮助你实现这些判断。以下是几种常见的方法: 1. 使用 QRegularExpression Qt 提供了 QRegularExpression 类,可…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...

路由基础-路由表
本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中,往往存在多个不同的IP网段,数据在不同的IP网段之间交互是需要借助三层设备的,这些设备具备路由能力,能够实现数据的跨网段转发。 路由是数据通信网络中最基…...
Qt Quick Controls模块功能及架构
Qt Quick Controls是Qt Quick的一个附加模块,提供了一套用于构建完整用户界面的UI控件。在Qt 6.0中,这个模块经历了重大重构和改进。 一、主要功能和特点 1. 架构重构 完全重写了底层架构,与Qt Quick更紧密集成 移除了对Qt Widgets的依赖&…...