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