Cache im x486

OP #4016218
Ich habe eine x486 Variante "AMD SC520" auf dem Tisch zu liegen. Auf dem 
Teil läuft ein Bootloader, der auch ein Windows CE starten kann.

Bei Performancetests habe ich festgestellt, dass der TFTP Download im 
Bootloader nur halb so schnell läuft wie im Windows CE. In beiden Fällen 
benutzt der Code den Ethernet-Controller direkt. Während des Donwloads 
erfolgt noch eine einfache Verarbeitung. Die Datei hat ca. 100 
Abschnitte, die jeweils die Zieladresse, Länge, Prüfsumme des Abschnitts 
und natürlich die Daten enthält.

Der Unterschied zwischen dem Bootloader und dem Prozess in Windows CE 
ist, dass der Bootloader zwar im 386 Protected Mode läuft, aber kein 
Paging eingeschaltet hat. Damit sind die Attribute, die sonst in die 
Page-Tabellen eingetragen werden nicht aktiv.

- Gibt es eine Möglichkeit, festzustellen, welche Caches aktiv sind?

- Ist Paging erforderlich, um die Cache-Möglichkeiten auszuschöpfen?

- Welche Einstellungen sollte ich vornehmen, um die Performance im 
Bootloader zu verbessern?

Ergänzen möchte ich noch, dass der Code für den TFTP Download im 
Bootloader und in der Windows CE Implementierung identisch ist. 
Unterschiede gibt es in der Bereitstellung des Download-Puffers auf den 
der TFTP Handler schreibt:
1
pDownload = VirtualAlloc(NULL, 0x1000000, MEM_COMMIT, PAGE_READWRITE);

Der DMA-Puffer ist in beiden Fällen im "normalen" Datenbereich. Für den 
Conroller wird die physikalische Adresse mit dieser Anweisung besorgt:
1
DWORD dwPages[2];
2

3
void *pBase = (void*)(((DWORD)pVirt) & 0xFFFFF000);
4
DWORD dwOffset = (DWORD)pVirt - (DWORD)pBase;
5
LockPages(pBase, uSize + dwOffset, (PDWORD)&dwPages, /*LOCKFLAG_WRITE*/1);

Die Flags im VirtualAlloc enthalten nicht PAGE_NOCACHE, damit ist Cache 
zugelassen.
Gast #4016227
Das muss nicht unbedingt am Caching liegen. Ich vermute viel eher dass 
die Implementation des Bootloaders einfach nur anders, langsamer, 
implementiert wurde.
Gast #4018181
Du kannst ja erstmal die Hypothese "im Bootloader ist Cache inaktiv" mit 
irgendeinem Minibenchmark testen, der auf einstellbar paar wenigen KB 
Speicher herumtrampelt; wenn Caches aus sind, ist der bei 8K genauso 
schnell wie bei 32K; wenn Cache an ist, ist er auf kleinen Puffern 
schneller als auf grossen. ("schnell" meint da Laufzeit pro 
Speicherzugriff).

Dann: der Code sei der Gleiche: alles? Inklusive Ethernet-Treiber und 
IP-Stack? Oder nur alles oberhalb UDP-Sockets? Ich wuerde erwarten, dass 
in einem Bootloader der Ethernettreiber konservativ (zB nur PIO) 
implementiert ist und in WinCE Interrupts&DMA benutzt.
OP #4020882
Konrad,

Danke für den Tip mit Performancetest um die Cachethese zu überprüfen. 
Das werde ich machen.

> Dann: der Code sei der Gleiche: alles?
Ja.

> Inklusive Ethernet-Treiber und IP-Stack? Oder nur alles oberhalb
> UDP-Sockets?

Wie ich schon in der Frage geschrieben habe (In beiden Fällen benutzt 
der Code den Ethernet-Controller direkt.) ist die Implementierung aller 
Routinen bis hinunter zum Ethernetcontroller identisch. Ethernet, ARP, 
IP, UDP, TFTP und das proprietäre Protokoll sind identisch. Lediglich 
die Bereitstellung der DMA-Puffer erfolgt im Windows CE über LockPages 
währen im Bootloader durch das lineare Adressmodell keine 
Pagetableeinträge notwendig sind.

> Ich wuerde erwarten,
Nun, diesmal wird Deine Erwartung nicht erfüllt. Dieses können wir also 
ausschließen.
OP #4025367
Der AMD Élan SC520 ist eine Variante des x486. Der Cache ist nach dem 
Reset ausgeschaltet. Um den Cache freizugeben muss das CD Bit in CR0 
zurückgesetzt werden. Damit sind eine Reihe von Operationen deutlich 
schneller, einschließlich des TFTP Downloads.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.