Re: segmentierte Addressierung

From: Oliver Fromme <olli(at)lurza.secnetix.de>
Date: Fri, 11 Feb 2005 17:44:19 +0100 (CET)

Marc Santhoff <M.Santhoff(at)t-online.de> wrote:
> Um den INT15 mit dem syscall i386_vm86() aufzurufen soll ich die Adresse
> des Puffers für den Rückgabewert angeben, und zwar in ES:BX. ES bekommt
> das Datensegment und BX den Offset.
>
> Wenn ich die Parameter zusammensetze läuft der Prozeß aber so wie ich es
> verstehe noch nicht im virtuellen 86er Modus.
>
> Wie schreibe ich die Adesse da rein, einfach obere Hälfte nach EX und
> untere 16 Bit nach BX? Oder kennt der kernel eine Funktion zur
> Addressermittlung oder -übersetzung?

Ich nehme an, Du willst das im Kernel-Kontext für einen
Treiber machen, oder? (Aus dem Userland heraus ist es
nicht möglich, soviel ich weiß.)

Du brauchst die Funktionen vm86_getpage(), vm86_getptr()
und vm86_datacall(). Die geben Dir eine im VM86-Modus
gültige Speicherseite, übersetzen den Pointer in ein Seg-
ment-Offset-Paar, und sorgen für den Datentransfer.

Guck mal in src/sys/i386/isa/vesa.c, dort z.B. die Funk-
tion vesa_bios_save_palette(). Die macht genau sowas.

Wie gesagt, das geht nur aus dem Kernelkontext heraus.
Wenn Du den BIOS-Interrupt aus dem Userland heraus auf-
rufen willst, mußt Du wohl einen kleinen Stub im Kernel
schreiben, der das für Dich macht, und diesen dann aus
dem Userland heraus aufrufen. Je nach Kontext kann dafür
ein eigener System-call sinnvoll sein, oder auch ein
ioctl oder ein sysctl.

Gruß
   Olli

-- 
Oliver Fromme, secnetix GmbH & Co KG, Oettingenstr. 2, 80538 München
Any opinions expressed in this message may be personal to the author
and may not necessarily reflect the opinions of secnetix in any way.
'Instead of asking why a piece of software is using "1970s technology,"
start asking why software is ignoring 30 years of accumulated wisdom.'
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Fri 11 Feb 2005 - 17:46:24 CET

search this site