Diskussion:OS-Dev für Einsteiger

Aus Lowlevel
Wechseln zu: Navigation, Suche

Sagtmal, wieso is der Artikel eig. so hönisch geschrieben? Jaa, ii no, weil alle N00bs denken, "hey, ho, ich programmier mein eigenes OS. Wie sprech ich die Graphikkarte an?". Trotzdem, n bissl objektiver wär schön ;)

Wenn du was objektives haben willst, findest du hier genügend Artikel. "OS-Dev für Einsteiger" soll diese Artikel aber auch für Anfänger verbinden. Was nützen einem tausende Spezifikationen, wenn man nicht weiß was man damit anfangen soll. -- jgraef
Ich würde es nicht höhnisch nennen. Ich versuche nur, den Text nicht ganz so trocken zu schreiben. Und wenn ich gelegentlich anspreche, wie es eben gerade nicht geht, dann deswegen, weil schon es genug Leute falsch gemacht haben und ich Neulinge darauf hinweisen möchte, daß sie diese Probleme vermeiden können.
Davon abgesehen ist natürlich jede Mithilfe am Artikel erwünscht - ist ja offensichtlich, daß er noch unvollständig ist. --Taljeth 20:46, 19. Apr. 2008 (CEST)


Trocken sollte ein Artikel nicht sein, finde ich ebenso. Dennoch werden hier Windows-User echt verspotten, wie mit den Worten: Aber dazu braucht es schon eine gewisse masochistische Veranlagung. Ein Windows-User könnte ich das gleiche über Linux-User sagen.

  • Es ist sehr leicht sich eine Umgebung zu schaffen und das sogar mit Tools von Microsoft.
  • x86-Assembler ist unter Windows nicht viel anders als unter Linux. Die Frage ist nur, ob jeder mit AT&T-Assembler klar kommt??? Ich mag deren Variante nämlich nicht.

OK, ich will mich hier nicht austoben, sondern nur klarstellen, dass es unter Windows genauso leicht/schwer ist wie unter Linux und das es dort auch genug Tools gibt. Mein OS entwickle ich unter Windows mit MS-Tools (siehe AiCOS. Diesbezüglich würde ich dann gern meine Erfahrung für andere offenlegen, die doch gerne unter Windows programmieren wollen. -- ScollPi 17:30, 19. Jan. 2009 (CET)

be59 Also, um es mal klarzustellen. Diesen Artikel hab ich nicht geschrieben. Dass du diesen unter Windows entwickelst, ist einfach. Ab einem gewissen Punkt musst du diesen kompilieren. Und glaub mir, die Umgebung herzustellen, ist nicht einfach.(Erfahrungsbericht von mir selbst.) Mein Tipp, nicht Linux zu installieren, sodnern einfach Knoppix zu nehmen, ist ein guter Tipp, glaub mir.


ScollPi
be59 das weiß ich, lässt sich ja ganz einfach ermitteln. Außerdem wurde dieser ja schon ziemlich entschärft, daher mein allgemeines DANKE. be59, ich weiß leider nicht wie oder was du gemacht hast, aber ich hab sogesehen nichts derartiges kompliziertes. Warum sollte es unter Windows schwieriger sein? Das hätte ich gern einmal gewusst. Ein zweiter Punkt der mir ein wenig stört, warum wird zwanghaft Linux empfohlen? Warum soll man es denen verwehren die unter Windows entscheidend besser klar kommen als unter Linux? Ich sollte wohl mal doch erklären, wie man es sich so einfach wie möglich macht und das funktioniert garantiert, tut es bei mir nämlich auch. Die Zeit nehme ich mir mal. -- ScollPi 00:02, 20. Jan. 2009 (CET)

ScollPi, du bist auch noch nicht sehr weit bei deiner Entwicklung und du wirst sicher noch Momente haben, in denen du denken wirst Linux (wenn du es schonmal benutzt hast) wäre eine bessere Wahl gewesen. Es wird hier zwanghaft Linux empfohlen, weil man normalerweise immer das empfiehlt, was auch empfehlenswert ist. Die Leute hier, die schon lange an einem OS entwickeln, wissen, was für ein Aufwand es sein kann, unter Windows zu entwickeln und empfehlen daher Linux zu benutzen. Linux kann einem viel unnötigen Aufwand ersparen. Wir geben hier sowieso immer nur nichtbindende Empfehlungen. Du kannst sich auch ignorieren, aber rechne dann nicht mit weiterer Hilfe. Es ist ja so, dass man es umständlich machen darf, aber dann will dir halt auch niemand helfen. Die Leute die mit Windows besser klar kommen, sollen es benutzen, aber, wie eben erwähnt, dann nicht mit ihren Problemen ankommen und erwarten wir geben ihnen eine Lösung, die auf Windows zugeschnitten ist. Für uns ist die Lösung Linux. Wenn du einen guten Artikel über OSDev unter Windows schreiben kannst, dann ist ja gut ;)
Janosch Gräf


