Autor Thema: Virtualising  (Gelesen 5002 mal)

FalShen

  • Beiträge: 73
    • Profil anzeigen
    • ScénOS
Gespeichert
« am: 20. April 2007, 17:15 »
Tja...
Für Multitasking wäre es ja nützlich, den Speicher virtuell zu mappen. Auf Bona Fide wollte ich mich schlau machen. Da hab ich Beispielkernel gefunden und die Memory Management Tutorials von Tim Robinson. War ja ganz nett, aber als ich dann and Implementieren gehen wollte, stieß ich dann auf Probleme... Mappen bringt Fehler, ich hab lange an der Linkerfile rumgespielt, aber brachte nichts.
Was ich vorhabe: Der Kernel soll nach 0xf0000000 gemappt werden (256 MB sollten für ihn reichen), die Programme haben dann auch mehr Platz. Wie und wann soll ich dann im Kernel mappen? Ich will einen Stack für die Pages, wie krieg ich den aufgebaut?
Ich bräuchte irgendwie konkrete Hilfe oder Codestückchen, weil ich hier echt nicht mehr weiterkomme...
Wäre nett wenn mir jemand helfen könnte, danke ^^

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #1 am: 21. April 2007, 10:06 »
Mappen bringt Fehler, ich hab lange an der Linkerfile rumgespielt, aber brachte nichts.
Wenn man dir bei deinem Code helfen soll, dann solltest du etwas genauer werden.

Zitat
Wie und wann soll ich dann im Kernel mappen?
sobald das möglich und sinnvoll ist. Ich benutz grub und mach das sofort in meinem Assemblerstub (unter der GPL, bitte beachten!). Mein Linkerscript schaut dann so aus.

Zitat
Ich will einen Stack für die Pages, wie krieg ich den aufgebaut?
Wie ein Stack halt nunmal aufgebaut ist :-P Konkreter Code: platformunabhängiger Code, Headerdatei dazu, x86 spezifischer Code und die Initialisierung anhand der grub memory map
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

FalShen

  • Beiträge: 73
    • Profil anzeigen
    • ScénOS
Gespeichert
« Antwort #2 am: 24. April 2007, 12:28 »
Mal sehen ob ich den Assemblerstub jetzt richtig interpetiert habe (sorry, hat ne weile gedauert, abitur), ich hab so meine probleme mit der AT&T Syntax:
Zuächst wird die addresse für den header korrigiert und schon mal gepusht, damit ebx frei ist. Dann is was mit dem eflags register (keine ahnung was). Dann wird der header geparst und der speicherbedarf der von GRUB geladenen Module berechnet. Diese addresse, wo die module enden, wird dann auf die nächste Page aufgerundet.
Danach beginnt das mappen... Wobei ich da jetzt verwirrt bin, weil ich nich sehen kann was nun wohin gemappt wird und wo die pages und so liegen... Kannste das nochmal erklären?

FalShen

  • Beiträge: 73
    • Profil anzeigen
    • ScénOS
Gespeichert
« Antwort #3 am: 06. May 2007, 02:36 »
Mann wegen dem Abi hab ich kaum Zeit mich damit zu befassen...
Also, hab jetzt mal selbst versucht, mit dem mappen. Ich kriege eine fehlermeldung, jedes mal, wenn ich versuche, daten in dem gemappten kernelbereich, also 0xc0000000, anzusprechen. Soll heißen, irgendwie is da wohl was nicht gemappt. Ich hab aber keine ahnung, was ich hier noch vergessen habe.

[EXTERN main]
[EXTERN __phys_kernel_start__]
[EXTERN __phys_kernel_end__]

[GLOBAL start]
start:

cmp eax, 0x2badb002
je start1
failure:
cli
hlt

start1:
mov eax, multiboot
sub eax, DIFF
mov [eax], ebx

;clear the page directory
mov eax, 0x00200000
mov ecx, 0x1000 / 0x04
.0:
mov dword [eax], 0x02
add eax, 0x04
loop .0

;mirror-map 0x00000000 to 0x00100000
mov eax, 0x00201000
mov ebx, 0x00000000 | 0x03
mov ecx, 0x1000 / 0x04
.1:
mov [eax], ebx
add eax, 0x04
add ebx, 0x1000
loop .1

;mirror-map 0x00100000 to 0x00200000
mov eax, 0x00202000
mov ebx, 0x00100000 | 0x03
mov ecx, 0x1000 / 0x04
.2:
mov [eax], ebx
add eax, 0x04
add ebx, 0x1000
loop .2

;map the kernel
mov eax, 0x00203000
mov ebx, __phys_kernel_start__
or ebx, 0x03
.3:
mov [eax], ebx
add eax, 0x04
add ebx, 0x1000
cmp ebx, __phys_kernel_end__
jle .3

;set the pages
mov dword [0x00200000], 0x00201000 | 0x03
mov dword [0x00200001], 0x00202000 | 0x03
mov dword [0x00200c00], 0x00203000 | 0x03

;set directory
mov eax, 0x00200000
mov cr3, eax

;activate paging
mov eax, cr0
or eax, 0x80000000
mov cr0, eax

lgdt [gdtp]
jmp OS_CODE_SEL:start2

start2:
mov ax, OS_DATA_SEL
mov ds, ax
mov es, ax
mov ss, ax
mov fs, ax
mov gs, ax

mov esp, stack

mov eax, [multiboot]
push eax
call main
add esp, 4

cli
hlt


[SECTION .data]

multiboot dd 0

was mache ich falsch?

 

Einloggen