换个角度说IOMMU,这个角度有点冷。
说起来,AMD系列处理器的功能不低于INTEL处理器,内含集成电路的规模比INTEL同档的CPU处理器多得多。没有什么简化。所以一直是军工产品。
唯一的缺点就是耗能很多。相对INTEL处理器来说,新一代的INTEL节能会替代它。所以两家处理器公司互有比拼。
IOMMU 是内存管理单元,说起来就是内存管理器的入口地址片段。也就是一些寄存器。保留CPU处理直接访问地址以外的地址,可以访问计算机所有,包含外设,还是直接性的访问。
就是访问外部存储单元的时候会有些分析,说白了,内存再多,也要一点点的被直接缓存和缓冲。也就是说片段转换。
IOMMU的地址段表现,就是一片地址段。
可以用MOV等指令直接访问,可以改写IOMMU内存片的内容改变系统结构。
表示方法就是 IOMMU(base地址)+offset 位移地址,另外这个地址在amd公司的处理中,这段地址是固定的。
和MSR等指令的寻址作用一样。表示方式不同,也可以通过设置可用设置寄存器来设置。
现简单说明一下地址表示方法:
IOMMU MMIO 寄存器 IOMMU 控制内存图表用于IOMMU低基址寄存器,和IOMMU高基址寄存器,访问不大于64位。访问对齐。 控制寄存器的结构 注:如果 EventLogRun 字位是 1 并且EventLen和EventBase发生改变后IOMMU不能使用。 MMIO 寄存器指定系统物理地址和事件记录长度。 63 60 59 56 55 52 51 32 31 12 11 0 +---------+----------+------+-----------+----------------+-------------+ | 保留 | EventLen | 保留 | EvenBase | EventBase | 保留 | +---------+----------+------+-----------+----------------+-------------+ 字节 描述 ++++++++++++++++++++++++++++++++++++++++++++++++++ [63:60] 保留 [59:56] EventLen:事件记录长度,读写,恢复1000B.事件记录指定长度是2进制,最小尺寸4K,变量1000b两边保留。 0000b - 0111b = 保留 1000b = 256 进入点 (4K字节) 1001b = 512 进入点 (8K字节) 1111b = 32768 进入点 (512K字节) [55:52] 保留 [51:12] EventBase: 事件记录基地址,读写,恢复 00_0000_0000h,指定字节[51:12],基地址必须对齐4K字节。 [11:0] 保留 IOMMU寄存器控制标志: 63 44 43 42 41 40 39 38 37 36 34 33 32 31 30 29 28 27 25 24 32 22 21 18 17 16 15 14 13 12 11 10 9 8 7 5 4 3 2 1 0 +-----------+--+--+--+--+--+-----+-------+-----+--+--+--+----------+--+--+--+-----------+--+--+--+--+--+--+--+--+--+--+-------+--+--+--+--+--+ | 保留 | D| P| B| M| P| P | D | D | D | G| G| GAMEn | S| S| S| CRW | G| G| P| P| P| C| I| C| R| P| I | C| E| E| H| I| | | o| p| l| a| p| r | e | u | u | A| A| | m| i| m| | A| T| P| p| P| m| s| o| e| a| n | o| v| v| i| o| | | m| r| k| r| r| i | v | a | a | I| L| | i| f| i| | E| E| R| r| R| d| o| h| s| s| v | m| e| e| T| m| | | a| A| S| c| i| v | T | E | l | n| o| | F| W| F| | n| n| E| I| L| B| c| e| P| s| T | W| n| n| u| m| | | i| u| t| E| v| A | b | v | P | t| g| | L| B| E| | | | n| n| o| u| | r| a| P| i | a| t| t| n| u| | | n| t| o| n| A| b | l | e | p | E| E| | o| d| n| | | | | t| g| f| | e| s| W| m | i| I| L| E| E| | | I| o| p| | b| r | S | n | r | n| n| | g| i| | | | | | E| E| E| | n| s| | e | t| n| o| n| n| | | D| R| M| | r| t | e | t | L | | | | E| s| | | | | | n| n| n| | t| P| | O | I| t| g| | | | | P| s| r| | t| E | g | L | o | | | | n| | | | | | | | | | | | W| | u | n| E| E| | | | | N| p| k| | E| n | E | o | g | | | | | | | | | | | | | | | | | | t | t| n| n| | | | | E| A| E| | n| | n | g | E | | | | | | | | | | | | | | | | | | | | | | | | | | | o| n| | | | | E | n | | | | | | | | | | | | | | | | | | | | | | | | | | | n| | | | | | n | | | | | | | | | | | | | | | | | | | | | | | | | +-----------+--+--+--+--+--+-----+-------+-----+-----+--+--+-------+--+--+--+-----------+--+--+--+--+--+--+--+--+--+--+-------+--+--+--+--+--+ [63:44] 保留 [43] DomainIDPNE: 保留 [42] PprAutoRspAon: 外设页请求自动报告,常开特性开关。读写,复位0b。 0 = PPR 自动报告,常开特性关闭。 1 = 开启 PPR 自动报告常开特性设置这位段和[PprAutoRspEn] 当[MMIO 位移 0030h]的[PprAutoRespSup] = 0,这字段保留。 [41] BlkStopMrkEn: 块停止标记消息特性开茁壮成长,读写,复位1b。 特性支持默认开启。 当[MMIO 位移 0030h]的[BlkStopMrkSup] = 0,这位段保留。 [40] MarcEn: 内存地址线路和控制特性开关。读写,复位0b. 0 = MARC 关闭 1 = MARC 开启 当[MMIO 位移 0030h]的[MarcSup] = 00b 时这位段保留。 [39] PprAAutoRspEn: 外设页请求自动报告特性开关。读写,复位0b。 0 = PPR 自动报告关闭。 1 = PPR 自动报告,如果支持,开启。 当[MMIO 位移 0030h]的[PprAutoRespSup] = 0,这位段保留。 [38:37] PrivAbrtEn: 取消特权开关,读写,复位:00b 00b = IOMMU 将中止任何访问请求到超级来宾页。当PMR位在PCIe TLP前缀标志没权(用户模式)请求。 01b = IOMMU 将中止任何访问请求到超级来宾页,忽视PMR位设置。 10b-11b = 保留 当[MMIO 位移 0030h]的[USSup] = 0,这位段被保留。 [36:34] DevTblSegEn: 设备表段开关,读写,复位000b. 000b = 设备表没段。 001b = 设备表除2段 010b = 设备表除4段 011b = 设备表除8段 100b-111b = 保留 注: [MMIO 位移 0030h]的[DevTblSegSup] = 00b,这位段保留,这位段必段不大于DevTblSegSup的设置值。 [33:32] DualEventLogEn: 双事件记录开关,读写,复位00b. 00b = 用默认事件记录缓冲。 01b = 用后备缓冲 10b = 自动切换缓冲到当前活动缓冲。 11b = 保留 注:如果字位溢出缓冲切换设置事件记录,当[MMIO 位移 0030h]的[DuaalEventLogSup] = 00b,这位段保留。 [31:30] DualPprLogEn: 双外设页请求记录开关,读写,复位0b 00b = 用默认外设页请求记录。 01b = 用后备外设页请求记灵。 10b = 自动切换当然活动记录 11b = 保留 注: 如果有溢出,记录切换会错。 如果自动开启,[MMIO 位移 0018h]设置1,[PprLogEn]必须设置10b 当[MMIO 位移 0030h]的[DualPPRLogSup]=00h,这位段保留。 [29] GAIntEn: 来宾虚拟APIC中断开关,读写,复位0b 0 = 当[MMIO 位移 2020h]的[GALogInt]从0变1时,没中断信号。 1 = 当[MMIO 位移 2020h]的[GALogInt]从0变1时,有中断信号。 当[MMIO 位移 0030h]的[GASup]=0时,写这位段中止。 [28] GALogEn: 来宾虚拟 APIC GA 记录开关.读写.复位0b。 1 = 开启 GA 记录。 0 = 关闭来宾APIC虚拟中断请求记录。 当[MMIO 位移 0030h]的[GASup]=0时,写这位段中止。 [27:25] GAMEn: 来宾虚拟APIC模式开关。读写中,复位0b,这段指定高级中断状态,尺寸为IRTE。 000b = 中断向量表定义使用IRTE 001b = 虚拟中断向量表定义来宾虚拟APIC,被APM2指定,使用IRTE。 010b-101b = 保留变量,处理为 GAMEn = 000b 当[MMIO 位移 0030h]的[GASup]=0时,写这位段中止。 [24] SmiFLogEn: SMI 过滤记灵开关,读写,复位0b,定义IOMMU中的SMI过滤记录到SMI中断块。 0 = SMI 中断块不被SMI过滤记录。 1 = SMI 中断块被SMI过滤记录在IOMMU事件记录中。 注:SMI过滤被SmiFLogEn控制事件记录建立。 SA,SE,IG和SupIOPF字位操作通过地图过滤中断独立处理。 当[MMIO 位移 0030h]的[SmiFSup]=0b,SmiFEn 被硬件中止,只读值为0b。 [23] SlfWBdis: 自写环关闭。 [22] SmiFEn: SMI 过滤开关,定义很多IOMMU的中断和句柄。 0 = SMI 中断不修改的通过。 1 = SMI 中断和控制块被SMI寄存器过滤 SmiFLogEn使用SMI块中断报告IOMMU事件记录。 当[MMIO 位移 0030h]的[SmiFSup]=0b,SmiFEn 被硬件中止,只读值为0b。 [21:18] CRW: 读,输出,复位0h,保留,未来特性。 软件注意:软件可以安全写入0h到这位,但读中止。 [17] GAEn: 来宾虚拟 APIC 开关,读写,复位 0b. 0 = 来宾虚拟APIC特性在虚拟设备中断不可用。 1 = 设备中断升级使用来宾虚拟APIC根节表进DTE,传递处理。当[MMIO 位移 0030]的[GASup]=0时,写字位中止。 [16] GTEn: 来宾转换开关,读写,复位0b。 0 = 来宾转换关闭 1 = 来宾转换可以被外设编程DTE。当来宾转换启用,错误的词义改变,当[MMIO 位移 0030h]的[GTSup]=0时,写到这字位中止。 [15] PPREn: 外设页请求处理开关,读写,复位 0b。 1 = 外设页请求在处理。 0 = PPR 请求在处理一个错误的请求。当[MMIO 位移 0030h]的[PPRSup]=0时。 [14] PprIntEn: 外设页请求中断开关,读写,复位0b。 1 = 当中断信号[MMIO 位移 2020h]的[PPRLogInt]=1b时,用[Capability 位移 10h]的[MsiNumPPR]。 0 = 当中断没有信号,[MMIO 位移 0030h]的[PPRSup]=0时,[MMIO 位移 2020h]的[PPRLogInt]=1 时,写字位中止。 [13] PPRLogEn: 周边页请求记录开关,读写,复位0b。 1 = PPR 记录基地址寄存器[MMIO 位移 0038h]设置和外围页请求事件是写外围页请求记录。IommuEn也被设置。写1b到[MMIO 位移 2020h]的[PPRLogRun]=1b无效。 0 = 外设页请求记录未启用,外设页请求不可用,当外设页请求记录未启用或[MMIO 位移 0030h]的[PPRSup]=0. 当IommuEn=1b 和 PPREn=1b时,如果软件写[PPRLogEn]为1b,那么IOMMU清除 PPRLogOverflow字和设置PPRLogRun位进IOMMU结构寄存器[MMIO 位移 2020h].如果入点可用,IOMMU现在能写新的入点到事件记录。 注: 当[MMIO 位移 0030h]的[PPRSup]=0时,写中止。 软件注意: 软件能读[MMIO 位移 2020h]的[PPRLogRun]检查外设结构页请求记录写在IOMMU中。 注: 外设页请求记录和事件记录是独立的。 软件注意: PPRLog 基地址寄存器[MMIO 位移 2030h]在IOMMU PPRLog 尾部寄存器[MMIO 位移 2038h]必须在事件记录前设置启用。 [12] CmdBufEn: 命令缓冲开关,读写,复位0b。 1 = 开始或复位命令缓冲处理。当CmdBufEn=1b 和 IommuEn=1b时,IOMMU开始得到命令和[IOMMU 位移 2020h]的[CmdBufRun]设置到1b,置1b时CmdBufRun没效。 0 = 半命令缓冲处理,写0b到IOMMU得到新命令预收完成,IOMMU停止收到命令在读时和事件指定之后。 注:有[MMIO 位移 2020h结构表],关于检测命令缓冲处理。 写事件记录控制在EventLogEn上。 [11] Isoc: 同步,读写,复位0b.这字位控制结构同步HyperTransport读请求包中,当IOMMU发出 I/O 页表读和HyperTransport链时。 1 = 请求包同步频道 0 = 请求包用于标准频道 注:固件平台将设置这字位为1b为同步处理频道 [10] Coherent:耦合,读写,复位 1b,这字位控制结构的HyperTransport读请求包的耦合,当IOMMU发出 I/O 页表读和HyperTransport链驱动表读时。 1 = 处理器的驱动表请求是窥探型 0 = 处理器的驱动表请求不是窥探型 [9] ResPassPW: 报告写发送通过,读写,复位0b。这控制结构ResPassPW在HyperTransport读请求包IOMMU发出驱动表读HyperTransport连接中。 1 = 报告请求包通过发送 0 = 报告请求包不通过发送 [8] PassPW: 发送写通过,读写,复位0b,这字节,当IOMMU发出 I/O页表读和驱动表读为HyperTransport技术链接时控制 HyperTransport技术的PassPW 读请求包 1 = 请求包通过发送 0 = 请求包没通过发送 [7:5] InvTimeOut: 超时错误,读写,复位000b,字位段指定超时为IOTLB错误请求。 000b 没超时 001b 1ms 010b 10ms 011b 100ms 100b 1sec 101b 10sec 110b 100sec 111b 保留 [4] ComWaitIntEn:完成等待中断开关,读写,复位0b. 1 = 一个中断事件在[MMIO 位移 2020h]的[ComWaitInt]=1,使用[Capability 位移 10]的[MsiNum] [3] EventIntEn: 事件中断开关,读写,复位0b 1 = 一个中断事件在[MMIO 位移 2020h]的[EventLogInt]=1或 [MMIO 位移 2020h]的[EventOverflow]=1时使用[Capability 位移 10]的[MsiNum] [2] EventLogEn: 事件记录开关,读写,复位0b 1 = 事件记录基地址寄存器[MMIO 位移 0010h]被设置,当EventLogEn被设置,所有的写事件检测。 0 = 事件记录关闭,事件记录不能使用。 [1] HtTunEn: HyperTransport 技术支持开关,读写,复位0b 1 = IOMMU接收HyperTranSport技术转换。 0 = IOMMU不接收HyperTransport技术转换。 [0] IommuEn IOMMU 开关,读写,复位 0b 1 = IOMMU 启用,所有的转换为IOMMU处理。基地址表寄存器位移 0000h 处必须在软件使用前设置。 0 = IOMMU 关闭,不转换为映射IOMMU转换处理,关闭后,IOMMU 读出没有命令和建立,没有事件记录进入点。
这是寄存器的表示方法,因为网站一直在推广,很多资料的确没有实际的收入。但是的确有些价值和在不同时间段内必须公示。对科技的一种促进吧。
了不了解是个人意向问题。因为这些资料只是相对公开。个人有所得,但是一点点的做出来还是要有时间。
这个资料的文件别名是《AMD I/O Virtualization Technology (IOMMU)Specification》AMD 输入/输出 虚拟技术 白皮书
简单的说明一下用法。IOMMU基地址要计算出来,根据各个主板的结构。计算出总线的全地址。然后加一个偏移量。
偏移量的字节或单词,就是内存到总线,到外设的设置。有些寄存器可以反复输入输出,有些寄存器可以只读或访问。
还有的寄存器是计算机开机设定,用户,超管等是改写不了的。有些寄存器改写后重启硬件才有效,所以比较难完全掌握。
所以只熟悉一部分,再了解其它部分,一通百通。说穿就是内存分配格式,和控制内容和作用。有助记符也好也坏。
叫法和INTEL处理器不一样,说法和角度不同。但是寄存器大体相同。要相互了解,不过AMD的简明一点,INTEL的详细一点。
网上有很多IOMMU文章没有说什么具体的内容,我也只报告这么多,英文翻译要时间,不是一两天,只能做做停停,慢慢深入了解。
有些字面的隐晦会尽量深入浅出。先留底,以后再拼接。网络资料,在我的眼中看似浮云,很多有用的资料并不长久,资料用时方恨少。
关站什么的都很常见,也有支不付出的站长,资料很多,但是并没在网络中保留,大雁留痕,并没什么保留,只有片段。
意思理解很快,做一篇篇文章有点花时间,不交不留,各自发展。
by Editor Y.Pierre 欢迎回信nantz@163.com