Beiträge anzeigen

Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.


Nachrichten - erik.vikinger

Seiten: 1 ... 61 62 [63] 64
1241
OS-Design / Re: Konzeption und Anfang
« am: 17. October 2009, 14:25 »
Hallo,


Zitat
Was mehr als eine Vaterklasse hat, ist bei mir schon Mehrfachvererbung.
Das ist nicht ganz richtig. Wenn C von B abgeleitet ist und B von A dann ist das nur mehrfache Einfachvererbung, wenn C direkt von A und B abgeleitet ist dann ist das Mehrfachvererbung.
siehe http://de.wikipedia.org/wiki/Vererbung_%28objektorientierte_Programmierung%29#Mehrfachvererbung
Das A und B selber wieder von D abgeleitet sein können ist dann das Diamond-Problem.
siehe http://de.wikipedia.org/wiki/Diamond-Problem


Zitat
als Bus könnte man das ohne weiteres jedem Gerät geben
Damit würde ein Gerät auch seine physische Position in der Baum-Architektur kennen was z.B. fürs Power-Management wichtig ist. Monitor A hängt an Graphikkarte B und die hängt auf dem PCI-Bus-Segment C welches hinter PCI-2-PCI-Bridge D usw. Wenn Du die Graphikkarte in Powerdown schicken möchtest musst Du wissen das davon zwangsläufig der Monitor betroffen ist und zusätzlich kannst Du die PCI-2-PCI-Bridge bzw. den einen Downstream-Port abschalten wenn auf dem Bus-Segment nichts anderes mit drauf ist.

Zitat
.... und PCI ist dann eben davon abgeleitet
Denke auch an PCI-Express, da gibt es schon ein paar Dinge die ein klein wenig anders sind. Der Config-Address-Space ist z.B. von 256 Bytes auf 4096 Bytes gewachsen. Bei PCI-Express lassen sich auch Hardware-Fehler besser zuordnen, falls Du mal Machine-Check-Exceptions unterstützen möchtest ist das von großem Nutzen.


Grüße
Erik
1242
Lowlevel-Coding / Re: Verständnis Frage GDT
« am: 17. October 2009, 12:13 »
Hallo,


Zitat
Der Trick ist, dass jeder Prozess sein eigenes Page Directory bekommt.
Aber in diesem Page Directory ist natürlich nicht jede Page zugewiesen. Ein kleines Programm benötigt vielleicht nur ein paar MB und nur so viel wird tatsächlich als physischer Speicher alloziert und über das Page Directory des entsprechenden Prozesses in dessen linearen/virtuellen Adressraum "eingemountet". Der Rest bleibt "leer", ein Zugriff auf leere Bereiche löst eine "Page not Present"-Exception aus, was dann das OS als "Prozess benötigt mehr RAM" interpretieren kann oder den Prozess beendet.

Zusätzlich muss noch der Kernel in jeden Adressraum mit eingeblendet werden, damit nicht bei jeden Aufruf einer Kernel-Funktion das Page Directory gewechselt werden muss, so das von den 4 GB eh nur 2 bis 3 GB übrig bleiben. Der Kernel, und damit z.B. auch die IRQ-Handler, hat also keinen eigenen Kontext sondern ist in allen Kontexten vorhanden (immer an der selben virtuellen Adresse).


Grüße
Erik
1243
Das Wiki / Re: Umstrukturierung des Forums
« am: 17. October 2009, 12:02 »
Hallo,


Einen Wunsch habe ich noch: ein "Zeige alle Beiträge auf einer Seite" Element währe echt nicht schlecht. Die 15 Beitrage pro Seite schaffen bei manchen wortkargen Diskussionen nicht mal einen vertikalen Scrollbalken.


Grüße
Erik
1244
OS-Design / Re: Konzeption und Anfang
« am: 17. October 2009, 11:49 »
Hallo,


Zitat
Ich aber schon. Es gibt nämlich Hardware, die sowohl ein PCI-Gerät als auch eine Netzwerkkarte ist.
Das ist aber noch keine Mehrfachvererbung. Außerdem sind PCI-Devices immer auch irgendwas nützliches so das dieser Zusammenhang nicht zwangläufig durch Vererbung hergestellt werden sollte. Das Device-Struct sollte ein Member "BUS", Pointer auf ein BUS-Struct, haben und hinter diesem kann sich das passende BUS-System verbergen. Die Infos die das BUS-System liefern muss, also die zugewiesenen Hardwareressourcen, sind immer die selben.

Zitat
und da ist C nunmal der kleinste gemeinsame Nenner.
Das ist natürlich ein Argument. Wenn Kompatibilität ein Designziel ist dann muss man dem eben auch gehorchen.


