我曾经特别热衷于寻找当前LDOM Linux网络的不足之处。现在,来聊聊LDOMs是如何工作的。我们还是从最基本的开始说起吧。
Niagara系统上的每个运行节点会与机器的详细说明一起提供给用户。一个简单的系统管理程序命令会将其复制到缓冲器中。它是一个节点所能访问的所有资源的高度加密的图表。这与Linux环境下使用的powerpc系统的压缩的安装设备驱动程序框架非常相似。
所以,当你第一次安装LDOMS系统的时候,你应先导入“出厂默认”的机器设置,它会从最基本的开始引导你将所有的硬件资源提供给控制节点。然后再从控制节点开始安装虚拟化服务器服务,这些完成后再创建来宾。你要为控制节点更新机器说明,赋予它新的名称,然后重新启动。这时你可以创建来宾。这些机器说明的备份储存在机器的系统控制器中。
和机器说明工具在一起的是Logical Domain Channels(逻辑域通道)。每个通道为来宾之间、控制节点之间、服务节点之间提供虚拟化服务,而系统控制器通过点对点的连接进行通讯。每个连接都会在系统管理程序中进行配置,并且在每个通道的末端有一个发射队列和一个接收队列。在队列的每个输入项都有一个64比特固定长度的LDC数据包。你也可以给你的队列设定长度,但是你可能会受到一点限制。
LDC连接层定义了同步交换、可靠性和不可靠性以及初始的操作模式。同步交换用于商讨一个双方都能读懂的LDC协议版本。同步交换还会初始化序列号,从而连接上真正需要做的工作。初始的操作模式完全省略了同步交换,没有包头,只是通过连接发送初始的64比特的数据包。
系统管理程序还为LDC通道提供了存储器共享的工具。在定义输出页的位置上有一个页面表,而输出存储器则用“Cookies”将其快速传送给远程消费者。“Cookies”实际是定义哪个输出页面表的入口控制着翻译、进入页的偏移量、翻译文件的大小,以及正在说明的区域尺寸。事实上,这些cookies都是DMA描述符。
为了访问进入系统的存储器,你可以要求系统管理程序对cookie的进出情况进行拷贝,它定义了进出本地节点存储器的存储器。你也可以将这些事情规划到你的地址空间或输入的cookies进入IOMMU的程序中,但是那会引起循环出现很多复杂的情况。
有些事情比较麻烦,所以你不得不具有处理故障的能力。输出商在任何时间都要考虑每个存储器及存储器的每个输出片断。如果发生了这种情况,访问就会出错。对于规划输入存储器的CPU来说,访问这样的映射需要进行注解,很像Linux当前另用表格对内核用户空间的访问进行的注解。这样错误管理器就会指导如何去处理这些内核错误。
还有更复杂的事情,就是输入存储器的IOMMU使用。如果取消IOMMU会出现差错,那么它就会让PCI控制器向请求PCI的设备发送一个主令中止要求。在设备之间对主令中止的要求作出的回应会有所不同,但是通常来说,出现这种情况时设备可能需要完全复位。
因此,只做最安全的事情、LDC通道中原来的每项应用,它会利用系统管理程序的复制操作来访问输入存储器。在这种情况下,当访问一个无效的存储器时,你只需处理从LDC系统管理程序呼叫反馈回来的误差值,而不用处理所有的复杂错误。
LDC协议的开头部分是VIO层,它有自己的同步交换机制。它会处理版本和序列号的初始化,正如同LDC同步交换一样,但是它还能转换设备的特殊属性,如输出磁盘尺寸,网络设备MTU等等。
VIO同步交换还会处理描述符环的注册。这些环其实就告诉你VIO设备是如何安装I/O的。环的输入项是由一个普通的VIO标记组成的(VIO标记包含一个输入状态值和一个ACK字段。当ACK字段经过处理或延迟后,它会说明接收机是否正确应答环输入项,直到它在环上的运行完整)。在标记的后面是设备类型的特定区域,虚拟的磁盘设备会描述块输入输出,而虚拟的网络设备能说明数据包的大小等等。最后会有一队排列好的cookie进入并说明I/O缓冲器。
对于网络设备来说,它会在每个末端创建一个单一的TX描述符,它们是本地字符与发送数据包一起,在另一个末端接收。利用上面提到的系统管理程序的输出机制,他们被输入到peer中。
由前面提到的LDC复制机制存取输入口侧进入的描述符环。
在LDC通道上用DRING_DATA数据包来触发I/O,它会告诉接收机处理描述符环上的哪个输入项。只使用本地CPU装载和存储记下本地peers描述符入口,排序是很重要的。
DRING_DATA数据包提供了一个从peer到程序开始和结束描述符指针。结束指针指定为“-1”,就是说要继续处理数据,直到你看到了一个不在READY(准备)状态的描述符。
因此,发送peer来更新状态字段作为最后一个可能的操作是很重要的,这要采用存储器壁垒,因此,接收机不会在READY状态意外地看到一个半初始化的描述符。