hey Leute,
ich blicks immer noch nicht ganz... ich habe folgende fragen:
1) ich habe verstanden, warum ich für jeden prozess mindestens zwei stacks haben sollte (userstack ring3 & kernelstack ring0). aber ich weiß nicht, wie groß ich die stacks beim starten eines tasks bemessen soll, also wieviel byte malloc() allozieren soll. wenn ich den kerneltack zu groß bemesse, habe ich eine enorme speicherverschwendung (zb 10kb + pro Task). das sollte doch eigentlich nicht sein... wie löst ihr das problem?
2) beim allozieren von speicher durch malloc() ist klar, dass ich zum beispiel die stackmethode wähle, um zu wissen welche pages noch unbenutzt sind. aber ein problem ist doch, dass wenn eine anwendung beispielsweise 120kb anfordert, nicht nur 30 pages zur verfügung stehen müssen, sondern auch eine zusammenhängende folge von virtuellen adressen unbenutzt sein muss. zb virtueller speicherbereich von 0x0 bis 0x1000 ist belegt, 0x1500 bis 0x2000 belegt und bis 0x3000 ist der virtuelle speicher frei. wenn jetzt 0x1500 speicher gebraucht wird, dann ist zwar genug speicher frei, aber nicht zusammenhängend... wie kann da malloc() einen pointer auf einen zusammenhängenden speicherbereich liefern?
3) ich habe gelesen, dass man bei jedem taskswitch auch das cr3 ändert, also das pagedirectory... warum das? dann müsste ja jeder task 4mb(pagetables)+4kb(pagedirectory) haben... das ist doch auch vergeudung... oder setzt man dann das presentbit im pagedirectory nicht und spart so pagetables?
gruß
Cheebi