Zitat
Bei Mehrfachvererbung könnte ich maximal noch anfangen, ein Array von Vaterklassen anzulegen, die ich dann beim Aufrufen durchgehe und die richtige raussuche.
Ich vermute so ähnlich wird das auch gemacht. Nur würde ich bei allen Klassen die virtuelle Methoden enthalten als ersten Eintrag in der vtable eine Funktion referenzieren die für den aktuellen tatsächlichen Typ (daher hat jedes Objekt eine Typ-ID o.ä.) des Objekts eine passende vtable für den gewünschten Typ, eben eine Elternklasse, zurückgibt nur das die Einträge in dieser vtable auf die abgeleiteten Methoden verweisen. Ob es wirklich so gemacht wird weis ich nicht aber ich würde das so versuchen falls ich nicht noch irgendwelche Stolperfallen übersehen hab.


Grüße
Erik
1245
OS-Design / Re: Konzeption und Anfang
« am: 16. October 2009, 22:08 »
Hallo taljeth,


Zitat
http://thread.gmane.org/gmane.comp.version-control.git/57643/focus=57918 ist nicht Antwort genug? :wink:
Da streiten Dinosaurier über Probleme von (fetten) Dinosauriers, da halte ich mich lieber raus. :wink:
In meinem OS wird der Micro-Kernel sicher zu guten Teilen direkt in Assembler (nach VHDL meine zweitliebste Programmiersprache) entstehen aber die ganzen umliegenden Schichten, User-Mode-Applikationen welche die Personlity liefern und Treiber darstellen, werden bestimmt C++ sein.


Grüße
Erik
1246
OS-Design / Re: Konzeption und Anfang
« am: 16. October 2009, 21:44 »
Hallo taljeth,


Zitat
Hm, ja, zu CDI wollte ich ja sowieso noch was schreiben.
Dann hab ich nichts gesagt.

Zitat
Aber für Mehrfachvererbung bräuchte ich erstmal selber ein brauchbares Konzept...
Das hatte ich auch nicht ernst gemeint.
Ich denke mal es wird für jede Klasse (nicht für jedes instantiierte Objekt) für jede beerbte Eltern-Klasse eine passende vtable erstellt so das der Code zur Laufzeit sich nur die vtable raussuchen muss die zu dem erwarteten Typ, was ja eine Eltern-Klasse des tatsächlich vorhandenen Typs sein muss, passt. Diese vtable muss genau so aufgebaut sein,aber eben nicht den selben Inhalt haben, wie die die zu der entsprechenden Eltern-Klasse direkt gehört. Man bräuchte dann nur noch eine Funktion welche zum aktuellem Klassen-Typ eine vtable raussucht die dem Typ des gewünschten Eltern-Klassen-Typs entspricht. So würde ich zumindest versuchen das Problem zu lösen, das echte C++-Compiler das viel besser/eleganter/effizienter können ist aber sehr wahrscheinlich. Wir sollten das Rad jedenfalls kein zweites mal neu erfinden, signifikant runder bekomm ich das ganz sicher nicht hin.


Grüße
Erik
1247
OS-Design / Re: Konzeption und Anfang
« am: 16. October 2009, 21:04 »
Hallo taljeth,


Zitat
Den Teil überlasse ich gern dir. ....
Hm, währ mal ne Herausforderung, aber eigentlich setze ich dann doch lieber gleich auf C++ und überlas das ganze dem Compiler.


Zitat
Keine Ahnung, in welchem Zusammenhang ich das unterbringen sollte.
Treiber-Interfaces. Zumindest in einem monolitischen Kernel mit Modulen, wie z.B. Linux, wird sowas sehr oft benötigt. Gerade im Linux-Kernel funktioniert fast alles so, ich frage mich warum dort keiner C++ benutzt, sowas wie Exceptions muss man ja nicht benutzen.


Grüße
Erik
1248
OS-Design / Re: Konzeption und Anfang
« am: 16. October 2009, 18:44 »
Hallo taljeth,


Zitat
Sie sahen: Einführung in die objektorientierte Programmierung mit C, Teil 1. Alle Klarheiten beseitigt? :wink:
Cool, jetzt fehlt nur noch Mehrfachvererbung und Exception-Handling!  :-D

Aber mal im Ernst, dieses Thema könnte man sicher gut in ein Tutorial verpacken um zu zeigen wie man in C einfache Interfaces implementiert hinter dehnen sich verschiedene Implementierungen verstecken können.


Grüße
Erik
1249
Lowlevel-Coding / Re: Verständnis Frage GDT
« am: 15. October 2009, 12:28 »
Hallo,


Ja, Du hast das richtig verstanden.


Mit den paar GDT-Einträgen hebelt man die Segmentierung aus so als währe sie nicht vorhanden. Die Segmentregister musst Du aber trotzdem an einigen Stellen, insbesondere in Interrupt/Exception-Handlern, mitschleifen. Segmentierung, in der Form wie sie der 386-PM bietet, gibt es sonst bei keiner Plattform so das ein OS das auf mehreren Plattformen laufen will diese nicht benutzen kann. Stattdessen benutzt man die überall (also auf allen Plattformen die mehr als simple Embedded-Mikro-Controller sein wollen) vorhandenen Paging-Mechanismen.

