Hallo ihr, ich hab eine Frage zu Scatter Gather DMA in Verbindung mit PCIe und Windows 8 64Bit. Ich reserviere mir zwei Bereiche im Speicher. Einmal 4MByte und einmal 1MByte. Nach aktueller Überlegung ist alles an einem Stück, d.h. ich bräuchte kein Scatter/Gather. Als Betriebssystem will ich Windows 8.1 mit 64Bit verwenden. Ich würde am liebsten ohne Scatter/Gather arbeiten, da ich zum einen den Implementierungsaufwand in den FPGA scheue und zum anderen die IP-Core Kosten... Meine Überlegung ist die, 4MByte RAM sind von den möglichen 8GByte Arbeitsspeicher ja sehr überschaubar und sollten ja immer am Stück verfügbar sein. Aber bestimmt sagen kann ich das leider nicht. Vielleicht habt ihr ein besseres Gefühl dafür. Was meint ihr? Lohnt sich der Aufwand für Scatter/Gather oder ist es gar eine "Pflicht"? Vielen Dank, Seb
Sebastian schrieb: > > Vielleicht habt ihr ein besseres Gefühl dafür. Was meint ihr? Lohnt sich > der Aufwand für Scatter/Gather oder ist es gar eine "Pflicht"? > Pflicht ist es nicht, und IMO lohnt tut es sich nur bei sehr hohen Datenraten. (Gen 2/3 x8) SGDMA ist nicht ohne, da man auch mit unaligned Buffern umgehen muss, es bei PCIe die EInschränkung gibt dass ein einzelner DMA Transfer nicht eine 4k Grenze passieren darf, und nich mehr Keinigkeiten. Und um auf Speed zu kommen, muss man grosse Transfer machen., sonst geht die Bandbreite im Overhead unter. Auch auf der Treiberseite ist SGDMA auch viel aufwendiger als Common Buffer DMA. Ein aligned Buffer von 4 MB sind normalerweise kein Problem wenn du den schon beim Initialsieren der Karte allozierst, also nicht etwa erst bei Bedarf. Dein grösstes Problem ist aber Windows 8.1 64bit. Das akzeptiert keine unsignierte Treiber, und self signed nur im eingeschränkten Debug/Testmode. 32bit Windows lädt auch unsignierte.
Sebastian schrieb: > Was meint ihr? Lohnt sich > der Aufwand für Scatter/Gather oder ist es gar eine "Pflicht"? Gehen wird das wahrscheinlich auch ohne. Schau' dir mal diese Seite: http://msdn.microsoft.com/en-us/library/windows/hardware/ff554460%28v=vs.85%29.aspx . Den Aufruf wirst Du wohl in einem Treiber ohne Scatter/Gather brauchen). Insbesondere der Abschnitt "Remarks" dürfte für dich interessant sein. Wenn der Treiber beim Systemstart geladen wird und seinen Speicher nicht irgendwannmal wieder hergibt, dürften die 4 MByte in den meisten Fällen verfügbar sein. Nur: sicher sagen kann das wohl keiner, möglicherweise haben ja auch andere Hardware-/Treiberhersteller (deren Treiber - warum auch immer - vor deinem geladen werden) keine Lust, das richtig zu machen... Letztendlich läuft es auf genau drei Fragen raus: Was kosten bei Euch zwanzig Hotlinecalls? Was ist Euch eure Reputation als verlässlicher Lieferant wert? Was schätzt Du an zusätzlichem Aufwand?
Lattice User schrieb: > Dein grösstes Problem ist aber Windows 8.1 64bit. Das akzeptiert keine > unsignierte Treiber, und self signed nur im eingeschränkten > Debug/Testmode. > 32bit Windows lädt auch unsignierte. Naja, solange das kein WHQL Treiber werden soll, reicht ja selber signieren, das Code Signing Zertifikat von z.B. GlobalSign kostet ja nicht die Welt. Gibt auch noch günstigere, soweit ich weiß. Selbst Boot Start Drivers lassen sich mit dem Cross Signing Certificate im KMCS Modus damit signieren, ist zwar etwas aufwendiger, aber geht. Wer PCIe macht, macht ja sicher ein professionelles Produkt, da muss das Geld für eine Signatur auch da sein.
Christian R. schrieb: > > Naja, solange das kein WHQL Treiber werden soll, reicht ja selber > signieren, das Code Signing Zertifikat von z.B. GlobalSign kostet ja > nicht die Welt. Gibt auch noch günstigere, soweit ich weiß. Selbst Boot > Start Drivers lassen sich mit dem Cross Signing Certificate im KMCS > Modus damit signieren, ist zwar etwas aufwendiger, aber geht. Das ist richtig, aber GlobalSign und Co haben sich gegenüber Microsoft verpflichtet den Antragsteller zu verifizieren. Als Privatmensch wohl nicht machbar, zumindesten mit viel Aufwand verbunden. ca 200€/Jahr ist da kleinste Hinderniss. > Wer PCIe > macht, macht ja sicher ein professionelles Produkt, da muss das Geld für > eine Signatur auch da sein. Da wäre ich mir nicht so sicher.
Privat ist kein Problem bei GlobalSign, ist einfach mit Ausweiskopie. Unser Fraunhofer Institut da zu verifizieren war eine echte Herausforderung, denn die Institute sind rechtlich nicht eigenständig. Da ging das Zertifikat nur für die Fraunhofer Gesellschaft und ein Vorstand musste unterschreiben.
Danke für eure Antworten. Mit der Lizensierung sehe ich bislang keine Problem. Mir ging es rein um das Scatter/Gather verfahren. Da unsere Boards nur in bekannter Hardware eingebaut werden, versuche ich es jetzt erstmal ohne das Scatter/Gather. @Markus F.: Danke auch für den guten Link. Gruß, Seb
Meinte natürlich Signierung nicht Lizensierung. Sorry.
Keleiner Hinweis: Zu Allozieren des Buffers solltest du keinesfalls "MmAllocateContiguousMemory" direkt aufrufen, sondern folgende Routine verwenden: http://msdn.microsoft.com/en-us/library/windows/hardware/ff540575%28v=vs.85%29.aspx
Es läuft recht gut. Ich verwende nun Windows 8.1 64Bit und ich kann über PCIe mit der Karte (Lattice FPGA) sprechen. Was mir aber noch nicht ganz einleuchtet ist,... - ich verwende aktuelle zwei 32Bit BARs (non-prefetchable) - im Treiber habe ich ".Dma64BitAddresses = TRUE;" gesetzt ...und die Kombination funktioniert. Jupi :-) Übersetze ich den FPGA IP-Core mit 64Bit Bars bekomme ich keine Kommunikation hin. Nun meine Fragen: - Sollte ich bei einem 64Bit Betriebssystem auch 64Bit BARs verwenden oder sind das zwei Paar Stiefel? - Ich hab mal gelesen, dass bei 64Bit BARs nur prefetchable memory Sinn macht. Ist dem so? Gruß, Seb
Sebastian schrieb: > Es läuft recht gut. Ich verwende nun Windows 8.1 64Bit und ich kann über > PCIe mit der Karte (Lattice FPGA) sprechen. > Was mir aber noch nicht ganz einleuchtet ist,... > - ich verwende aktuelle zwei 32Bit BARs (non-prefetchable) > - im Treiber habe ich ".Dma64BitAddresses = TRUE;" gesetzt > ...und die Kombination funktioniert. Jupi :-) > > Übersetze ich den FPGA IP-Core mit 64Bit Bars bekomme ich keine > Kommunikation hin. Eine 64 Bit BAR belegt jeweils BAR Register: z.B. für eine 64 kB grosse BAR sieht es so aus: Bar0 : FFFF0004 Bar1 : FFFFFFFF Eine 2. Bar wäre dann Bar2 + Bar3. > > Nun meine Fragen: > - Sollte ich bei einem 64Bit Betriebssystem auch 64Bit BARs verwenden > oder sind das zwei Paar Stiefel? > - Ich hab mal gelesen, dass bei 64Bit BARs nur prefetchable memory Sinn > macht. Ist dem so? Jein Da spielt PCI legacy rein, eigentlich ist bei PCIe diese Einscnränkung nicht mehr nötig, da eine PCIe Bridge nicht mehr raten muss wieviele DWORDs ein Lesezugriff anfordert. (Hat damit zu tun wie bei PCI Bursts funktionieren)
Hallo LatticeUser, danke für deine Antwort. Wenn ich dich richtig verstehe, dann ist es für ein 64Bit Betriebssystem egal ob eine 32Bit BAR oder 64Bit BAR verwendet wird. Ist es auch für ein 32Bit Betriebssystem egal? Heißt eine 32Bit BAR auch gleichzeitig, dass der allozierte Speicherbereich nur im "unteren" Arbeitsspeicherbereich sich wieder findet? Gruß und einen schönen Abend, Seb
Sebastian schrieb: > Ist es auch für ein 32Bit Betriebssystem egal? Ist auch egal. Falls ein BIOS die Möglichkeit hat, die BAR jenseits von 4 Gbyte anzulegen (gilt auch für prefechable BARs) muss es entweder eine Einstllung anbieten, oder das 32bit OS muss damit zurande kommen. (z.B. die BAr neu setzen). > Heißt eine 32Bit BAR auch gleichzeitig, dass der allozierte > Speicherbereich nur im "unteren" Arbeitsspeicherbereich sich wieder > findet? Nein, DMA hat mit der BAR nichts zu tun. Du gibst bei IoGetDmaAdapter an ob 64Bit DMA kannst. http://msdn.microsoft.com/en-us/library/windows/hardware/ff543107%28v=vs.85%29.aspx Wenn du nur 32bit unterstüzten willst, gibt es bei 32bit Windows mit PAE Support (z.B. Windows 2000 Server) u.U. Probleme, da dann noch Translationsregisters alloziert werden müssen.
@LatticeUser: Danke für deine Hilfe Gruß, Seb
Guten Morgen, ich bin nochmal über eine Frage gestolpert, welche ich mir noch nicht beantworten kann. Folgende Aussage steht im Raum: Wenn ich den Treiber ohne Scatter Gather benutze, dann wird der Speicherbereich im "Kernel-Space" verwendet. Wenn der Treiber Scatter Gather benutzt, dann wird der Speicherbereich im "User-Space" abgebildet. Für Applikationen im Betriebssystem sei es nur sauber, wenn der "User-Space" verwendet wird. Zugriffe auf den "Kernel-Space" seinen tunlichst zu vermeiden. Stimmt die Aussage so? Oder ist es möglich auch ohne Scatter Gather den Adressbreich in den User-Space zu mappen? Danke, Seb
Sebastian schrieb: > Guten Morgen, > > ich bin nochmal über eine Frage gestolpert, welche ich mir noch nicht > beantworten kann. > Folgende Aussage steht im Raum: > Wenn ich den Treiber ohne Scatter Gather benutze, dann wird der > Speicherbereich im "Kernel-Space" verwendet. Wenn der Treiber Scatter > Gather benutzt, dann wird der Speicherbereich im "User-Space" > abgebildet. Für Applikationen im Betriebssystem sei es nur sauber, wenn > der "User-Space" verwendet wird. Zugriffe auf den "Kernel-Space" seinen > tunlichst zu vermeiden. > > Stimmt die Aussage so? Oder ist es möglich auch ohne Scatter Gather den > Adressbreich in den User-Space zu mappen? Ja kann man, würde ich aber nicht. Ich verwende eine Ringbuffer Struktur im Kernel, aus dem dann die Applikation mit IOctls (oder read/write) liest, bzw schreibt.
Lattice User schrieb: > Ja kann man, würde ich aber nicht. Hallo Lattice User, danke für die Antwort. Ist das (ohne Scatter Gather) auch mit Windows 8 bzw. Windows 10 möglich?
Sebastian schrieb: > > Ist das (ohne Scatter Gather) auch mit Windows 8 bzw. Windows 10 > möglich? Selbstverständlich ist das möglich.
Lattice User schrieb: > Selbstverständlich ist das möglich. Danke für die klare Aussage. Gruß und schönen Abend, Seb
Ich hab nun einen Treiber ohne Scatter Gather. Er funktioniert sehr gut. Jedoch habe ich folgendes Problem: - Hibernate Modus: funktioniert - Sleep Modus: funktioniert nicht (meine Software liest nur FFFFF... aus dem Arbeitsspeicher) Ich hab bisher keine Ahnung woran das liegen kann bzw. was der Unterschied für den Treiber zwischen Hibernate und Sleep ist. Vielleicht hat jemand einen Tipp für mich wo ich suchen könnte. Vielen Dank, Seb.
Sebastian schrieb: > Ich hab nun einen Treiber ohne Scatter Gather. Er funktioniert sehr gut. > Jedoch habe ich folgendes Problem: > - Hibernate Modus: funktioniert > - Sleep Modus: funktioniert nicht (meine Software liest nur FFFFF... aus > dem Arbeitsspeicher) > > Ich hab bisher keine Ahnung woran das liegen kann bzw. was der > Unterschied für den Treiber zwischen Hibernate und Sleep ist. > Welches Hibernate? Das Pseudo Aus von Windows 8 oder Save to Disk? Aus welchen Speicher wird nur FFFFF..... gelesenen?
Hallo Lattice User, entschuldige die nicht eindeutige Frage. Mit Hibernate meine ich den Ruhezustand von Windows 8.1. Also wahrscheinlich das "Save to Disk", wie du es geschrieben hast. Mit Speicher meinte ich meine über BAR0 und BAR1 allozierter Speicherbereich im Arbeitsspeicher. Nach einem Hibernatezyklus (in Ruhezustand und wieder zurück) sind die Daten im Arbeitsspeicher plausibel. Nach einem Sleepzyklus (in Standby und wieder zurück) sind die Daten falsch, ich lese nur FFFFFFF... zurück Danke für deine Mühe und einen schönen Abend, Seb
Sebastian schrieb: > Hallo Lattice User, > > entschuldige die nicht eindeutige Frage. > > Mit Hibernate meine ich den Ruhezustand von Windows 8.1. Also > wahrscheinlich das "Save to Disk", wie du es geschrieben hast. > > Mit Speicher meinte ich meine über BAR0 und BAR1 allozierter > Speicherbereich im Arbeitsspeicher. Das ist sehr unklar ausgedrückt, da dabei kein Arbeitspeicher alloziert wird sondern der Memory auf der Karte in den Addressraum des Prozessors gemappt wird (ausserhalb des Arbeitsspeichers!), und auch eine virtuelle Addresse bekommt. > > Nach einem Hibernatezyklus (in Ruhezustand und wieder zurück) sind die > Daten im Arbeitsspeicher plausibel. > Nach einem Sleepzyklus (in Standby und wieder zurück) sind die Daten > falsch, ich lese nur FFFFFFF... zurück > Das bedeutet dass der PCI Expresslink nicht wieder hochkommt, bzw das System die Karte nicht konfiguriert. Eine mögliche Ursache ist, dass der FPGA zu lange zum Laden des Bitimage braucht (SPI flash lesen), und noch nicht bereit ist wenn das BIOS die Karte konfigurieren möchte. Eventuell mal einen anderen Slot probieren, insbesondere im x16 Slot sind manche BIOSe extrem ungedultig.
Guten Morgen und vielen Danke "Lattice-User". Das mit dem SPI-Flash ist ein guter Hinweis. Ich werden mal prüfen ob sich da etwas optiermieren lässt. Vielen Dank. Gruß, Seb
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.