[ag-automation] off-topic: Frage zu sehr langsamen PCI Zugriffszeiten
Hans-Peter Bock
Hans-Peter.Bock at isw.uni-stuttgart.de
Fri Oct 31 12:15:50 CET 2008
Hallo allerseits,
ich habe in einem Kernelmodul eine Kopierroutine, die 26 Byte aus einer PCI-Karte in den Hauptspeicher überträgt. Dieser Kopiervorgang dauert 7us oder 3407 CPU Takte bei 500MHz CPU Takt. Dies erscheint mir sehr langsam, da der PCI-Bus theoretisch alle 30ns vier Byte Daten übertragen kann.
Hier Ausschnitte aus dem Quelltext:
[...]
char temp[26];
src8 = ioremap(pci_resource_start(dev, 0), pci_resource_len(dev, 0));
do_gettimeofday(&start);
cstart = get_cycles(); // rdtsc
memcpy(temp, src8, sizeof(temp));
cstop = get_cycles(); // rdtsc
do_gettimeofday(&stop);
[...]
Disassembliert sieht das ganze so aus:
2c8: e8 fc ff ff ff call 2c9 <sercos_pci_init_one+0x158>
2c9: R_386_PC32 do_gettimeofday
2cd: 0f 31 rdtsc
2cf: b9 06 00 00 00 mov $0x6,%ecx
2d4: 89 44 24 1c mov %eax,0x1c(%esp)
2d8: 89 54 24 20 mov %edx,0x20(%esp)
2dc: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
2de: 66 a5 movsw %ds:(%esi),%es:(%edi)
2e0: 0f 31 rdtsc
2e2: 89 c3 mov %eax,%ebx
2e4: 89 d6 mov %edx,%esi
2e6: 8d 44 24 40 lea 0x40(%esp),%eax
2ea: e8 fc ff ff ff call 2eb <sercos_pci_init_one+0x17a>
2eb: R_386_PC32 do_gettimeofday
Der memcpy() wird vom Compiler auf die Zeilen 2cf:, 2dc: und 2de: reduziert:
2cf: b9 06 00 00 00 mov $0x6,%ecx // counter auf sechs
2dc: f3 a5 rep movsl %ds:(%esi),%es:(%edi) // sechsmal vier Byte kopieren
2de: 66 a5 movsw %ds:(%esi),%es:(%edi) // einmal zwei Byte kopieren
Woran kann die sehr hohe Übertragungsdauer liegen?
Grüße, Hans-Peter Bock
--
(°< Hans-Peter Bock, Dipl.-Ing., http://www.isw.uni-stuttgart.de/ >°)
(/) ISW - Universität Stuttgart, Seidenstraße 36, 70174 Stuttgart (\)
More information about the ag-automation
mailing list