Ich persönlich entwickle an einer komplett neuen Plattform die voll auf Segmentierung setzt (nur das ich einige Probleme der Segmentierung des 386 besser lösen will) aber dafür gibt es nirgends Unterstützung (weil sich einfach niemand damit auskennt) und so ist das ein sehr schwerer Weg. Du kannst sicher versuchen für den 386-PM ein OS mit Segmentierung zu entwickeln aber ich rate davon ab da Dir wirklich niemand dabei helfen kann.


Grüße
Erik
1250
Lowlevel-Coding / Re: Verständnis Frage GDT
« am: 14. October 2009, 21:01 »
Hallo,


Zitat
Aber ich dachte, dass wird dazu benutzt, dass ein Programm nur in seinem eigenem Speicher schreiben kann...
Dazu gibt man üblicherweise jedem Process seinen eigenen linearen Adressraum, einen eigenen Page-Table-Baum, von 4 GB (auf einem 64Bit-System natürlich 2**64 Bytes) in dem aber nur wenig Speicher, nur so viel wie auch benötigt, tatsächlich vorhanden (P-Bit im entsprechenden Page-Table-Eintrag gesetzt) ist. Zusätzlich muss noch der Kernel-Bereich in jeden Process-Adressraum identisch eingeblendet werden.

Mann kann das Ganze auch mit Segmentierung erledigen, dann braucht man aber pro Process mehrere Segmente weshalb man dafür am besten für jeden Process eine eigene LDT einrichtet und so in der GDT nur einen Eintrag pro Process benötigt, den für die LDT. Das Konzept bietet ein Paar Vorteile hat aber auch einige negativen Seiten, z.B. FAR-Pointer. Siehe dazu http://lowlevel.brainsware.org/forum/index.php?topic=2224.0:-D


Grüße
Erik
1251
Das Wiki / Re: Umstrukturierung des Forums
« am: 12. October 2009, 12:50 »
Hallo,


ich finde die Idee einer dezenten Umstrukturierung sehr gut.


Mir ist aufgefallen das im Board "Lowlevel-Coding" ne Menge "Anfängerfragen", die sich eher mit allgemeiner Programmierung im Umfeld der OS-Entwicklung befassen, drin sind. Ich denke das liegt daran das es kein Board "Allgemeine Programmierung" o.ä. gibt. Dieses Board sollte unter anderem für Anfängerfragen die richtige Anlaufstelle sein. Natürlich sollten auch fortgeschrittenere Fragestellungen, die nur sekundär mit OS-Entwicklung zu tun haben, und deshalb in die beiden Haupt-Boards ("Lowlevel-Coding" und "OS Design") nicht richtig passen, dort einen Platz finden.

Ob genügend Traffic für ein eigenes Boot-Loader-Board zusammenkommt beurteile ich eher skeptisch, sorry ehenkes. Ich denke die meisten befolgen den Rat "Nimm GRUB" einfach um nicht noch eine Baustelle zu bekommen. Ein Boot-Loader für x86 ist eine sehr komplexe Angelegenheit, schon weil eine Unmenge an alten Macken (RM usw.) seit Jahrzehnten durch die ganze Plattform mitschleppt werden. Ich hoffe wirklich das bald UEFI kommt. Ansonsten sind IMHO Boot-Loader-Fragen in "Lowlevel-Coding" gut aufgehoben. Fragen wie man z.B. einen Kernel samt unzähliger Module passend im Speicher ablegt und dieses so aufbereitet das der Kernel damit was anfangen kann sind IMHO eher Design-Fragen und sollten daher nach "OS Design".


Nur so meine Ansichten zum Thema.


Grüße
Erik


PS.:
Das mit den "Anfängerfragen" bitte nicht falsch verstehen. Die stören mich nicht, ich finde nur die meisten davon gehören nicht wirklich in "Lowlevel-Coding" und eigentlich auch nicht in eines der anderen vorhandenen Boards.
1252
OS-Design / Re: Speicher > 4GB
« am: 27. August 2009, 19:26 »
Hallo,


Zitat
... muss ich ja die Page Address Extension aktivieren, um alles nutzen zu können.
Ja, die Paging-Tabellen sind dann auch anders aufgebaut.

Unter Windows ab 2000 (bei XP u.s.w. zumindest in den Professional-Versionen) gibt es dafür einen Mapping-Mechanismus der dem alten EMS-System, aus DOS-Zeiten (Friede seiner segmentierten Seele!), sehr ähnlich ist. Damit kann sich ein Programm Häppchen-Weise Speicher aus einem zusätzlichen Task-eigenem Pool (der selber größer als 4GB sein kann) in seinen linearen Adress-Raum einblenden lassen. Der IIS von M$ ist eines der wenigen Programme die das benutzen. Wo im physischen Adress-Raum diese Speicher-Seiten liegen ist komplett egal. In der c't gabs dazu mal einen Artikel.

