OS Coden, wie gehe ich vor?
-
Hi,
ja ich weiß, dieses Thema kann man singen aber ich hab ein paar konkrete Fragen:
1. GCC und TASM ist das gut für ein OS coden in C++?
2. Wieso sollte man PM nehmen anstatt RM? Und wieso funzen die Bios-Interrupts net im PM?
3. Wie soll man vorgehen? So:- kleinen Kernel schreiben und bootloader -> auf Diskette damit zum Testen
- RM oder PM schreiben
- zusatzfunktionen für PM schreiben wenn nötig
- VideoModus wechseln
- Inputabfrage
(Reicht das? oder ist der Ansatz total falsch? Wenn ja, was kann man besser machen?)
4. Gibt es OpenSource OS (UNIX oder DOS-Linke in C++ und Assembler) wenn ja, wo?
5. kann man per OS coden am Meisten über den PC lernen und Assembler?
6. Eigenes File-System oder sowas wie FAT oder NTFS?
7. Kann man beim OS Coden aus C++ die SingleTons benutzen und class? Wenn nein: Wieso?
8. Wie kann man das OS testen ohne es ständig auf ne Disk zu kopieren und zu booten?
9. Was ist der Unterschied zwischen einem 16Bit OS und einem 32Bit OS? Wie macht man ein 32Bit OS oder sogar ein 64Bit OS?
Bitte Jammert nicht direkt rum: Schau ins FAQ und so, denn diese Fragen sind mir dort nicht so besonders erklärt bzw. nicht konkret genug
Schon mal danke im Voraus!
-
Original erstellt von <OS-Coder>:
**1. GCC und TASM ist das gut für ein OS coden in C++?
**GCC auf jeden Fall, bei TASM weiß ich nicht ob der 32-Bit-kompatible, gut zu linkende Files erstellt. Wenn ja, dann ists okay, ansonsten müsstest du dda einen anderen ASM nehmen. Im prinzip braucht man die Dinger sowieso nur für Startup-Code.
**
2. Wieso sollte man PM nehmen anstatt RM? Und wieso funzen die Bios-Interrupts net im PM?
**Weil du im RM:
- dich mit ner Menge fitzelkleiner Segmente rumschlagen musst
- keine Möglichkeit hast, den Kernel vor den Userprogrammen zu schützen
- nur auf 1MB Speicher zugreifen kannst
Die BIOS-Interruptroutinen benötigen das Layout und die Zugriffsmöglichkeiten, die die RM-Segmente bieten. Das ganze Konzept wird aber ja gerade vom PM gekippt da es wirklcih unzulänglich ist. Deswegen muss man im PM alles selber machen**
3. Wie soll man vorgehen? So:- kleinen Kernel schreiben und bootloader -> auf Diskette damit zum Testen
- RM oder PM schreiben
- zusatzfunktionen für PM schreiben wenn nötig
- VideoModus wechseln
- Inputabfrage
(Reicht das? oder ist der Ansatz total falsch? Wenn ja, was kann man besser machen?)
**
Falsch ist der Ansatz nicht, nur man müsste ein bisschen detaillter vorgehen:
zu 1) den Bootloadder kannst du dir schnken, wenn du GRUB benutzen willst. Ansonsten viel Spaß mit der Floppy
Zwischen 2 und 3 irgendwo steht der Kern des Betriebssystems. Du mussst ja Speicher verwalten, wenn du willst Prozesse aufbauen, die internen Strukturen aufbauen, eventuell ein bisschen Treibercode für Floppy/Diskette haben.
zu 4) Über Grafik würde ich an deiner Stelle nachdenken, wenn du eine Textmode-Basis hast, so dass z.B. eine kleine Shell oder so darauf läuft. Mit Grafikmodus machst du es dir sonst frühzeitig zu kompliziert.**
4. Gibt es OpenSource OS (UNIX oder DOS-Linke in C++ und Assembler) wenn ja, wo?
**Reihenweise.
Unix-Like (PM, 32-Bit, Schutzkonzepte):
- Linux (www.kernel.org viel Spaß beim lesen ;))
- Minix (http://www.cs.vu.nl/~ast/getting_minix.html)
- ...
DOS-Like (RM, 16-Bit, kaum/keine Schutzkonzepte)
- FreeDOS (freedos.sf.net)**
5. kann man per OS coden am Meisten über den PC lernen und Assembler?
**Das hägnt davon ab was du "den PC" nennst. Du lernst auf jeden Fall sehr viel über Hardware, wie man mit ihr spricht. Außerdem kommst du nicht dran vorbei dich mit Speicherverwaltung, und -schutzkonzepten zu befassen (vor allem nicht, wenn du im PM arbeitst). Über Assembler lernt man zwangsläufig einiges, wile man ja shcon einen kleinen Teil darin schreiben muss, was du sichelrich nicht lernst, ist wie man mit MMX/SSE arbeitet, denn daqs braucht man in einem OS nicht wirklich. Auf jeden Fall finde ich (ja, baue auch eines
) dass man sehr viel von den Dingen "hinetr den Kulissen" lernt. Ich werde es möglicherweise alles nie gebrauchen aber mit ein bisschen Spaß hat man trotzdem viel davon.
**
6. Eigenes File-System oder sowas wie FAT oder NTFS?
**Da gibt es sehr gespaltene Meinungen drüber. Ich persönlich finde, man sollte in einem OS imemr mit FAT anfangen, das ist ein einfaches Format was man auch auf eine Diskette bringen kann. Außerdem kann man gut zwischen dem Arbeitsrechner und der Testplattform Daten austauschen, weil jedes Windows/Linux ja auch FAT unterstützt. Von NTFS soltle man die Finger lassen, selbst die Linuxer haben da noch nichts schaffen können, was man bedenkenlos auf seine Daten loslassen kann, denn Microsoft dokumentiert dieses Format nicht offiziell. Ein Eigenes FS halte ich gerade ind er Anfangsphase für ein bisschen hinderlich, üebr sowas kann man immernoch nachdenken, wenn der Kernel komplett läuft.
**
7. Kann man beim OS Coden aus C++ die SingleTons benutzen und class? Wenn nein: Wieso?
**Man kann, aber nur mit zusatzaufwand. Normalerweise übernehmen Startup-Routinen das Initialisieren von Klassen, Runtime-Type-Infos etc. Ein eigenes OS muss diese Fähigkeiten natürlich erst einprogrammiert bekommen. Deswegen schreibt man meistens ein OS in C.
8. Wie kann man das OS testen ohne es ständig auf ne Disk zu kopieren und zu booten?
Ich empfehle da ganz massiv Bochs (bochs.sf.net). Es ist ein PC-Emulator der zugegeben nicht ganz schnell läuft aber recht ausführliche Infos darüber verrät, wenn gerade in der Anfangsphase etwas schief geht. Außerdem kann man den integrierten Debugger benutzen um an einer beliebigen Stelle anzuhalten und nachzugucken was hier und da im Speicher steht. Die Disketten kann man dann auch gut weglassen, weil Bochs auch Disketten-Images frisst. Mein Makefile für mein OS z.B. kompiliert alles und kopiert dann alle nötigen files in ein Diskettenimage. Bochs benutzt dieses dann um zu starten, eine ideale Testumgebung.
9. Was ist der Unterschied zwischen einem 16Bit OS und einem 32Bit OS? Wie macht man ein 32Bit OS oder sogar ein 64Bit OS?
Ein 16-Bit-OS führt (quasi) nur 16-Bit-Code aus, arbeitet demnach auch z.B. mit 64k Speicherraum. Heutzutage führt das zwangsläufig dazu, dass man viele Segmente benutzt weil 64k wirklcih nicht viel sind. Würde ich persönlich nicht empfehlen
32-Bit-OS führen 32-Bit-Code aus, nutzen Schutzkonzepte etc. Der Adressraum liegt dann bei 4GB die wohl fürs erste reichen sollten. Ein 64-Bit-OS ist dann ganz grob gesagt genau aufgebaut wie ein 32-Bit-OS, nur dass es auf einem 64-Bit-Prozessor kompiliert ist und dort auch läuft. Es muss natürlich für die geänderten Speicherraumverhältnisse Sorge getragen werden, aber das ist der größte Unterschied.
Also, wenn dich das nicht abgeschreckt hat, willkommen bei den OS-Codern
Man lernt auf jeden Fall viel (muss man auch ;)) und ich persönlich habe auch meinen Spaß daran.
-
- Den ersten Linux-Kernel kannst du auch gut zum lernen benutzen, weil der insgesamt noch nicht so groß ist und einigermaßen überschaubar ist ftp://ftp.kernel.org/pub/linux/kernel/Historic/linux-0.01.tar.gz
An Büchern kann ich dir momentan empfehlen
Tanenbaum: Modern Operating Systems ( allgemein gehaltene Theorie über OS )
Tanenbaum: Operating Systems, Design and Implementation ( erklärt den Minix Code)
Bovet & Cesati: Understanding the linux Kernel ( nimmt den 2.4.xx Kernel auseinander)
-
Hi,
@TriPhoenix:
also das hier würde nicht klappen??class CKernel { public: ~CKernel (void); static CKernel &getInstance (void) { return (m_Instance); } int init (int argv, char *argc[]); int run (void); private: CKernel (void); static CKernel m_Instance; }; // [...] int main (int argv, char *argc[]) { CKernel Kernel = CKernel::getInstance(); return (Kernel.init(argv, argc)); }
weil du sagtest etwas von einem "zusatzaufwand" und so.
Dann hab ich noch ne Frage zum Linuxkernel (THX @geyken), gibbet dazu freie Papers im netz oder ne Anleitung? Mit Readme siehts da ja schlecht aus. Gibbet auch noch Tutorials zum PM, also wie man Funktionen codet ala printf und so?
@geyken:
THX für die URL. Welches FileSystem benutzt linux? Und gibbet zum Kernel noch Infos?
-
Original erstellt von <OS-Coder>:
**
@TriPhoenix:
also das hier würde nicht klappen??
**Ich _vermute_ nein, denn die Initialisierung müsste vom Kernel selber erst aufgerufen werden. Aber ich bin in C++-Kernel-Problem nicht so der Experte, aber http://my.execpc.com/~geezer/osd/cpp/index.htm hilft dir da definitiv weiter. Mein Fazit war bisher, dass es zuviel Aufwand ist und ich dafür auf die Klassen vorerst verzichten kann.
**
Dann hab ich noch ne Frage zum Linuxkernel (THX @geyken), gibbet dazu freie Papers im netz oder ne Anleitung? Mit Readme siehts da ja schlecht aus.
****
Gibbet auch noch Tutorials zum PM, also wie man Funktionen codet ala printf und so?**Na das sind ja shcon irgendwo zwei verschiedene Dinge, der PM und ein printf. Für PM-Tutorials schau mal in die FAQ, da sollte ien Haufen links sein. Für printf & co. schau dir mal auf http://my.execpc.com/~geezer/osd/index.htm die Sektionen "Putting text on the screen" und "C library (libc)" an.
**
Welches FileSystem benutzt linux? Und gibbet zum Kernel noch Infos?**Linux benutzt wahlweise ext2, ext3 oder ReiserFS. Es unterstützt noch einen Haufen andere aber diese drei sind die Kerndateisysteme. Die absolut beste Info zum Kernel ist das Buch "Understanding the Linux Kernel" was geyken schon vorgeschlagen hat. Dort steht so ziemlich die ganze Funktionalität beschrieben und ich fand, man kontne viele Konzepte davon lernen (meinen Speicher-Allocator habe ich teilweise auf der Linux-Methodik basiert z.B.).
-
da hier viele leute an ihren os programmieren, wär vielleicht ein austausch von icq, msn, jabber oder was auch immer accounts praktisch.
mein zeug lautet:
mastamind@jabber.at
54419178
mastamind18@hotmail.com
mastamind@users.sourceforge.netvielleicht kann man auch links mit dem sourcecode austauschen... (gibt s bei uns noch nicht).
björn
-
erstmal noch ein paar links
die intel Dokus http://developer.intel.com/design/pentium4/manuals/
eventuell findest du hir noch ein paar freie Bücher zum linux kernel http://www.tldp.org/guides.htmlansonsten kann ich dir empfehlen, dich mich den intel büchern und einigen Seiten ausm FAQ erstmal durch den Linux Bootloader durchzubeissen, da lernt man schon recht viel und du kriegst schonmal einen kleinen überblick. Ein anderes freies OS, bei dem man leicht an den Code kommt ist auch GNU/Mach & GNU/Hurd. Bei http://www.freebsd.org haben sie übrigens auch noch interresante Artikel versteckt.
Das sollte eigentlich als beschäftigung für die nächsten Wochen reichen
Meine Sourcen findest du hier http://www.informatik.uni-oldenburg.de/~geyken/ die nächsten Schritte sind Paging und ein einfaches Memory Managment implementieren und dann beginnen mitm GCC rumzuspielen und die Files zum laufen zu bekommen
[ Dieser Beitrag wurde am 28.04.2003 um 20:40 Uhr von geyken editiert. ]
-
@TriPhoenix
Hi,danke für den Link den du mir gegeben hast! Da war dieser Link zu finden: http://www.invalidsoftware.net/os/
Was da gemacht wird sieht recht intressant aus, nun mal ne Frage an die Experten: Ist das was brauchbares oder einfach nur Bullshit
-
*push*
-
Sieht halbwegs solide aus. Nur beachte diese Punkte:
I assume that this is not your first attempt at writing a Kernel.
I assume you have already written a boot loader, or that you know how to use a standard one like GRUB. If you do use grub, you will need to add the necessary code to the assembler code below.
Insbesondere den zweiten.
Ansonsten wird da ganz gutd er nötige Zusatzaufwand in C++ erklärt und wie man ihn nun ausführt.
-
Also deine konkrete Einschätzung?
-Empfehlenswert
-Gut
-Schlecht
-Bullshit
-
Original erstellt von <OS-Coder>:
**Also deine konkrete Einschätzung?-Empfehlenswert
-Gut
-Schlecht
-Bullshit**Gut, sofern man ahnung hat, wie man das ganze geladen bekommt.
-
geht das net mit nem ganz normalen Bootloader?
also ich habs noch net so ganz durchgelesen.
-
Original erstellt von <OS-Coder>:
geht das net mit nem ganz normalen Bootloader?also ich habs noch net so ganz durchgelesen.
Was ist ein ganz normaler bootloader?
-
ja sagen wir mal, standard halt, so wie man sie im Netz überall findet oder hier mit der Suchfunktion
-
Nun so wies aussieht müssne die Kernels dieses Tutorials im Protected Mode landen und 4GB-Flat-Segmente haben. Das erfüllen viele Bootloader nicht. Die beste Wahl ist es vermutlich, mit GRUB zu arbeiten, was nicht allzuschwer ist.
-
hat der GRUB nen Sourcecode den man einsehen kann?
-
GRUB ist Open-Source. Zu finden unter: http://www.gnu.org/software/grub/
-
Aaaaah danke, auch noch für den GCC? geilo
Big THX