ScollPi
Das ist ja auch ein Wort. Dann schreib ich was dazu, wie man es am besten unter Windows macht. Im Gegenzug wäre es nett, wenn es jemand mal ausführlich erklärt, wie man es unter Linux richtig macht.

Unverzichtbar – Programmieren an sich

Es mag zwar sein, dass die Lowlevelmitglieder Programmieranfängern helfen, sich in die Programmierung ganz allgemein einzufinden, das Problem ist nur, dass wir dafür eigentlich nicht da sind. Deshalb finde ich es mindestens suboptimal, wenn wir genau solche Hilfe in diesem Artikel anbieten. Dass wir sie nicht explizit anbieten, heißt nicht, dass wir sie nicht leisten können. —Clici McXan 12:07, 14. Jul. 2010 (CEST)

Naja, da steht doch nur was von "Tutorials finden" - so weit kann man doch noch gehen, die gegebene Grundlage muss ja auch was taugen. Man müsste nur bei Fragen (sofern sie zum "Standardgebrauch" der Sprache gehören) eher abblocken, wenn das zu viel wird. --Stultus 14:41, 14. Jul. 2010 (CEST)
Ich habe ja nichts dagegen, solchen Fragen zu antworten, sondern nur, diese Hilfe ganz ausdrücklich anzubieten. —Clici McXan 17:03, 14. Jul. 2010 (CEST)
Ich bin zwar Grundsätzlich mit der Korrektur des betreffenden Satzes durch DickHuuhn einverstanden, natürlich helfen wir auch mal absoluten Anfängern, aber ich sehe das im wesentlichen wie XanClic. Hier, auf lowlevel.eu, geht es im wesentlichen um die Programmierung von Betriebssystemen (oder eventuell anderen hardwarenahen Dingen) und nicht darum jedes Problem von Programmieranfängern zu lösen. Hier steht auch ganz klar "Zielgruppe: Erfahrene Programmierer". Ich persönlich bin der Meinung der betreffende Satz im Artikel sollte gegen etwas in der Art "Wenn du erst einmal einen Einstieg in das Programmieren als solches suchst, dann schau mal hier oder dort vorbei." Da müssen natürlich mehr/bessere Links benutzt werden. --Erik.vikinger 15:37, 14. Jul. 2010 (CEST)
Das mit den Links ufert aber aus, da bräuchte man ja schon eine ganze Sammlung, und das erscheint mir auch nicht sinnvoll, das auf eine Extra-Seite auszulagern. Wir sind schließlich keine Seite für Anfänger. Ich will vor allem vermeiden, dass der Artikel zu arrogant klingen würde, wenn man einfach sagt: "Geh doch wo anders lernen". Ein Programmieranfänger (vermutlich noch sehr jung) googelt vielleicht nunmal nach "Betriebssystem schreiben" und findet dann uns. Ich denke, wenn man möglichst nett darauf hinweist, dass das nichts für ganz blutige Anfänger ist, und dann auch noch beim Einstieg hilft, dann ist die Wahrscheinlichkeit größer, dass man später zu uns zurückkommt, oder gar die ganze Zeit hier im Forum mitliest, bis man soweit ist. Daher dachte ich, dass der Hinweis aufs Forum am angebrachten ist, um kurz aber herzlich Hilfestellung zu geben, ohne im Artikel zu sehr auszuufern. Vielleicht lege ich mal testweise eine Seite für totale Anfänger an, falls man doch sowas im Wiki haben will. Kann man ja wieder löschen ;) --DickHuuhn 17:56, 14. Jul. 2010 (CEST)
Ich finde diese Idee sehr gut. Wer kümmert sich drum? --Programm Noob 18:56, 14. Jul. 2010 (CEST)

