Grundlagenfragen zu (System)Programmierung



  • Mechanics schrieb:

    Es gibt z.B. den IPC Bus, und den kann man enumerieren.

    Was issn das? Nie gehört. Haste nen Link dazu?



  • anneXus schrieb:

    Frage 1:[list]Der Kernel stellt - unteranderem - eine Schnittstelle zwischen der Hardware und der Software. Um diese Schnittstelle zu realisieren, benötigt es Kenntnisse darüber, wie mit dieser Hardware zu kommunizieren ist. Woher kriegt man diese Informationen?

    Die Informationen liefern die Prozessorhersteller (Intel, AMD, Via usw.) bzw. diejenigen, die die Prozessorarchitektur (ARM, Intel, TI) entworfen haben.

    Wenn man die Opcodes kennt, also diese Informationen hat, dann kann man dafür auch Assembler schreiben und sobald man Assembler hat, kann man darauf basierend
    ein OS oder einen C Compiler schreiben um z.B. dann das OS in einer Hochsprache für die Systemprogrammierung wie z.B. C zu entwerfen.

    Frage 2:

    Der Linux Kernel wurde in C geschrieben (mit Hilfe des Minix OS - als Umgebung quasi) und wurde anschliessend mit einem entsprechenden Compiler, für den Prozessor auf dem das Ganze laufen soll, übersetzt Wie bringt man es nun zustande, dieses Programm auszuführen / zu booten? Über ein Laufwerk geht das ja wohl schlecht - da dies zu diesem Zeitpunkt noch gar nicht lauffähig ist.

    Doch, das Laufwerk ist lauffähig.
    Diese Aufgabe übernimmt das BIOS bzw. UEFI, welches z.B. auf den MBR der Festplatte oder bei Disketten auf den 1. Sektor zeigt.

    Natürlich gibt's da noch kein Dateisystem, die Logik ist daher entsprechend dumm, denn es wird der Code bei einer bestimmten Anfangsadresse ausgeführt.

    Der Code kann z.B. ein Bootloader sein und der läd dann entweder einen anderen OS Kernel oder er ist so intelligent und komplex, dass er sogar Dateisysteme lesen und von da den OS Kernel lesen kann.
    Normalerweise kann ein Bootloader kein Dateisystem lesen, deswegen wird die Einsprungsadresse an dem die Kerneldatei liegt, im Bootloader gespeichert.
    Dies ist auch der Grund, warum man normalerweise Kerneldateien unter /boot nicht verändern oder verschieben kann, ohne die Informationen für die Bootloader lilo oder grub upzudaten.

    Frage 3:

    Gibt es für mich eine Möglichkeit, die Sicht der Dinge aus der damaligen Zeit nachvollziehen zu können, indem man mit einem einfachen Programmierboard oder einem Emulator eine solche Umgebung schaffen kann um darauf Grundbausteine zu entwickeln?

    Klar, kauf dir ein Embeddded Board eines µC und lade dir die Handbücher über die Architektur herunter.

    Prinzipiell kannst du das aber auch schon bequem mit einem Emulator machen.
    Lade dir z.B. den x86 Emulator Bochs herunter und schreibe deinen eignen Bootloader der dann ein OS Starten soll.

    Der Vorteil von Bochs gegenüber einem Embedded Board ist, dass es wesentlich einfacher ist, denn du hast ja einen Bildschirm und somit eine Ausgabe.
    So etwas ist bei einem Embedded Board nicht immer vorhanden und wenn doch, dann ist das oft nur ein 2*20 Zeichen Textdisplay.
    Kaputt machen kannst du mit einem Emulator bei deinem PC auch nichts und trotzdem kannst du x86 Code lernen.

    Der Nachteil ist allerdings, dass so etwas heute nur noch in seltenen Fällen auf dem PC gebaucht wird.
    Also wenn du einen Bootloader oder ein OS schreiben willst.
    Ein Embedded Board mit µC erlaubt dir hier kleine Embedded Hardware für alles mögliche zu verwenden, wo kein PC verfügbar ist oder zu teuer ist.

    Noch einfach ist es aber, wenn du einfach Assmeblerprogrammierung lernst, dann bist du schon ziemlich nah an der HW.



  • Erstmal danke an alle für eure Antworten.

    hustbaer schrieb:

    Was genau willst du verstehen/nachvollziehen? Und wie viel Zeit willst du dafür opfern?
    Wenn du nur wissen willst wie man es anstellt ein OS auf ner PC Plattform zu booten, dann schlage ich vor im "Projekt: OS-Development" Forum zu fragen.

    Einiges wurde durch eure Antworten sehr gut verständlich. Worum es mir geht, ist dass, das ich verstehen möchte wie man aus "lebloser" Hardware ein derartiges Zusammenspiel durch Software erreicht und vor allem wo der Initialpunkt ist.

    Zu der Frage wie viel Zeit ich hier einstecken möchte. Da es zu meinem Beruf gehört - zwar überhaupt nicht mein Schwerpunkt, aber mich doch sehr interessiert - bin ich natürlich bereit mich mit diesem Thema intensiver zu beschäftigen. Allgemein mit der Programmierung. Der Thread bezieht sich zwar auch auf andere Punkte aber nur weil ich das als Grundlage hierfür empfinde.

    Mechanics schrieb:

    Ich habe die Frage eher so verstanden, dass der TE meint, der Kernel würde diese Informationen irgendwie zur Laufzeit bekommen oder zusammensuchen.

    Nein, dass der Kernel bereits wissen muss wie mit der Hardware zu kommunizieren ist bzw. das Protokoll kennen, ist mir bewusst.

    Könnt ihr für den Einstieg in dieses Thema ein bestimmtes Buch empfehlen? Bzw. allgemein vor dem Einstieg in die Programmierung? Ich habe manchmal das Gefühl dass es nicht viel bringt vertieft beispielsweise C++ zu lernen, wenn eventuell noch andere Kenntnisse fehlen. Für C++ habe ich bereits den C++ Primer.


  • Mod

    anneXus schrieb:

    Könnt ihr für den Einstieg in dieses Thema ein bestimmtes Buch empfehlen?

    Literatur, wie ein Computer funktioniert? Die Frage ist zu unklar, um konkrete Empfehlungen zu geben.



  • SeppJ schrieb:

    Literatur, wie ein Computer funktioniert? Die Frage ist zu unklar, um konkrete Empfehlungen zu geben.

    Nein. Grundsätzlich geht es mir um Programmierung. Daher formuliere ich mal die Frage anders. Was für Vorkenntnisse wären hilfreich und interessant beim Einstieg in die Programmierung (evntl. Mathematik etc.)? Wissen über die Funktionsweise eines Computers ist vorhanden - das ist nicht der Punkt.


  • Mod

    anneXus schrieb:

    Was für Vorkenntnisse wären hilfreich und interessant beim Einstieg in die Programmierung (evntl. Mathematik etc.)?

    Eigentlich gar nichts, außer Grundfertigkeiten beim Bedienen eines Computers und hilfreicherweise auch über die grundlegende Funktion (nicht zwingend notwendig, aber nützlich). Gerade die Dinge, nach denen du hier im Thread gefragt hast, dürften ungefähr 0 Relevanz beim Programmieren haben, außer, du entscheidest dich irgendwann in ferner Zukunft mal, mit an einem Betriebssystemkernel zu programmieren.

    Mathematik ist natürlich immer überall nützlich.



  • hustbaer schrieb:

    Mechanics schrieb:

    Es gibt z.B. den IPC Bus, und den kann man enumerieren.

    Was issn das? Nie gehört. Haste nen Link dazu?

    Ja ja, ich meinte natürlich PCI. Aber ich denke von "IPC" im Sinne von Interprocess Communication hast du schon was gehört? Man kann in jede diese Abkürzungen viel reininterpretieren.

    anneXus schrieb:

    Nein. Grundsätzlich geht es mir um Programmierung. Daher formuliere ich mal die Frage anders. Was für Vorkenntnisse wären hilfreich und interessant beim Einstieg in die Programmierung (evntl. Mathematik etc.)? Wissen über die Funktionsweise eines Computers ist vorhanden - das ist nicht der Punkt.

    Versteh ich nicht ganz. Du sagst, das wär dein Beruf. Was genau, Hardware oder Programmierung? Wenn Programmierung, dann solltest du doch wissen, was man da für Vorkenntnisse braucht? Oder meinst du "Systemprogrammierung" (ein sehr schwammiger Begriff) im Speziellen? Dafür braucht man sicher keine Mathematik und muss auch nicht mal besonders viel programmieren können, eher robust programmieren. Du brauchst hauptsächlich C und Assembler.
    Wahnsinnig viele Vorkenntnisse braucht man nicht. Ich musste in einem Projekt was in ein spezielles BIOS einbauen, war jetzt auch überhaupt nicht mein Schwerpunkt damals. Das ist alles sehr plattformspezifisch, man muss die fetten Dokus vom Mainboard und Prozessorhersteller durchwühlen und sich die Infos zusammensuchen, die man braucht. Ist natürlich ein tolles Gefühl, wenn es dann mal funktioniert, ist aber nichts, was ich unbedingt öfters machen wollen würde. Weil die Kenntnisse kaum wiederverwendbar sind. Bei der nächsten Plattform sind die Register, Adressen und Werte wieder komplett anders und das was du über die eine Plattform weißt (wenn du es nicht sofort wieder verdrängt hast), hilft bei der nächsten Plattform kaum weiter.



  • anneXus schrieb:

    Was für Vorkenntnisse wären hilfreich und interessant beim Einstieg in die Programmierung (evntl. Mathematik etc.)? Wissen über die Funktionsweise eines Computers ist vorhanden - das ist nicht der Punkt.

    Wie beim Auto ("Was für Vorkenntnisse wären hilfreich und interessant beim Einstieg in das Autofahren"): Einsteigen und losfahren, das Weitere gibt sich.

    Wenn Du "alte" Technik erschmökern willst, rate ich zu PC-Intern von Michael Tischer (3. Aufl.):

    http://www.amazon.de/PC-Intern-3-0-Michael-Tischer/dp/3890115918/ref=sr_1_2?s=books&ie=UTF8&qid=1386105043&sr=1-2

    Die späteren Auflagen beschäftigen sich mehr mit Windows-Programmierung, nicht ganz uninteressant, aber da gibt es mittlerweile bessere/ausführlichere Lektüre. Wenn Du es schaffst, eine MSDOS-Umgebung auf Deinen Computer zu bringen (was möglich ist) und die alten Programme (Turbo Pascal, Turbo Assembler) auftreiben kannst, kannst Du das Buch auch direkt als Lehrbuch verwenden. An den Prinzipien hat sich im Großen und Ganzen nichts geändert.

    viele grüße
    ralph



  • Mechanics schrieb:

    hustbaer schrieb:

    Mechanics schrieb:

    Es gibt z.B. den IPC Bus, und den kann man enumerieren.

    Was issn das? Nie gehört. Haste nen Link dazu?

    Ja ja, ich meinte natürlich PCI.

    Oki, dann klar mir die Sache ist.

    Aber ich denke von "IPC" im Sinne von Interprocess Communication hast du schon was gehört? Man kann in jede diese Abkürzungen viel reininterpretieren.

    Hihi, ja, sicher. Aber "IPC Bus" macht in dem Zusammenhang auch mit IPC=Interprocess Communication keinen Sinn 😉



  • Wissen über die Funktionsweise eines Computers ist vorhanden

    Anscheinend weniger als durch deinen "Beruf" erwartet. Einstiegspunkt ist der Bootsektor. Anfang ist: Schreiben eines kleinen Programmes, dass beim Start durch eine Bootdiskette ausgefuehrt wird und eine Nachricht am Bildschirm ausgibt, bsp. Hallo Welt.



  • rkhb schrieb:

    Wenn Du "alte" Technik erschmökern willst, rate ich zu PC-Intern von Michael Tischer (3. Aufl.):

    Vielen Dank für den Tipp.

    knivil schrieb:

    Wissen über die Funktionsweise eines Computers ist vorhanden

    Anscheinend weniger als durch deinen "Beruf" erwartet. Einstiegspunkt ist der Bootsektor. Anfang ist: Schreiben eines kleinen Programmes, dass beim Start durch eine Bootdiskette ausgefuehrt wird und eine Nachricht am Bildschirm ausgibt, bsp. Hallo Welt.

    Dass der Bootsektor als erstes für den Start gelesen wird, ist mir natürlich bewusst. Aber danke für deinen Tipp.

    Gruss
    annexus



  • Alles wichtige ist, was passiert dann ...



  • Suchst du etwas wie Write Great Code von Randall Hyde (No Starch Press)?



  • Lade dir Bochs als virtuelle Maschine runter, lern x86 Assembler und mach deine ersten Versuche im Bootsektor (512byte) der virtuellen Diskette von Bochs.

    Der Code im Bootsektor ist der erste Teil, der von dir stammt, alles davor erledigt die Firmware des Computers.
    Die macht aber auch nichts anderes, als dass sie die 512 byte von der Diskette in den RAM kopiert und dann diesen Code ausführt.



  • lalalalal schrieb:

    Der Code im Bootsektor ist der erste Teil, der von dir stammt, alles davor erledigt die Firmware des Computers.

    Muss nicht sein, ich hab auch schon mal am BIOS vom Bochs rumgebastelt.



  • Mechanics schrieb:

    lalalalal schrieb:

    Der Code im Bootsektor ist der erste Teil, der von dir stammt, alles davor erledigt die Firmware des Computers.

    Muss nicht sein, ich hab auch schon mal am BIOS vom Bochs rumgebastelt.

    aha, kling interessant.
    was hast du da gemacht?



  • Hab ja schon geschrieben, dass ich für ein Projekt was am BIOS von so einem Spezialboard umbauen musste. Mit Bochs habe ich dann vor allem die hardwareunabhängigen Sachen getestet, z.B. wie sich Grub verhält, wenn ich das Verhalten von paar Standardinterrupts anpasse.



  • Mechanics schrieb:

    Hab ja schon geschrieben, dass ich für ein Projekt was am BIOS von so einem Spezialboard umbauen musste. Mit Bochs habe ich dann vor allem die hardwareunabhängigen Sachen getestet, z.B. wie sich Grub verhält, wenn ich das Verhalten von paar Standardinterrupts anpasse.

    ah ok - habs erst jetzt gesehen.



  • [quote="SeppJ" Wenn du noch Grundlegenderes lernen willst: Was denn? Das Wesentliche habe ich gerade erklärt, so spannend ist das nicht.[/quote]Da hat wohl einer den Schuss nicht gehoert. Es geht hier um OS-Development, das ist eine Koenigsdisziplin der Informatik. Ich empfehle dir mal, dich mit dem Thema Informatik auseinander zu setzen.



  • @OSDEVELLEVEL
    Da hat wohl einer keine Ahnung von dem was er schreibt 🙂
    (Und damit meine ich nicht SeppJ, hihi.)


Anmelden zum Antworten