Die 4GB-Grenze pro Task lässt sich damit jedenfalls nicht überwinden, so wie EMS damals die 640kBytes auch nicht wirklich vergrößern konnte. Diese spezielle Fähigkeit der x86-Architektur (mir ist nicht bekannt das sowas auch andere Architekturen bieten würden) ist IMHO nur dann interessant wenn man mehrere speicherintensive Programme gleichzeitig laufen lassen möchte und man dafür insgesamt mehr als 4 GB physischen Speicher ausschöpfen will, dazu muss man auch nicht die bestehenden 32Bit-Programme modifizieren.

Wenn man selbst ein OS entwickelt für das es noch keine riesige Menge vorhandener Programme gibt zu denen man weiterhin kompatibel sein muss sollte man besser gleich auf echte 64Bit setzen.


Grüße
Erik
1253
OS-Design / Re: Idee zum Thema Prozessverwaltung
« am: 23. August 2009, 21:29 »
Hallo,


Zitat
sagen wir mal es beendet das programm, wenn 70% des Speichers verwendet werden.
Da sind meiner Meinung nach 2 Fehler drin. Erstens darf das OS nicht einfach eigenmächtig ein Programm beenden, es darf dem Programm aber den Zugang zu zusätzlichen Ressourcen verweigern (ein passender Error-Code als Rückgabe eines entsprechenden Sys-Calls währe da angebracht). Zweitens sind 30% Not-Reserve eindeutig zu viel, ich würde ca. 32MByte (für ein 64Bit-OS auf einem üppig ausgestattetem PC sicher auch 128MByte) vorschlagen.

Wenn ich mit ModelSim einen FPGA simuliere und das OS dem ganzen nach 2 Stunden mit 100% CPU-Last ein Ende bereitet nur weil die Simulation kurz vor Schluss noch mal zusätzlichen Speicher benötigt währe ich extrem sauer. Wenn das OS bei einer Speicheranforderung einfach einen Fehler zurückmeldet (also malloc() mit NULL zurückkommt) dann kann ModelSim passend reagieren (was es meines Wissens nach auch tut) und die letzten 2 Stunden Wartezeit waren wenigstens nicht ganz vergebens. Das beobachten der Programme und analysieren ihres Verhaltens fällt IMHO eher in den Aufgabenbereich von Antivirus-Programmen bzw. deren "Behavior-Analysis/Blocking-Tools".

Ein OS sollte dafür sorgen das jedes Programm einen fairen Zugang zu allen Ressourcen bekommt. Wenn ich 100 Programme starte sollte jedes davon 1/100 der CPU-Zeit bekommen und wenn 99 davon auf ein blockierendes Ereignis warten dann sollte das letzte auch die gesamte CPU bekommen können. Ob alle 100 Programme auch den benötigten Speicher bekommen ist eine andere Frage, hier gilt "wer zuerst kommt malt zuerst".

Im Detail ist das natürlich etwas komplexer, so sollte bei den 100 Programmen auch deren Priorität in die Verteilung der CPU-Zeit einfließen damit sich Hintergrund-Programme nicht zuviel genehmigen. Auch sollte der Scheduling-Algorithmus darauf achten das ein Task das sehr viele Threads startet nicht deshalb überproportional viel CPU-Zeit bekommt (wenn die anderen Tasks nur wenige oder gar nur einen Thread benutzen).


Grüße
Erik
1254
OS-Design / Re: Idee zum Thema Prozessverwaltung
« am: 22. August 2009, 19:32 »
Hallo,


Zitat
Es geht nicht darum direkt Alarm zu schlagen wenn ein Prozess mal 100% erzeugt.
Das hab auch ich nicht vorgeschlagen. Ich habe versucht einen Weg aufzuzeigen wie sich das OS verhalten könnte ohne das es selber mit dem User interagieren muss. Es soll "nur" dafür sorgen das der User immer mit seinem PC arbeiten kann.
Ich hab ne menge Programme die CPU und Speicher für ne ganze Weile voll beanspruchen und ich will bei keinem Programm gefragt werden ob es weitermachen darf. Ich will das ich den PC trotzdem benutzen kann wenn ich es möchte.
Wenn mein PC von einem Programm voll beansprucht wird und ich als Reaktion 50 Root-Shells starte dann friert der Rechner trotzdem ein weil die vielen Root-Shells die kleine Speicher-Not-Reserve voll auffressen und das OS kann da nichts dagegen tun. Wie sollte das OS auch erkennen das ich Blödsinn mache.

Der Bildschirm-Rechner von Windows bietet z.B. von selbst an seine aktuelle Rechnung abzubrechen wenn er zu lange braucht. Das ist sinnvoll aber mehr geht IMHO nicht.

Zitat
Ich konnte z.B. Warcraft 3 nicht mehr minimieren, der Taskmanager ist nicht aufgetaucht etc
Das der Taskmanager nicht kommt liegt daran das Dein Spiel in einen anderen Graphik-Modus geschaltet hat, damit kommt der Taskmanager nicht immer zurecht.

