Low Level C



  • Zu diesem Thema mal ne ähnliche Frage (wollte keinen neuen thread deswegen eröffnen.

    Wie programmiert man ein eigenes OS?
    muss ich das mit assembler machen, oder kann ich in C was screiben und dann als Binärdatei irgendwie zum booten benutzten (oder booten lassen über grub).

    Wäre dankbar über einige links zu vielelicht auch deutschen seiten die dieses thema behandeln



  • Storm.Xapek.de schrieb:

    Wie programmiert man ein eigenes OS?
    muss ich das mit assembler machen, oder kann ich in C was screiben und dann als Binärdatei irgendwie zum booten benutzten (oder booten lassen über grub).

    Wäre dankbar über einige links zu vielelicht auch deutschen seiten die dieses thema behandeln

    Schau dir die Links an, die ich gepostet hab. Lowlevel ist auf deutsch, aber leider gerade nicht erreichbar.

    Das einzige was du in Assembly programmieren musst ist der Bootloader, da der innerhalb von 512 Bytes Platz finden musst. Du kannst auch einfach GRUB nehmen und direkt mit einer höheren Programmiersprache anfangen. Den Kernel kannst du in jeder Sprache programmieren, die dir Binarys generieren kann, die ohne irgendwelche Bibliotheken auskommen (also auch ohne die Standard C Library). Zum Beispiel C oder Assembly.



  • Aha

    Und wie genau soll das dann funktionieren,
    ohne bibliotheken da hab ich ja nur den sprachumfang un mit dem kann ich nicht viel anfangen



  • Storm.Xapek.de schrieb:

    Und wie genau soll das dann funktionieren,
    ohne bibliotheken da hab ich ja nur den sprachumfang un mit dem kann ich nicht viel anfangen

    Du schreibst dir Treiber für Alles. Als beispiel: Wenn du Text ausgeben willst, dann, wenn du im Protected Modus bist, schreibst du an eine Bestimmte stelle im Speicher. Dieser Text wird dann vom Bios auf dem Bildschirm ausgegeben. Viele andere Sachen sprichst du über die IO Ports von deinem Prozessor an (z.B. die Tastatur).



  • Storm.Xapek.de schrieb:

    Aha

    Und wie genau soll das dann funktionieren,
    ohne bibliotheken da hab ich ja nur den sprachumfang un mit dem kann ich nicht viel anfangen

    Genau das ist auch der Grund warum man ein OS nicht in reinem C schreiben kann. Du must dir selber erstmal deine ganzen Funktionen schreiben. Zum Beispiel heißt die printf Version des Linux-Kernels printk. Du hast am Anfang nichts. Und um die mit der Peripherie oder der CPU deiner Architektur zu kommunizieren, brauchst du Assembler. Ohne Assembler kein OS.



  • Linux-Hobby-Entwickler schrieb:

    Storm.Xapek.de schrieb:

    Aha

    Und wie genau soll das dann funktionieren,
    ohne bibliotheken da hab ich ja nur den sprachumfang un mit dem kann ich nicht viel anfangen

    Genau das ist auch der Grund warum man ein OS nicht in reinem C schreiben kann. Du must dir selber erstmal deine ganzen Funktionen schreiben. Zum Beispiel heißt die printf Version des Linux-Kernels printk. Du hast am Anfang nichts. Und um die mit der Peripherie oder der CPU deiner Architektur zu kommunizieren, brauchst du Assembler. Ohne Assembler kein OS.

    Also erstmal in assembler die Grundfunktionen wie aus und eingabe machen, und die kann ich dann in C einbinden und benutzen, oder so ungefähr.

    Ich interessiere mich für dieses thema glaubst du es würde sich lohnen mal zu versuchen einen eigenen kernel zu schreiben (ich stell mir ddas so vor dsa ich am ende den kernel vom grub booten lasse und das der mir dann hallo welt ausgibt und dann vielleicht runterfährt) oder wäre das auch bei einem so kleinen ziel zuviel arbeitfür eine person alleine die fast keine ahnung davon hat?
    (ich wäre vielleicht bereit 1-2 tage arbeit dahineinzustecken, realistisch?)



  • Das wäre zu schaffen. Wie gesagt. Schau dir die Links an. Da findest du für das, was du vor hast schon massenweise Beispiele.

    Edit:
    Wenn du noch nicht mit Assembly vertraut bist, ist es sicher die Beste wahl, sich erstmal den Kernel von GRUB laden zu lassen. Ein bisschen Assembly brauchst du aber, wie hier eben schon erwähnt immer. Zum Beispiel, um die Interrupt Tabelle zu laden, oder IO Ports zu verwenden. Es kann also nicht schaden, sich auch damit auseinander zu setzten.



  • Ich hab jetzt mal einen eigenen thread im assemblerforum aufgemacht.
    Wer lust hat kann mir ja da von zeit zu zeit mal helfen
    http://www.c-plusplus.net/forum/viewtopic-var-p-is-1009265.html#1009265



  • steht irgendwo ab wann ich mein programm (offiziell) Betriebssystem nennen darf?
    also gibts da eine definition für, was ein betriebssystem alles können muss?





  • Für PC sowas zu machen ist ausserdem langweilig. Such dir doch lieber irgendeine exotische Plattform wenn du hardware nah rumfrickeln willst. Da kann dann eventuell sogar was nützliches bei rauskommen was anderen Leuten etwas nützt. Z.b. PSP ist ganz nett zum frickeln.



  • icepacker schrieb:

    steht irgendwo ab wann ich mein programm (offiziell) Betriebssystem nennen darf?
    also gibts da eine definition für, was ein betriebssystem alles können muss?

    Ein OS sollte schon mp3's abspielen können 😃



  • Also ich habe jetzt mal so ein paar Kernel gesehen. Bei diesem Code blicke ich irgendwie nicht durch. (Ich weiss das ist ziemlich simpler Code)

    int main() 
    { 
    char *Text = "Willkommen"; 
    char *VideoMem = (char*)0xB8000; 
    
    while(*Text) 
    { 
    *VideoMem = *Text; 
    *VideoMem++; 
    *VideoMem = 7; 
    *VideoMem++; 
    *Text++; 
    } 
    
    return(0); 
    }
    


  • osdeveloper schrieb:

    Ein OS sollte schon mp3's abspielen können 😃

    Du meinst, dass in jeden OS Kernel ein MPEG 3 Decoder gehört? Dann kannst du nach deiner Definition noch der Erste sein, der ein OS erstellt. :p



  • lilian schrieb:

    Also ich habe jetzt mal so ein paar Kernel gesehen. Bei diesem Code blicke ich irgendwie nicht durch. (Ich weiss das ist ziemlich simpler Code)

    int main() 
    { 
    char *Text = "Willkommen"; 
    char *VideoMem = (char*)0xB8000; 
     
    while(*Text) 
    { 
    *VideoMem = *Text; 
    *VideoMem++; 
    *VideoMem = 7; 
    *VideoMem++; 
    *Text++; 
    } 
     
    return(0); 
    }
    

    Du schreibst den Text "Willkommen" an die stelle 0xB8000 im RAM. Ist doch Alles nur C. Das solltest du am besten können, wenn du ein OS schreiben willst.

    Edit: Wenn ich mich nicht irre, dann müsste das aber so aussehen:

    while(*Text) 
    { 
        *VideoMem = *Text; 
        VideoMem++; 
        *VideoMem = 7; 
        VideoMem++; 
        Text++; 
    }
    


  • Linux-Hobby-Entwickler schrieb:

    Und um die mit der Peripherie oder der CPU deiner Architektur zu kommunizieren, brauchst du Assembler.

    falsch.

    Linux-Hobby-Entwickler schrieb:

    Ohne Assembler kein OS.

    auch falsch.



  • net schrieb:

    Linux-Hobby-Entwickler schrieb:

    Und um die mit der Peripherie oder der CPU deiner Architektur zu kommunizieren, brauchst du Assembler.

    falsch.

    Wie schaltest Du aus dem System-Mode in den User-Mode?
    Wie sicherst Du die Register eine Prozesses der von einem Interrupt unterbrochen wurde?



  • @Linux-Hobby-Entwickler: mit C *lol* ... *rofl*



  • Linux-Hobby-Entwickler schrieb:

    Wie schaltest Du aus dem System-Mode in den User-Mode?

    das ist architekturabhängig, viele compiler haben für sowas eine library oder machen das per 'intrinsics'

    Linux-Hobby-Entwickler schrieb:

    Wie sicherst Du die Register eine Prozesses der von einem Interrupt unterbrochen wurde?

    dafür gibts #pragmas oder spezielle schlüsselwörter
    z.b.

    void __interrupt myISR(void)
    {
    ....
    }
    

    oder

    #pragma INTERRUPT
    void myISR(void)
    {
    ...
    }
    

    da wird der context automatisch gesichert und ans ende 'ne 'return from interrupt' instruction gepackt



  • net schrieb:

    Linux-Hobby-Entwickler schrieb:

    Wie schaltest Du aus dem System-Mode in den User-Mode?

    das ist architekturabhängig, viele compiler haben für sowas eine library oder machen das per 'intrinsics'

    Ok, dass wusste ich nicht, bzw. ist mir vom GCC auch nicht bekannt. Läuft aber letzenendes auf das selbe hinaus, dass es mit ANSI C alleine nicht möglich ist.

    net schrieb:

    Linux-Hobby-Entwickler schrieb:

    Wie sicherst Du die Register eine Prozesses der von einem Interrupt unterbrochen wurde?

    dafür gibts #pragmas oder spezielle schlüsselwörter
    z.b.

    void __interrupt myISR(void)
    {
    ....
    }
    

    oder

    #pragma INTERRUPT
    void myISR(void)
    {
    ...
    }
    

    da wird der context automatisch gesichert und ans ende 'ne 'return from interrupt' instruction gepackt

    Das setzt aber voraus, dass nach dem Interrupt der selbe Prozess weiter ausgeführt werden soll. Ich nutze aber auch Interrupts für das scheduling. Wenn ich aus meiner Prozesstabelle den nächsten Prozess zum weiterführen auswähle, muss ich dessen Kontext wiederherstellen. Das ist ebenfalls mit ANSI C nicht möglich.


Anmelden zum Antworten