Wir können hier sicher noch ne Weile über die möglichst höfliche Formulierung von "Anfänger sollten erst mal das programmieren als solches lernen, das können/wollen wir nicht übernehmen, aber wenn Du Dich für ausreichend Qualifiziert für das Entwickeln eines eigenen OS fühlst dann bist Du uns immer sehr willkommen." streiten, aber viel wichtiger wäre es wenn wir erst mal klären würden wie viel Hilfe für Programmieranfänger wir hier, Forum und Wiki, überhaupt geben können/wollen. Klar wollen wir niemanden wegschicken oder vergraulen aber für die spezifischen Probleme echter Programmieranfänger gibt es sicher bessere Seiten im Internet. Ich bitte daher einfach mal darum das sich dazu möglichst viele Leute (vor allem die Regulars) zu diesem Thema konkret äußern! --Erik.vikinger 11:49, 15. Jul. 2010 (CEST)

Soweit ich das gestern im IRC mit DickHuuhn verstanden habe, haben wir uns darauf geeinigt, dass es wohl ganz gut wäre, wenn man die Literatur-Seite um ein paar Links/Bücher für Programmieranfänger erweitert und dann in diesem Artikel darauf verweist (Einspruch, wenn dem nicht so ist ;-)). —Clici McXan 12:32, 15. Jul. 2010 (CEST)
Das mit einer Literatur-Liste für Anfänger ist meiner Meinung nach eine recht gute Idee. Trotzdem muss noch geklärt werden wie viel "Programmieranfängerhilfe" wir hier überhaupt geben können/wollen. Erst dann können wir den betreffenden Satz auch passend formulieren. --Erik.vikinger 13:06, 15. Jul. 2010 (CEST)

Was soll das mit C und UNIX ?

Ich will ja niemand beleidigen, aber Betriebssystem schreibt mann wohl kaum in einer Hochsprache, und UNIX bzw. Linux oder Windows, haben wohl kaum etwas mit der Realität (also Hardware) zu tun. Für die Essenziellen Teile eines Betriebssystems, ist eigentlich Assembler die einzige vernünftige Programmiersprache, wobei auch gute Kenntnisse in Maschinensprache nötig sind um es wirklich gut zu machen. Mal davon abgesehen dass die (häufig unnötigen) Stackoperationen größeren Code erzeugen, und den Prozessor ausbremsen, kann ein Compiler - so modern er auch ist - nunmal kein Kontextwissen haben und somit keinen wirklich guten Code erzeugen. Und bei Systemaufrufen, die massenhaft im Hintergrund aufgerufen werden, können ein paar unnötige Befehle die Geschwindigkeit enorm verzögern. Dazu kommen noch die Sicherheitsrisiken, dadurch das man nicht weis wie das Programm letztendlich aussschaut.

Beispiel:

Folgende C-Prozedur ....

include <dos.h>
unsigned char readCMOS (unsigned char a)
{
 outportb(0x70,a);
 return inportb(0x71);
}

... würde etwa folgenden Code (in Assembler) erzeugen ...

_READCMOS proc near
  push bp        ; 1 byte
  mov bp,sp      ; 2  "
  mov ax,[bp+4]  ; 3  "
  push ax        ; 1  "
  mov ax,70h     ; 3  "
  push ax        ; 1  "
  call _OUTPORTB ; 3  "
  pop cx         ; 1  "
  pop cx         ; 1  "
  mov ax,71h     ; 3  "
  push ax        ; 1  "
  call _INPORTB  ; 3  "
  pop cx         ; 1  "
  pop bp         ; 1  "
  ret            ; 1  "
_READCMOS endp   ; Summe:  26 byte

ziemlich umständlich oder ?

vergleichbare Prozedur für reines Assembler Programm :

READCMOS proc near ; Parameterübergabe in AL ; Rückgabewert in AL
  out 70h,al     ; 2 byte
  in al,71h      ; 2  "
  ret            ; 1  "
READCMOS endp    ; Summe: 5 byte

Die Code und Zeitersparnis ist deutlich zu erkennen.

