Jackintosh hat geschrieben: Fr 28. Okt 2022, 09:49
Dies ist für mich nicht nachvollziehbar. Ich habe mal in die XMS30.TXT reingeschaut
http://www.phatcode.net/res/219/files/xms30.txt und für mich sieht es so aus, als würden lediglich die Funktionen 10h,11h und 12h für UMBs dienlich sein. Diese sind m.E. vergleichbar mit malloc, free und realloc in der Standard C-Lib. So eine Art "query" sehe ich nicht.
Mein UMB Treiber müsste dann die Funktionscodes 0h, 10h, 11h und 12h unterstützen?
Völlig korrekt. Dabei funktioniert die Sache so, dass DOS sich einmalig mit malloc alle UMBs vom XMS-Treiber abholt und danach in Eigenregie verwaltet. Solange Du als einzigen Nutzer von UMBs den DOS-Kern haben willst, kannst Du Dir vermutlich sogar die Funtkionen 11 und 12 sparen...
Query gibts indirekt. Rufe Alloc mit einer unmöglichen Größe auf, dann bekommst Du einen Fehler, und gesagt, was der größte verfügbare Block ist. Dann kann man den Block reservieren und von vorne Anfangen. Wenn der größte verfügbare Block als 0 angegeben wird, sind alle UMBs belegt. Angenommen, wir haben C800-D7FF und DC00 bis DFFF als UMBs verfügbar, dann sieht das etwa so aus:
- DOS: Gib mir bitte einen 1MB UMB
- XMS-Treiber: Geht nicht, habe maximal 64KB am Stück
- DOS: Gib mir bitte einen 64KB UMB
- XMS-Treiber: Gerne, der beginnt bei C800
[*']DOS: Gib mir bitte einen 1MB UMB
- XMS-Treiber: Geht nicht, habe maximal 16KB am Stück
- DOS: Gib mir bitte einen 16KB UMB
- XMS-Treiber: Gerne, der beginnt bei DC00
- DOS: Gib mir bitte einen 1MB UMB
- XMS-Treiber: Geht nicht, UMBs sind alle belegt.
Jackintosh hat geschrieben: Fr 28. Okt 2022, 09:49
Ich tippe mal, was mir so vorschwebt bzw. wie ich das ganze HMA,UMB etc. Zeug verstehe:
Auf einem 8088/8086 System ist HMA nicht möglich, somit HIMEM.SYS nicht nutzbar?!? UMBs hingegen schon. Ein UMB Treiber, der sich als Devicetreiber und dieser XMSXXXX0 Kennung installiert, wird dann funktionieren. Was aber passiert bei einem 80286 System?
Auch kein Problem. Man kann mehrere Treiber laden, die XMSXXXX0 heißen. Wenn Du den UMB-Treiber zuerst lädst, kannst Du auf einem 286 sogar HIMEM mit DEVICEHIGH in einen UMB laden.
Jackintosh hat geschrieben: Fr 28. Okt 2022, 09:49
80286 mit = 1MB RAM: mein SRAM ist unnötig. Kann HIMEM.SYS hier installiert werden, obwohl keine HMA verfügbar ist? Beschränkt sich HIMEM.SYS in diesem Fall auf das Bereitstellen von UMBs?
Bei 286-Computern mit 1MB RAM wird das RAM häufig als 640KB + 384KB Extended Memory (also lineare Adressen 100000h bis 160000h) angeboten, und nicht als UMB. Damit hast Du eine HMA und etwa 320KB weiteres Extended Memory.
Jackintosh hat geschrieben: Fr 28. Okt 2022, 09:49
80286 mit > 1MB RAM: HIMEM.SYS kann HMA (somit XMS) und UMBs bereitstellen
HIMEM unterstützt keine UMBs. Auf einem 286/386-System mit UMBs lädt man typischerweise erst UMB_DRVR / USE!UMBS und danach HIMEM. DOS holt sich vom UMB-Treiber die UMBs ab, wie oben beschrieben, und danach vom XMS-Treiber auch noch die HMA. Weder UMBs noch HMA werden durch den DOS-Kern je an den XMS-Treiber zurückgegeben. Die Freigabefunktionen sind nur für den Fall gedacht, dass man
nicht mit DOS=HIGH,UMB diese Speicherbereiche an den DOS-Kern überreicht, sondern Applikationsprogramme selbst UMBs oder die HMA während der Laufzeit des Programms reservieren und am Ende wieder freigeben. In der Praxis macht das aber keiner.
Ich knobel gerade über der Frage, ob es sinvolle Konstellationen gibt, in denen HIMEM.SYS und mein UMB Treiber gleichzeitig im System geladen werden könnten. Vermutlich geht das aufgrund dieser eindeutigen XMSXXXX0 Kennung (die es dann zweimal gäbe) gar nicht.
Wie oben beschrieben: HIMEM bietet zwar XMS an, aber implementiert die UMB-Funktionen nicht. Du musst also auf jeden Fall beide Treiber anbieten.
Habe die Quellcodes von USE!UMBS und UMM03 überflogen:
- bei beiden finde ich die XMSXXXX0 Kennung nicht
- wie bleiben sie resident im Speicher? Einen Aufruf von int 21h ah=31h (keep resident) finde ich bei beiden nicht
Oder werden Treiber, die über DEVICE= aufgerufen werden immer resident gehalten?
Oh, gut dass Du noch einmal nachgeguckt hast. Offenbar ist nicht der Name XMSXXXX0, sondern die Unterstützung von INT 2F, 4300/4310 das Kriterium. USE!UMBS verwendet I_LOVE_M als Kennung, und das geht offenbar auch. Und was die Koexistenz von XMS-Treibern betrifft: Du siehst bei USE!UMBS, dass der XMS-Einsprungspunkt wie folgt beginnt:
Wenn Du später auch noch HIMEM lädst, dann patcht HIMEM diese 5 Bytes (2 Bytes JMP SHORT + 3 * NOP) durch einen FAR-Jump auf den HIMEM-Einsprungspunkt. Bei Requests, die HIMEM nicht erledigen kann (z.B. UMB-Requests) spring HIMEM dann auf realentry. Ein XMS-Treiber muss, sofern er bei INT2F schon einen XMS-Treiber findet, eine potentielle Kette von JMP-FAR-Befehlen verfolen, bis er auf JMP SHORT + 3*NOP (EB 03 90 90 90) landet, und sich dann dort reinhängen. Damit ändert sich dann der XMS-Einsprungspunkt trotz Funktionserweiterung nicht. INT 2F muss im Fall, dass schon ein XMS-Treiber vorhanden ist,
nicht selbst gehookt werden.
Wenn ein Treiber, der per DEVICE= geladen wird, muss er bei der Treiber-Funktion "Initialisierung" im Request-Header (so nennt USE!UMBS die Datenstruktur) zurückgeben, bis wohin er Speicher belgt. Das ist von DOS vorinitialisiert auf die Größe der .SYS-Datei, aber die meisten Treiber verkürzen das, um den Intialisierungs-Code nicht resident zu halten.