Hallo allemaal,
Net als vele anderen, ben ikzelf ook het slachtoffer geworden van de beruchte 'infinite loop' hangers. Ik heb uiteindelijk met veel prutsen m'n systeem stabiel gekregen, maar het zat me toch niet lekker. Ik ben dus verder gaan zoeken in de technical data sheets van Intel. Intel heeft de specificaties van AGP opgesteld en gedefinieerd.
Daar heb ik het volgende gevonden, wat naar alle waarschijnlijkheid de echte oorzaak van de ellende is:
Intel schrijft:
"
Potential Deaclock with misaligned read access to an AGP Master (oftewel de video plank)
When data generated by the AGP master is being written into main memory, a potential deadlock can occur when the AGP master requires the data to be flushed before completing a read initiated by the corelogic (oftewel de north bridge van de chipset). The read must be a misaligned memory access that straddles an odd DWORD boundary.
"
Maw. geheugen opvragen door de processor, beginnende op een oneven DWORD adres, zoals adres 4, 12, 20, 28, etc. De AGP norm schrijft voor dat geheugen altijd per 8 bytes wordt gelezen en geschreven. en dat dit altijd op een even dubbel DWORD boundary moet liggen.
"
The deadlock occurs when the CPU initiates a read reference that the corelogic must split into two accesses on the AGP interface. After the initial read completes, but before the second access is attempted, the AGP master posts write data into the interface. When the corelogic attempts the second part of the read, the AGP master terminates with Retry forcing the access to stall in the corelogic. Since the first half of the read access has completed, the corelogic is not allowed to discard the data since a side effect may occur. The corelogic also may not allow the write to occur until the read can complete. This is caused my the condition where the write may be required to be coherent with main memory and the CPUs cache. Since the processor bus is stalled pending the read request, the sequence ends in a livelock or deadlock condition. In either case, no agent can make forward progress and neither can be backed up to allow the other to progress.
"
Met andere woorden: de software genereert een lees instructie voor data in the AGP kaart die door de AGP interface in twee stukken moet worden gehakt. Als de eerste van de twee reads is voltooit, komt er een write vanuit de AGP kaart, die pas kan worden voltooid als de tweede read wordt beindigd. Echter, die tweede read wordt permanent geweigerd door de AGP kaart, omdat die write instructie nog hangende is in the north bridge. Omdat de tweede read instructie nooit wordt voltooid, kan de CPU zelf niet verder. Gevolg: een hangend systeem dat nergens meer op reageert.
Klinkt bekend in de oren, nietwaar?
Je kunt hier twee conclusies aan verbinden:
1) Rommelen met diverse AGP / PCI / geheugen timing settings verlegt alleen maar het probleem. Wat je verandert is de samenstelling van gelijktijdig optredende lees en schrijfacties. Daarom zal voor iedere PC een andere combinatie een 'stabiel' systeem opleveren, en zijn er zoveel verschillende 'fixes' in omloop.
2) De echte oorzaak zit in de programmacode. Die moet dus NOOIT lees acties starten op oneven DWORD boundaries. Voor alle duidelijkheid. We praten hier niet over games, maar over DirectX, de GART driver en de video driver.
Alleen als de echte oorzaak uit deze programmacode wordt gehaald, zullen de infinite loop problemen pas echt tot het verleden gaan behoren.
Net als vele anderen, ben ikzelf ook het slachtoffer geworden van de beruchte 'infinite loop' hangers. Ik heb uiteindelijk met veel prutsen m'n systeem stabiel gekregen, maar het zat me toch niet lekker. Ik ben dus verder gaan zoeken in de technical data sheets van Intel. Intel heeft de specificaties van AGP opgesteld en gedefinieerd.
Daar heb ik het volgende gevonden, wat naar alle waarschijnlijkheid de echte oorzaak van de ellende is:
Intel schrijft:
"
Potential Deaclock with misaligned read access to an AGP Master (oftewel de video plank)
When data generated by the AGP master is being written into main memory, a potential deadlock can occur when the AGP master requires the data to be flushed before completing a read initiated by the corelogic (oftewel de north bridge van de chipset). The read must be a misaligned memory access that straddles an odd DWORD boundary.
"
Maw. geheugen opvragen door de processor, beginnende op een oneven DWORD adres, zoals adres 4, 12, 20, 28, etc. De AGP norm schrijft voor dat geheugen altijd per 8 bytes wordt gelezen en geschreven. en dat dit altijd op een even dubbel DWORD boundary moet liggen.
"
The deadlock occurs when the CPU initiates a read reference that the corelogic must split into two accesses on the AGP interface. After the initial read completes, but before the second access is attempted, the AGP master posts write data into the interface. When the corelogic attempts the second part of the read, the AGP master terminates with Retry forcing the access to stall in the corelogic. Since the first half of the read access has completed, the corelogic is not allowed to discard the data since a side effect may occur. The corelogic also may not allow the write to occur until the read can complete. This is caused my the condition where the write may be required to be coherent with main memory and the CPUs cache. Since the processor bus is stalled pending the read request, the sequence ends in a livelock or deadlock condition. In either case, no agent can make forward progress and neither can be backed up to allow the other to progress.
"
Met andere woorden: de software genereert een lees instructie voor data in the AGP kaart die door de AGP interface in twee stukken moet worden gehakt. Als de eerste van de twee reads is voltooit, komt er een write vanuit de AGP kaart, die pas kan worden voltooid als de tweede read wordt beindigd. Echter, die tweede read wordt permanent geweigerd door de AGP kaart, omdat die write instructie nog hangende is in the north bridge. Omdat de tweede read instructie nooit wordt voltooid, kan de CPU zelf niet verder. Gevolg: een hangend systeem dat nergens meer op reageert.
Klinkt bekend in de oren, nietwaar?
Je kunt hier twee conclusies aan verbinden:
1) Rommelen met diverse AGP / PCI / geheugen timing settings verlegt alleen maar het probleem. Wat je verandert is de samenstelling van gelijktijdig optredende lees en schrijfacties. Daarom zal voor iedere PC een andere combinatie een 'stabiel' systeem opleveren, en zijn er zoveel verschillende 'fixes' in omloop.
2) De echte oorzaak zit in de programmacode. Die moet dus NOOIT lees acties starten op oneven DWORD boundaries. Voor alle duidelijkheid. We praten hier niet over games, maar over DirectX, de GART driver en de video driver.
Alleen als de echte oorzaak uit deze programmacode wordt gehaald, zullen de infinite loop problemen pas echt tot het verleden gaan behoren.