Zum Thema UNIX ist zu bemerken, das ein Gerät nunmal keine Datei ist, also ein Linux/Windows Programmierer sich nicht zwangsweise mit Hardware- und BIOS-zugriff auskennt. (Ich habe - im Ernst - mal in einem Linux forum gelesen, dass einer nicht weis wofür die Befehle IN und OUT sind). Viel wichtiger ist es sich mit DOS auszukennen, denn da arbeitet man ständig mit BIOS und Hardwarezugriffen, und weis auch wie man zum Beispiel erkennt ob und was für Geräte angeschlossen sind. Und das ist genau dass, was die Klicki-Bunti-Objekti-Hochsprachi-Programmierer eben nicht können.

Diese C-vs.-Assembler-Diskussion gab es mehr als einmal und Assembler hat immer den kürzeren gezogen (weil zeitaufwendig und fehleranfällig). Wenn du ernsthaft daran interessiert bist, such dir im Forum die passenden Threads raus und lies sie. Wenn nicht, troll bitte woanders weiter. Dein Beispiel habe ich mal ausprobiert, siehe unten... --Taljeth 11:54, 20. Apr. 2011 (CEST)
kwolf@dhcp-5-188:/tmp/c$ cat cmos.c
static inline void outportb(short port, char value)
{
    asm volatile("outb %0, %1" : : "a" (value), "Nd" (port));
}

static inline char inportb(short port)
{
    char value;
    asm volatile("inb %1, %0" : "=a" (value) : "Nd" (port));
    return value;
}

unsigned char readCMOS (unsigned char a)
{
      outportb(0x70,a);
      return inportb(0x71);
}
kwolf@dhcp-5-188:/tmp/c$ gcc -O2 -c cmos.c 
kwolf@dhcp-5-188:/tmp/c$ objdump -d cmos.o

cmos.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <readCMOS>:
   0:   89 f8                   mov    %edi,%eax
   2:   e6 70                   out    %al,$0x70
   4:   e4 71                   in     $0x71,%al
   6:   c3                      retq 
Nächster Beitrag: Ich weiß nicht, wieso ich antworte. Vermutlich bin ich sehr anfällig für Flamewars. Vielleicht möchte ich auch nur ein paar Sachen klarstellen, falls irgendein unglücklicher Anfänger das hier zufälligerweise liest und für bare Münze nimmt. Hast du den C-Code mal kompiliert? Vermutlich nicht. Ich schon. Leider hat taljeth das auch gemacht. Also lasse ich die erste Hälfte von meinem Beitrag einfach mal weg. Hinzuzufügen wäre noch, dass man bei neueren GCCs ja auch -flto benutzen kann, dann wird die Funktion readCMOS sogar dann direkt eingebunden, wenn sie sich in einer anderen Datei befindet. Aus

<c>int _start(void) {

   return readCMOS(42);

}</c>

wird dann

<asm>00000000 <_start>: _start():

0000000:       b8 2a 00 00 00          mov    eax,0x2a
0000005:       e6 70                   out    0x70,al
0000007:       e4 71                   in     al,0x71
0000009:       0f b6 c0                movzx  eax,al
000000c:       c3                      ret</asm>
Ich sehe da rein gar keinen Geschwindigkeitsnachteil zu deinem handoptimierten Assembler. Im Gegenteil, der gcc spart sich sogar den Funktionsaufruf und macht alles über Register.
Zu dem OS-Kommentar sag ich einfach mal nichts, das ist wirklich Geschmackssache. Und wenn vielleicht irgendwann alle Rechner mit ARM laufen, braucht man IN und OUT ja sowieso nicht mehr (braucht man bei moderner Hardware außerdem überhaupt kaum noch, vielleicht mal zum Initialisieren, aber die ganzen Datenstrukturen liegen im Speicher und werden mit PCI-DMA abgearbeitet). —Clici McXan 12:10, 20. Apr. 2011 (CEST)


