Zitat von
marabu:
Als ich mich noch mit solchen Fragen beschäftigt habe, da gab es eine global bzw. local descriptor table, in der Prozessor und MMU informiert wurden, welche Zugriffe auf welchen Speicher erlaubt sind. Ein Zugriff auf die falschen Adressen sollte vom
OS erkannt und gemeldet werden.
LDT und GDT gibt es immernoch, und ja, die werden je nach Threadkontext anders geladen. So ist beispielsweise der TEB (Thread Environment Block) immer an einer anderen Stelle pro Thread, man kann ihn aber ermitteln, indem man fs:0 ausliest. Voila, ein Deskriptor ganz nach altem PM-Stil
Im PM sagt man zu cs, ds, es, fs usw. ja nicht umsonst "Segment-Deskriptoren", obwohl es doch keine Segmente mehr gibt
Zitat von
Pseudemys Nelsoni:
Könnte ein Zugriff auf ein Zeichen VOR dem String je einen Fehler verursachen oder kann ich da immer problemlos drauf zugreifen? Es geht mir nur darum das di Funkktion natürlich keine AVs erzeugt
Egal wo, ja. Das Problem ist folgendes:
- Jeder Prozeß hat insgesamt 2 GB, die ihm gehören (die anderen 2 bis 4 sind "Kernelspeicher", kann aber auch verstellt werden, zB auf Servern)
- Wie kann ein Prozeß 2 GB haben wenn dein PC nur 1 GB hat?
- Es ist kein echter sondern virtueller Speicher (Linearer Speicher). Auf den echten kannst du aus dem Usermode nicht (ohne weiteres) zugreifen.
- Dieser Speicher wird in Tabellen vom OS verwaltet, welches dann dafür sorgt, daß lineare zu physikalischen Seiten gemappt werden können.
- Zugriff wird vom OS immer überprüft und wenn du woanders zugreifst als du alloziert hast, gibt's normalerweise eine Exception (auch die kann man bekanntlich abfangen)
Fazit: Laß es sein. Wenn du sowas mit Exceptions machen willst, schau dir an wie zB Stacks implementiert werden. Ansonsten ist Speicher den man nicht alloziert hat tabu. Und mit "man" meine ich hier einen beliebigen Teil deines Programmes (oder von außen einen Teil der als dein Programm agiert).
Hinweis: manche Stacks sind so implementiert, daß sie wachsen wenn eine
Exception ausgelöst wurde. In diesem Fall wird die
Exception vor dem Programm versteckt und intern genutzt um den Stack dynamisch zu vergrößern. Ich persönlich benutze das gerade für ein speichersparendes Modell von Molekülen.