2009-06-10 5 views
2

Ich muss einige Daten aus einem Bereich einer Datei in einen anderen verschieben. Momentan lese ich die Bytes und schreibe sie zurück. Aber ich frage mich, ob eine DMA-Übertragung schneller wäre, wenn es möglich ist. Ich bin in C#, aber unsichere und p/invoke-Funktionen sind akzeptabel.In-Datei-Daten kopieren mit DMA

+0

MEMPPY automatisch eine DMA-Übertragung, wenn es möglich ist? Wenn das so ist, kann ich vielleicht Speicherkarten verwenden und memcpy (oder memmove) aufrufen. – Fantius

+0

Oder mache ich wahrscheinlich schon DMA-Übertragungen und ich weiß es einfach nicht? Selbst wenn dies der Fall ist, muss ich zwei Übertragungen statt einer durchführen - um die Daten zu lesen und sie dann zu schreiben. Gibt es eine Möglichkeit, einen Transfer zu machen? – Fantius

Antwort

3

Sie sind, soweit ich das beurteilen kann, nicht tun DMA 'durch Zufall' mit den üblichen Datei Streams von einer Datei in eine andere zu kopieren. DMA wird an einigen Stellen im Hintergrund verwendet (z. B. zur Übertragung von der Festplatte auf den Arbeitsspeicher mithilfe von FileStreams), kann jedoch keine direkte Datei-zu-Datei-Stream-Kopie in C# verarbeiten.

DMA selbst ist ziemlich komplex und nativ für Low-Level-Sprachen. Ich beziehe mich auf this document. Alle Codebeispiele sind in C und asm, also nicht direkt auf C# anwendbar.

Der DMA ein weiterer Chip auf dem Motherboard ist (in der Regel ist ein Intel 8237 Chip), die Sie (der Programmierer) ermöglichen Datenübertragungen abzuladen zwischen I/O-Karten. DMA steht eigentlich für "Direct Memory Access". Ein Beispiel für die DMA-Nutzung wäre die Fähigkeit des Sound Blasters, Samples im Hintergrund abzuspielen. Die CPU richtet die Soundkarte und den DMA ein. Wenn der DMA angewiesen wird zu "gehen", schaufelt er einfach die Daten aus dem RAM zu der Karte. Da dies außerhalb der CPU erfolgt, kann die CPU während der Übertragung der Daten andere Dinge tun .

DMA verwendet ein Kanalsystem, auf das über Ports zugegriffen wird. Normalerweise verwenden Sie asm, um dies zu tun. Vielleicht finden Sie einige hilfreiche Informationen here oder here.

Eine Alternative könnte sein, dass das Betriebssystem die Übertragung übernimmt: Verwenden Sie einfach File.Copy.