Autor Thema: Zum Thema Mikrokernel  (Gelesen 23564 mal)

DDR-RAM

  • Beiträge: 184
    • Profil anzeigen
Gespeichert
« Antwort #40 am: 29. May 2005, 11:54 »
ja, das schrieb ich schonmal so ähnlich, gucksu seite 1 ;-)
Aber mit Segmentierung, wird das Ganze komplexer, außerdem hat man dann wieder near und far pointer *iieeehh*
Dadurch wird alles unübersichtlicher und auch langsamer.

MfG
DDR-RAM

GhostCoder

  • Beiträge: 187
    • Profil anzeigen
Gespeichert
« Antwort #41 am: 29. May 2005, 13:10 »
Hiho,

ups, überlesen :)

Also komplexer wird es wohl kaum, du musst ja nur wissen, wie groß der Code ist, dann .data+.bss ist die Größe vom Data Segment und den Stack ja variabel.
Nachdem du den ELF Header eingelesen hast, wäre das Segment Setup drei Zeilen "komplex" :)

Near und Far sind ja egal, dazu sind ja die Default Prefixes da... Eigentlich musst du überhaupt nichts ändern.

Ob ich jetzt

mov eax,[esp-4]

oder

mov eax,[ss:esp-4]

schreibe ist ja egal. Gut, EBP könnte Probleme bereiten, hab aber keine Lust nachzugucken jetzt :)

Gruß GhostCoder
A man, a legend!

DDR-RAM

  • Beiträge: 184
    • Profil anzeigen
Gespeichert
« Antwort #42 am: 29. May 2005, 13:45 »
Also, ein Programm, das für flat segmente compiliert wurde, kann nicht mit non-flat segmenten arbeiten, das geht nicht.

Es nimmt ja an, das cs-base = ds-base = es-base = ss-base = 0 und
das cs-limit = ds-limit = es-limit = ss-limit = FFFF FFFF gilt.
Wahrscheinlich würde es noch laufen, wenn die base nicht 0 ist, aber alle segment-bases gleich. aber wenn die segment-bases unterschiedlich sind, wird es nicht mehr funktionieren, da eine Struktur die aufm stack liegt, nen 48-bit pointer benötigt

Beispiel:
C-Code

void foo(int* p)
{
*p = 4;
}

int bar()
{
int x;
foo(&x);
return x;
}

asm-code

foo:
mov eax, [esp+4] ; implizit ss
mov dword ptr [eax], 4 ; implizit ds
ret

bar:
sub esp, 4
push esp
call foo
mov eax, [esp + 4] ; implizit ss
add esp, 4
ret

(so ungefähr)

Der Knackpunkt ist, das für esp nen anderer default-selektor nimmt, als eax. Es müssten die selektoren mit übergeben werden.


foo:
mov ecx, [esp+8]
mov eax, [esp+4]
mov gs, cx
mov dword ptr gs:[eax], 4
ret

bar:
sub esp, 4
mov edx, esp
push ss
push edx
call foo
mov eax, [esp + 4]
add esp, 8
ret


edit:
außerdem bräuchte man wahrscheinlich noch ldt's, falls man auch sehr viele prozesse unterstützen möchte und das ist ein erheblicher mehraufwand.
und amd64 unterstützt auch nur noch flat-segmentierung (außer bei fs und gs, wegen thread-local von win)

MfG
DDR-RAM

GhostCoder

  • Beiträge: 187
    • Profil anzeigen
Gespeichert
« Antwort #43 am: 30. May 2005, 15:37 »
Zitat

und amd64 unterstützt auch nur noch flat-segmentierung (außer bei fs und gs, wegen thread-local von win)


Find ich eigentlich schade, Segmentierung hat echt seine Vorteile. Sicherheit, wie gesagt, aber auch im Microkernel gibt dir das extreme Geschwindigkeitsvorteile, weil du ja keine Pages mehr rumschieben musst, sondern einfach nur base+offset addierst, und kopierst.

Gruß GhostCoder
A man, a legend!

 

Einloggen