Zitat
In so Situationen fände ich sinnvoll wenn der Kernel Warcraft3 unterbricht ...
Wie soll der OS-Kernel so eine Situation erkennen?
Also ich möchte nicht bei einem Compiler-Lauf oder einer FPGA-Simulation vom OS gefragt werden ob alles rechtens ist, ich möchte nur das ich am PC auch was anderes machen kann wenn ich will.


Grüße
Erik
1255
OS-Design / Re: Idee zum Thema Prozessverwaltung
« am: 22. August 2009, 13:29 »
Hallo,


ich hab noch mal etwas über dieses Thema gegrübelt.


Tasks einfach nur eine begrenzte Nutzung der Ressource CPU-Zeit zu gewähren ist in der Tat keine gute Idee. Nicht nur Compiler würden darunter leiden, auch Media-Player benötigen (manchmal) die gesamte verfügbare CPU-Leistung um eine komplexe Szene flüssig auf den Monitor zu bringen und es gibt noch viele andere Fälle wo Programme die volle CPU-Leistung benötigen und der User das auch erstmal so möchte. Vielmehr geht es darum das der PC immer für den User benutzbar bleibt. Mit "benutzbar" meine ich das "wichtige" Programme gestartet werden können und auch noch in der Lage sind den PC zu beeinflussen. Hier müsste man im Vorfeld definieren welche diese wichtigen Programme sind. Eine Shell und alles was in /sbin liegt kann wohl als "wichtig" gelten der Rest eben nicht. Trotzdem sollte ein normales Programm das mehr will als eine bestimmte Schwelle erlaubt dafür etwas oder in mehreren Stufen herab gestuft werden. Wenn nichts anderes nebenher läuft bekommt der Compiler oder Media-Player trotzdem alle verfügbare CPU-Leistung aber es ist eben auch möglich das sie für "wichtige" Programme platz machen. Im Gegenzug für die höheren Privilegien welche die wichtigen Programme bekommen (möglicherweise unabhängig vom User in dessen Kontext sie laufen) muss man aber auch erwarten das deren Programmierer besondere Sorgfalt auf den schonenden Umgang mit Ressourcen legen.

Ob man das alles nur Root erlauben möchte sollte man sich gut überlegen. Es währe schön wenn auch ein normaler User zumindest die Möglichkeit hätte eigene Programme zu killen wenn diese Amok laufen. Deshalb bin ich dafür den Kreis der "wichtigen" Programme vorher zu definieren, als zusätzliche Sicherheit könnte man da ja eine digitale Signatur benutzen damit der OS-Kernel die wichtigen Programme erkennt und auch kein Virus oder böser User das Konzept einfach umgehen kann.

Ein weiterer Punkt sind die Dienste/Services die wichtige Basis-Funktionalitäten anbieten. Als Beispiel möchte ich mal den IP-Stack benutzen. Dieser ist sehr wichtig und sollte immer "benötigte" Ressourcen bekommen andererseits ist er von außen angreifbar (wenn IPv6 kommt hängt ja wieder jeder private PC direkt im Internet ohne einen NAT-Router o.ä. dazwischen) und sollte sich von daher selber beschränken können. Auch hier ist wieder ein möglichst einfaches aber wirkungsvolles Regelwerk erforderlich das dem IP-Stack sagt was dem User wichtig ist und wofür er sich auch in engen Verhältnissen noch weitere Ressourcen genehmigen darf bzw. welche Dinge weniger wichtig sind und nur dann ausgeführt werden sollen wenn ausreichend Kapazitäten verfügbar sind. Auf einem File-Server wird man das sicherlich anders definieren als auf einem einfachen Surf-PC.

Beim RAM würde ich schon mit einer simplen Quota arbeiten wollen, über eines gewisse Schwelle hinaus bekommen nur noch die "wichtigen" Programme weiteren Speicher zugeteilt. Im Falle des IP-Stack z.B. sollten eben diese Programme möglichst nur dann dieses Privileg beanspruchen wenn es der Erfüllung einer wichtigen Aufgabe dient.

Schlussendlich bin ich der Meinung das das ein komplexes Thema ist dem man schon in der Konzept-Phase (fürs OS und dessen Basis-Funktionalitäten) entsprechende Aufmerksamkeit widmen sollte (falls einem dieses Thema wichtig ist).


So jetzt habe ich das Wort "wichtig" oft genug benutzt und es würde mich freuen wenn Ihr meine Gedanken mal analysiert/kritisiert.


Grüße
Erik
1256
OS-Design / Re: Idee zum Thema Prozessverwaltung
« am: 19. August 2009, 08:43 »
Hallo,


nützlich währe es IMHO wenn ein Prozess der mehr CPU-Leistung benötigt automatisch eine niedrigere Priorität bekommt. Also quasi ein Faktor der umgekehrt proportional zu seiner CPU-Last ist auf die eingestellte Basis-Priorität draufgerechnet wird.
Das würde sicherstellen das der PC benutzbar bleibt.

