有些事情比較麻煩,所以你不得不具有處理故障的能力。輸出商在任何時間都要考慮每個存儲器及存儲器的每個輸出片斷。如果發(fā)生了這種情況,訪問就會出錯。對于規(guī)劃輸入存儲器的CPU來說,訪問這樣的映射需要進行注解,很像Linux當前另用表格對內(nèi)核用戶空間的訪問進行的注解。這樣錯誤管理器就會指導如何去處理這些內(nèi)核錯誤。
還有更復雜的事情,就是輸入存儲器的IOMMU使用。如果取消IOMMU會出現(xiàn)差錯,那么它就會讓PCI控制器向請求PCI的設備發(fā)送一個主令中止要求。在設備之間對主令中止的要求作出的回應會有所不同,但是通常來說,出現(xiàn)這種情況時設備可能需要完全復位。
因此,只做最安全的事情、LDC通道中原來的每項應用,它會利用系統(tǒng)管理程序的復制操作來訪問輸入存儲器。在這種情況下,當訪問一個無效的存儲器時,你只需處理從LDC系統(tǒng)管理程序呼叫反饋回來的誤差值,而不用處理所有的復雜錯誤。
LDC協(xié)議的開頭部分是VIO層,它有自己的同步交換機制。它會處理版本和序列號的初始化,正如同LDC同步交換一樣,但是它還能轉換設備的特殊屬性,如輸出磁盤尺寸,網(wǎng)絡設備MTU等等。
VIO同步交換還會處理描述符環(huán)的注冊。這些環(huán)其實就告訴你VIO設備是如何安裝I/O的。環(huán)的輸入項是由一個普通的VIO標記組成的(VIO標記包含一個輸入狀態(tài)值和一個ACK字段。當ACK字段經(jīng)過處理或延遲后,它會說明接收機是否正確應答環(huán)輸入項,直到它在環(huán)上的運行完整)。在標記的后面是設備類型的特定區(qū)域,虛擬的磁盤設備會描述塊輸入輸出,而虛擬的網(wǎng)絡設備能說明數(shù)據(jù)包的大小等等。最后會有一隊排列好的cookie進入并說明I/O緩沖器。
對于網(wǎng)絡設備來說,它會在每個末端創(chuàng)建一個單一的TX描述符,它們是本地字符與發(fā)送數(shù)據(jù)包一起,在另一個末端接收。利用上面提到的系統(tǒng)管理程序的輸出機制,他們被輸入到peer中。
由前面提到的LDC復制機制存取輸入口側進入的描述符環(huán)。
在LDC通道上用DRING_DATA數(shù)據(jù)包來觸發(fā)I/O,它會告訴接收機處理描述符環(huán)上的哪個輸入項。只使用本地CPU裝載和存儲記下本地peers描述符入口,排序是很重要的。
DRING_DATA數(shù)據(jù)包提供了一個從peer到程序開始和結束描述符指針。結束指針指定為“-1”,就是說要繼續(xù)處理數(shù)據(jù),直到你看到了一個不在READY(準備)狀態(tài)的描述符。
因此,發(fā)送peer來更新狀態(tài)字段作為最后一個可能的操作是很重要的,這要采用存儲器壁壘,因此,接收機不會在READY狀態(tài)意外地看到一個半初始化的描述符。