Kurzum: Es hat sich bewährt.
In Hochsprachen geht die Entwicklung einfach wesentlich schneller von der Hand. Klar, in Assembler kann man manchmal doch noch hier und da eine Optimierung einbasteln, die die Compiler noch nicht hinbekommen oder es sowieso nie tun werden. Wer hier allerdings mit der mangelnden Optimierung der Compiler argumentiert und dann auch noch Compiler aus dem letzten Jahrtausend verwendet darf sich nicht wundern, wenn er bei mir auf taube Ohren stößt. In der Zeit, in der man sich hier beschwert hätte man stattdessen zum Beispiel schon mal einen Patch verfassen können.
UNIX und Linux sind deswegen erwähnenswert, weil, wie mehrfach gesagt, das Einrichten der Entwicklungsumgebung und das Systemdesign an sich einfach einfacher und besser sind. Wer sich mit Entwicklung auf Windows rumquält ist es einfach selbst Schuld, und auch die Funktionsweise zu kopieren halte ich nicht gerade für klug. UNIX/POSIX bietet hier meiner Meinung nach eine klare und logische Strukturierung.
Wenn man sich im Internet einmal umschaut, sind wir hier nicht die einzigen, die beim OS-Dev auf UNIX und Hochsprachen setzen. Genutzt wird halt, was die Mehrheit für funktional und vertretbar hält, und nicht, was objektiv das "beste" ist. ─SHyx0rmZ, ehemals begeisterter Windowsbenutzer und immer noch Assemblerbegeisterter 01:42, 21. Apr. 2011 (CEST)

Nur weil es bei einer Diskussion rauskommt, heist das noch lange nicht, dass Assembler tatsächlich fehleranfällig ist. In erster Linie hängt das einmal davon ab wie gut jamand eine Programmiersprache kann, und wie Gewissenhaft man Programmiert. Es ist aber auffällig, das moderne Software (die meistens in Hochsprachen geschrieben sind) häufiger Bugfixes und und "Service-Packs" benötigen, wärend ältere Assembler-Programme in der Regel einfach funktionieren. Um bei Betriebssystemen zu bleiben MS-DOS 5.0 ist z.b. von wesentlich höherer Qualität als Windows XP. Was das C-Beispiel angeht, muss ich zugeben, das der GNU-C-Compiler das deutlich besser löst, als mein 80er Jahre Turbo-C-Compiler (bei dem Outportb tatsächlich eine Bibliotheksfunktion ist). (Wobei trotzdem noch die Frage bleibt, wieso im ersten Beispiel EAX statt AL genommen wird.) Dann bleibt natürlich die Frage, wieso in einem Lowlevel-Wiki so viel Highlevel Programmiersprachen benutzt werden ? Es erweckt eher den Eindruck, als ob es hier überwiegend um in C geschriebene Unixoide Bertriebssystem geht. Damit das Betriebssysteme Geschmackssache sind, hast du vollkommen recht, dann stellt sich aber die Frage, warum einige Artikel so übertrieben abfällig über DOS sind, und laut diesem Artikel UNIX-kenntnisse zur Lowlevel Programmierung nötig sind ? (Was übrigens auch weiter oben auf dieser Seite erwähnt wird). Es gibt schlieslich noch andere Betriebssysteme. Das ist eigentlich auch - wie man bei Wikipedia sagt - Point of View. Nebenbei werden der PCI- (Ports 0CF8h-0CFFh) und der DMA- (Ports 00h-0Fh) Controller eben mit den Befehlen IN und OUT gesteuert. IO.SYS 21:32, 20. Apr. 2011 (CEST)