Was auch nicht schlecht währe wenn der Scheduler den CPU-Fraß pro Prozess begrenzen kann, z.B. auf 50%. Dafür könnte es natürlich spezielle User gesetzte Ausnahmen geben die dann aber zwingend mit einer niedrigen Priorität einher gehen.

Den Speicherfraß zu begrenzen halte ich nicht für sehr sinnvoll, das einzigste was mir da vorschwebt währe das es eine Obergrenze (z.B. 90%) an insgesamt zugeteiltem Speicher gibt nach deren überschreiten nur noch Programme mit Root-Rechten weiteren Speicher bekommen sowas wie die Quotas auf einem Dateisystem.

Es geht doch im wesentlichen darum das man ein System auch in Ausnahme-Situationen wenigstens noch geordnet runterfahren kann oder man zumindest eine Root-Konsole bekommt um ein Amok laufendes Programm zu beenden.


Grüße
Erik
1257
OS-Design / Re: OS für Plattform mit Segmentierung
« am: 18. August 2009, 21:17 »
Hallo,


Zitat
Adresse beginnt immer bei 0x00
Der virtuelle Adress-Raum, im Flat-Model, beginnt zwar bei 0 aber die 0-te Page lässt man für gewöhnlich ungemappt damit ein NULL-Pointer eine Exception wirft.

Zitat
das OS gibt vor wo der Code anfängt
ja, das stimmt, kann man übrigens auch bei Segmentierung so machen

Zitat
das Programm muss sich selbst kümmern ob das sich Stack, Code und Daten nicht in die Quere kommen.
Der Linker markiert das im Executable-File als Sektionen so das diese Unterscheidung der Executable-Loader  vom OS passend treffen kann, der verteilt dann alles vernünftig im virtuellem Adress-Raum vom neu zu erstellendem Task.

Zitat
jede Änderung des Limits kann nur das OS über Systemaufrufe
jeder Zugriff außerhalb des Speicherlimits muss eine Exception werfen
Im Flat-Memory-Model gibt es kein Limit. Es gibt nur ungemappte bzw. unberechtigte (z.B. Kernel-Space) Bereiche im linearen Adress-Raum eines Task.

Zitat
Wenn nun dieser Speicher im Hitergrund in mehrere Pages zerteilt ist das erstmal egal.
Davon merkt das User-Task ja gar nichts.

Zitat
Sind aber nun mit diesen Seiten mit unterschiedlichen Attributen verknüpft (NoeXecute, ReadOnly) so ist das ziemlich merkwürdig.
Das ist nicht "merkwürdig" sondern der einzigste Weg wenigstens ein bisschen Sicherheit innerhalb eines Task zu etablieren. Die Task untereinander können sich ja aufgrund der unterschiedlichen Adress-Räume eh nicht in die Quere kommen.
Diese Page-Attribute werden anhand der Sektions-Eigenschaften aus dem Executable-File passend gesetzt, sind also etwas was Compiler bzw. Linker direkt beeinflussen können.


Zitat
jedes Segment  beginnt auch bei 0x00
Beim 386-PM ja, deshalb kann man dort die Null-Pointer-Exception nicht so zuverlässig implementieren. Auf meiner Zielplatform gibt es für jedes Segment nicht nur ein individuelles Limit sondern auch ein kleines individuelles Minimum, damit werden zwar in jedem Segment ein paar (wenige) Bytes verschwendet aber dafür gibts zuverlässige Null-Pointer-Exceptions.

Zitat
jedes Segment soll keine Überlappung in ein anderes Segment haben
Richtig. Es gibt aber ein paar Ausnahmen, z.B. muss ein Debugger für das Code-Segment seines Client-Programms ein Alias-Daten-Segment (mit der selben Basis und dem selben Limit) erstellen damit er überhaupt den Programm-Code sieht (sonst gäbe es keine Disassembler-Ansicht) da das Code-Segment ja Executable-Only ist (also nicht lesbar und erst recht nicht schreibbar). Aber Teil-Überlappungen, so wie im 8086-RM, soll es aber definitiv nicht geben.

Zitat
Zugriffe außerhalb der Segmente müssen auch dann eine Exception werfen wenn sie in einem anderen gültigen Segment landen
Was genau meinst du damit?
Das User-Task weis nicht wo seine Segmente im linearen Adress-Raum liegen (das kann sich sogar mit der Zeit ändern) also gibt es keine Beziehungen der Segmente untereinander. Die CPU selber wird jedenfalls nicht prüfen ob ein Offset das aus einem Segment raus ragt in ein anderes rein fällt.

Zitat
far-Pointer sind eigentlich nicht nötig
Irgendwie muss ja ein allgemein geltendes Stück Programm-Code einem Pointer ansehen welches Segment gemeint ist. Dazu dient der Selector-Teil in einem FAR-Pointer.

Zitat
sondern nur Segment-Override-Präfixe
Dafür gibt es nicht genügend Segment-Register, auf keiner CPU. Ein Task benötigt eine ganze Reihe an Segmenten. Schau die mal die Menge an Sektionen in einem typischen Executable-File an.


