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.