Ich nehme an, dass man mit Fug und Recht behaupten kann, dass MS-DOS wesentlich einfacher als Windows XP war, sodass es bei weniger Code natürlich auch weniger Fehler gab. Zudem ist die Frage, ob die Sicherheitsanforderungen schon zu MS-DOS-Zeiten schon so stark waren wie heute. Wenn es damals eine Lücke gab, war das vielleicht nicht so schlimm, in den heutigen Zeiten des überall verbreiteten Internets ist das etwas ganz anderes, da kann man nicht auf die nächste Version warten, sondern muss sofort einen Fix herausbringen. Dass der Code an sich schlechter ist, heißt das nicht, und was das mit der verwendeten Sprache zu tun haben soll, erschließt sich mir gleich überhaupt nicht. Man kann in C einfach weniger Fehler machen als in Assembler. Das ist ein Faktum (ein C-Compiler gibt eine ganze Menge Warnungen aus, wenn man das will). Wenn der Assemblerprogrammierer dennoch weniger Fehler als der C-Programmierer macht, dann liegt das nicht an der Sprache, sondern daran, dass der Assemblerprogrammierer besser ist, mehr Zeit oder einen anderen Vorteil hat. Aber das ist dann ein unfairer Vergleich.
Der Begriff „Lowlevel“ ist absolute Definitionssache. Aus Sicht eines Anwenders mag bereits HTML als lowlevelig erscheinen. Aus Sicht eines Assemblerprogrammierers ist die Funktionsweise der CPU noch lowleveliger. Und so weiter. Dieses Wiki beschäftigt sich laut Startseite mit der Betriebssystemprogrammierung – und die kann in jeder Sprache geschehen, die sich dafür eignet oder auch nicht. In Assembler, C, C++, Eiffel – was auch immer. Dem Masochismus sind kaum Grenzen gesetzt. C ist zumindest für Anfänger (und imho auch für alle anderen) einfach zu empfehlen, ich glaube einfach nicht, dass die meisten professionellen „Betriebssystementwickler“ dieser Welt zu blöd sind, sich die richtige Sprache auszusuchen (und heute nehmen sie eben C oder C++). Zudem empfehle ich einem Computeranfänger auch nicht gleich das Beste vom Besten in Sachen Computerhard- und -software, wenn er damit gar nichts anfangen kann, weil es sein Wissen komplett übersteigt, obwohl ich persönlich ganz toll damit klarkomme.
Insgesamt möchte ich wirklich nicht in noch einen tiefen Flamewar einsteigen, im Forum gabs genug und ich wiederhole hier schon wieder alle Argumente aus den entsprechenden Threads. Jeder soll die Sprache wählen, die er mag. Aber dies hier ist nicht „Hochperformantes OS-Dev für erfahrene Entwickler im kommerziellen Bereich“, sondern „OS-Dev für Einsteiger“. Und ein Einsteiger findet Assembler in aller Regel ziemlich… Abstrakt. Da man nun mal weitgehend auf Assembler verzichten kann, ohne Funktionalität einzubüßen, ist es doch kein Problem, wenn hier eben erstmal C empfohlen wird. Wechseln kann man ja immer noch, wenn man genügend Erfahrung mit Assembler gemacht hat.
Und zu den netten Herren IN und OUT, die es heute im Desktopbereich wohl nur noch bei x86 gibt: Die PCI-Ports braucht man wie gesagt eigentlich nur bei der Initialisierung der Geräte. Und PCI-DMA hat mit ISA-DMA nichts zu tun. Ich bleibe dabei, IN und OUT werden im laufenden Betrieb vor allem vom Tastaturtreiber genutzt und das wars. ;-) —Clici McXan 01:14, 21. Apr. 2011 (CEST)
Da bleibt eigentlich nur hinzuzufügen, dass gerade ein erfahrener Entwickler im kommerziellen Bereich hochkant rausfliegen würde, wenn er ein ganzes OS in Assembler schreiben wollte. Ich bin mir nicht sicher, ob das noch unter grob fahrlässig laufen würde oder ob man da einen Vorsatz annehmen muss, wenn es dem Kunden dann um die Ohren fliegt. ;-) --Taljeth 12:04, 21. Apr. 2011 (CEST)
@Clici McXan: Du hast den Floppy-Treiber vergessen, der benutzt auch noch fleißig IN und OUT und ist darüber hinaus der Letzte der noch ISA-DMA nutzt. Ansonsten kann ich Taljeth und Dir nur voll und ganz zustimmen.
@ALL: Flame-Wars sind voll Moppelkotze! --Erik.vikinger 17:04, 21. Apr. 2011 (CEST)
Ich finde, wir sollten Betriebssysteme nur noch in SQL programmieren und zwar OS/2-Klone, diese werden dann aber mit einem Bleistift auf Papier geschrieben, weil das ist dann wieder lowlevel. --DerHartmut 11:38, 22. Apr. 2011 (CEST)
Warum braucht es immer erst jemanden mit dem Mut, die harte Wahrheit offenzulegen, um den Fortschritt zu ermöglichen? Ich denke, mit dieser genialen Lösung wäre das Problem dann gegessen ─SHyx0rmZ 12:07, 22. Apr. 2011 (CEST)