Re: segmentierte Addressierung

From: Marc Santhoff <M.Santhoff(at)t-online.de>
Date: Tue, 15 Feb 2005 17:26:29 +0100

Am Di, den 15.02.2005 schrieb Simon 'corecode' Schubert um 14:48:
> On 15.02.2005, at 08:20, Marc Santhoff wrote:
>
> > static struct vm86context a_vmcontext;
>
> wird das mal initialisiert? oder braucht man das nicht? genullt reichts
> scheinbar ja auch.

Sollte reichen, in vesa.c habe ich nichts weiter gefunden, suche aber
nochmal zur Sicherheit..

> > int
> > sysctl_a_sernum(SYSCTL_HANDLER_ARGS) {
> >
> > struct vm86frame vmf;
> > u_char *p;
> > char s[10] = "0123456789";
> >
> > vm86_initialize();
>
> das brauchst du vermutlich nicht. das passiert schon in init386().

Okay. Die Wirkung war auch ohne die gleiche, experimentell ergänzt
sozusagen ...

> > bzero(&vmf, sizeof(vmf));
> >
> > vmf.vmf_ah = 0xEA;
> > vmf.vmf_al = 0x01;
> > vmf.vmf_edx = 0x4648;
> > vmf.vmf_cl = 1;
> >
> > p = (u_char *)vm86_getpage(&a_vmcontext, 1);
>
> schon mal p ueberprueft? ich geh davon aus, dass das 0 zurueckliefert.
> vermutlich musst du erst ein vm86_addpage() machen.

Ja, nur nicht hierher kopiert. p ist immer Null. Das "addpage" wird
hoffentlich das fehlende Glied sein. Wobei ich leider die Zusammenhänge
noch nicht vollständig begreife, ein Tutorium oder sowas wäre wertvoll,
wenn jemand 'nen Link hätte ...

> > error = vm86_getptr(&a_vmcontext, (vm_offset_t)p, &vmf.vmf_es,
> > &vmf.vmf_bx);
> > if (error != 0) {
>
> die logik ist falschrum. error == 1 -> alles ok, error == 0 -> mapping
> nicht gefunden.
> ab hier gehts natuerlich nicht mehr sinnvoll...

Das muß so sein. ;)

Ich benutze das nur so, um im Fehlerfall eine eindeutige Meldung zu
bekommen, wenn ich mit "return error" rausgehen lasse, wird der sysctl
nicht akzeptiert. Debugging durch die Hintertür eben. Und dieser Code
arbeitet einwandfrei. :)

> > snprintf(s, sizeof(s),"getpointer");
> > error = SYSCTL_OUT(req, &s, max);
> > return 0;
> > }
> > error = vm86_datacall(0x15, &vmf, &a_vmcontext);
>
> fehlerueberpruefung?

Im Original ja.

> > snprintf(s, sizeof(s), "0: %x %x %x %x", vmf.vmf_cl, vmf.vmf_es,
> > vmf.vmf_bx, vmf.vmf_dx);
> >
> > error = SYSCTL_OUT(req, &s, max);
> >
> > return 0;
> > }
> >
> > Ausgabe bei "sysctl hw.sernum":
> > hw.sernum: 0: 0 0 0 6b6f
> >
> > Der Inhalt von DX ist 6B6F bei Erfolg. Nur die Adresse ES:BX ist immer
> > 0x0000, damit kann ich natürlich nichts anfangen, außer durch
> > dereferenzieren den Kernel in Panik zu versetzen.
> >
> > Sieht jemand den Fehler?
>
> ich geh mal davon aus, dass die funktion in es:bx die adresse erwartet,
> wo sie die daten hinschreiben kann, und nicht dass sie in es:bx die
> adresse der daten zurueckliefert (sonst waers ja auch nicht sinnvoll
> speicher zu reservieren).

Ja, so war das gemeint.

> ... und dann steht das ergebnis vermutlich in der ge'addpage()'ten
> seite.

Ich werd's testen.

> alles nur reine spekulation, ich verwende kein freebsd-5

Ich auch nicht, läuft (noch nicht richtig) auf 4.11.

Vielen Dank erstmal,
Marc

To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Tue 15 Feb 2005 - 17:34:02 CET

search this site