Zitat
Für beide Modelle muss gelten das der schreibende Zugriff auf die Deskriptoren eine Exception wirft
Auch bei Lese-Zugriffen sollte eine Exception kommen, sonst könnte ja ein Programm die Internas von anderen Programmen, oder gar dem OS, ausspionieren.


Zitat
Und was hindert uns als OS-Designer daran beide Modelle im fertigen OS anzubieten.
Auf einem vorhandenen Flat-Memory-OS ein segmentiertes Programm laufen zu lassen stelle ich mir quasi unmöglich vor. Umgedreht sollte es gehen auch wenn es einiges an Arbeit kostet und natürlich alle Vorteile der Segmentierung wegfallen, wenn das OS dann noch das Paging ausschaltet (weil nicht benötigt) dann sind alle Schutzmechanismen weg und das Flat-Memory-Task läuft noch unsicherer als auf dem primitivsten Flat-Memory-OS.
Wenn Du wirklich ein OS für beide Memory-Modelle entwickeln möchtest dann nur zu, ich würde mich über Source-Code (natürlich nur zum inspirieren lassen) sehr freuen.


Grüße
Erik
1258
OS-Design / Re: OS für Plattform mit Segmentierung
« am: 17. August 2009, 13:24 »
Hallo,


Zitat
Segmentierung, so wie ich sie kenne, (C166 / 8086) ....
Ja, das glaube ich gern.
Kaum jemand hat sich wohl je mit den tollen Möglichkeiten beschäftigt die der PM des 286/386 bieten sollte. Im 286 ist natürlich noch die 64k-Grenze drin (die möchte ich heute auch nicht mehr haben) aber konzeptionell war der ganze PM schon sehr fortschrittlich und wurde dann im 386 mit echten 32Bit-Adressen und dem Paging komplettiert.


Zitat
Bei 32 bit. ist das normalerweise fast nicht mehr notwendig.
Natürlich gibt es ein paar Vorteile wenn man den gesamten erreichbaren Speicher mit einem "simplen" (NEAR-)Pointer erreichen kann aber es gibt eben auch ein paar Vorteile das mit einem "komplexen" (FAR-)Pointer zu machen.


Zitat
Bei aktuellen 80X386 CPUs gibt es ja die SegmentSelectoren.
Ohne das damit je was vernünftiges gemacht wurde. :-( So hatten sich die Intel-CPU-Ingenieure damals das sicher nicht vorgestellt.
Zitat
Die aber meines wiessens wieder auf einen gemeinsamen virtuellen 32Bit Addressraum zeigen.
Das machen die OS-Coder absichtlich so um damit die Segmentierung komplett auszuhebeln so als währe sie nicht da.
Ich hab mir damals (vor über 15 Jahren) ein Buch über die System-Programmierung des 386 gekauft und der Autor hat über den virtuellen (segmentierten) Adress-Raum des 386-PM regelrecht geschwärmt, angeblich unglaubliche 64TByte (also einfach 4GByte * 16384 Segmente, da ja GDT und LDT zusammen so viele fassen). Der Autor ist wohl davon ausgegangen das jemand ernsthaft versuchen würde Segmentweise zu swappen, ist zwar theoretisch möglich aber in der Praxis völliger Schwachsinn da man ja eigentlich immer mehrere Segmente (mindestens Code, Daten und Stack + OS-Kram) gleichzeitig benötigt. Ein paar Kapitel später wurde dann sehr bodenständig erklärt wie man mit dem Paging beengte Verhältnisse im physischen RAM umgeht und bei diesen Erklärungen lagen auch immer alle Segmente in einem linearen Adress-Raum.


Zitat
(Code, Stack, Data zusammen dürfen nicht mehr als 4gb belegen)
In meinem Konzept dürfen alle Tasks (und das OS) zusammen nicht über die 4GByte (zumindest in der 32Bit-Variante) hinaus wachsen da sie alle in einem einzigen linearen Adress-Raum liegen der, bei Bedarf mit Hilfe des Paging, größer sein kann als physischer RAM existiert. Ich sehe in dieser Beschränkung auch erstmal keine Probleme, mein Entwicklungsrechner z.B. kommt mit seinen physischen 1,5GByte auch aus ohne zu swappen trotz KDE usw. Spätestens auf einer vollwertigen 64Bit-Plattform ist dann auf absehbare Zeit ein gemeinsamer linearer Adress-Raum kein Problem mehr.


Grüße
Erik
1259
OS-Design / Re: OS für Plattform mit Segmentierung
« am: 15. August 2009, 14:20 »
Hallo Termite,


Zitat
aber auf gewissen hw achritekturen, gerade im embedded bereich, gibt es gewisse hw seitige enschränkungen, die dynamisch wachsende Task stacks nicht ermöglichen.
Ich persönlich bin der Meinung das das eher eine konzeptionelle Einschränkung ist. Wenn in dem einem Adress-Raum einer Task bereits dort irgendwas liegt wo ein Stack gerne hinwachsen möchte dann geht das eben nicht. Bei Segmentierung existiert das Problem nicht, die einzelnen Segmente einer Task sind, aus Sicht des Task selber, unabhängig von einander. Die Segmente haben keinen Bezug zueinander. Jedes Segment kann prinzipiell seine Größe ändern, natürlich wird das OS dem bestimmte Grenzen auferlegen, das Code-Segment z.B. wird das OS bestimmt nicht ohne triftigen Grund verändern.

Zitat
beim PC wird eine Ausnahme geworfen, wenn der Stack überläuft/ bzw auf Virtuelle Addresen zugegriffen wird für die kein Mapping existiert. ...
Das wird IMHO auf allen Plattformen, die das Paging für die Speicherverwaltung benutzen, so gemacht. Hindert das User-Space-Programm trotzdem nicht daran über eine ungemappte Lücke hinweg zu springen.

Zitat
und einfach irgend was durch die gegendschieben z.B. ganze Segmente geht auch nicht immer
Warum nicht? Das Task selber benutzt nur absolute Adressen, jede für das Task erreichbare Speicherstelle ist mit Segment:Offset eineindeutig adressierbar. Wo die Segmente im linearen Adress-Raum, oder gar im physischen Adress-Raum, liegen weis das Task nicht und genau deshalb kann das OS da schieben was es will, mit etwas Geschick sogar während das betreffende Task läuft.

Zitat
dann funktioniert das nur solang dein Programm nicht über eine Segment grenze hinweg springen muss.
Was genau meinst Du damit?
Die Daten eines Task verteilen sich über mehrere Segmente (Code, Constanten, Daten, Heap, (mehrere) Stacks und sonstiges) und jedes Segment hat eine bestimmte Größe, wenn der Code versucht ein Offset oberhalb eines Segment-Limits (oder kleiner 0) zu lesen/schreiben gibts ne Exception.

Zitat
Im embedded bereich wird normalerweise die Stacksize jeder Task zur designzeit definiert ...
Weis ich, ich hab lange im Embedded-Bereich programmiert (beruflich und privat). Im PC-Bereich wird das aber nicht gemacht. Stell Dir vor Windows würde nur 1MByte Stack erlauben. Ich kenne einige Programme die damit ein Problem hätten.


Zitat
welches FPGA willst du eigentlich einsetzen
Wahrscheinlich Spartan 6, ich möchte die einzelnen Componenten gerne mit den High-Speed-Transceivers verbinden. Ich würde gerne den Virtex 6 einsetzen aber das sprengt mein Budget.

Zitat
müsste eine 16 Bit cpu sein, da sonst die segmentierung wenig sinn machen würde.
Wieso macht Segmentierung bei einem 32/64Bit-System keinen Sinn?
Mein System wird es in beiden Varianten geben, mit identischen Segmentierungs-Fähigkeiten, und ich möchte auf jeden Fall eine PU (Paging-Unit, ich nenne das absichtlich nicht MMU) einbauen, damit kann man an einigen Stellen etwas tiefer in die Trickkiste greifen (Beispiele hab ich ja schon ein paar genannt) und vor allem swappen.


Grüße
Erik
1260
OS-Design / Re: OS für Plattform mit Segmentierung
« am: 15. August 2009, 11:05 »
Hallo,


Zitat
man kann ja speicher zwischendrin ungemappt lassen
Ahja, reicht das als Sicherheitsmaßnahme gegen einen Stackoverflow wirklich aus?
Nehmen wir mal an man würde die Stacks an 0xBFFFFF00, 0xBEFFFF00 und 0xBDFFFF00 (32Bit OS) jewails nach unten wachsen lassen, also alle 16MByte einen Stack. Die Pages an  0xBF000000, 0xBE000000 und 0xBD000000 jeweils ungemappt lassen. Wenn dann der mittlere Thread (also der Thread dem der mittlere Stack gehört) eine Funktion wie die folgende aufruft
void foo()
{
  int z;
  char test[16777216];

  z = 1234567;
}
dann währe die 1234567 im Stack eines anderen Thread gelandet und niemand hätte das bemerkt. Eventuell müsste man die Deklaration von z und test vertauschen damit z an der kleineren Adresse steht aber prinzipiell sollte diese Untat funktionieren, oder hab ich da was übersehen?
Das mit den ungemappten Lücken, zwischen den Stacks, wirkt ja nur wenn da auch jemand drauf zugreift. Niemand hindert das User-Space-Programm am überspringen dieser Lücke.

Was passiert eigentlich wenn ein Thread berechtigt mehr Stack benötigt, also auf so eine ungemappte Lücke zugreift? Wird dann einfach der komplette Task gekillt?
Das OS kann ja nicht entscheiden ob da ein böser Programmierer, eine fehlerhafte Endlos-Rekursion oder einfach ganz normaler Stackverbrauch vorliegt.


Grüße
Erik
Seiten: 1 ... 61 62 [63] 64

Einloggen