Low Level C



  • 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.



  • Linux-Hobby-Entwickler schrieb:

    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.

    naja, wenn man einen scheduler bastelt, der mangels mehrerer cpus und per timer-interrupt multithreading simuliert musss man schon tricksen, klar, mit ansi-c kommt man da nicht besonders weit. aber es gibt ja auch betriebssysteme, die ohne solche tricks auskommen, z.b. diese:
    http://www.tinyos.net/
    http://home.eunet.no/~jen/nenesos.html

    nesos is completely processor independent. It can be used with any ANSI C compiler. There is no need for assembly files or architecture dependent features



  • net schrieb:

    Linux-Hobby-Entwickler schrieb:

    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.

    naja, wenn man einen scheduler bastelt, der mangels mehrerer cpus und per timer-interrupt multithreading simuliert musss man schon tricksen, klar, mit ansi-c kommt man da nicht besonders weit.

    Darauf wollte ich hinaus. Um bestimmte Features zu erreichen braucht man Assembler. Was im Prinzip auch nicht weiter schlimm ist, da es zum einen prozentual sehr sehr wenig ist und zum anderen diesen prima mit inline assemlby einbetten kann.

    net schrieb:

    aber es gibt ja auch betriebssysteme, die ohne solche tricks auskommen, z.b. diese:
    http://www.tinyos.net/
    http://home.eunet.no/~jen/nenesos.html

    nesos is completely processor independent. It can be used with any ANSI C compiler. There is no need for assembly files or architecture dependent features

    Danke! Ich wusste nicht, dass man ein minimal OS mit reinem ANSI C schreiben kann. Werde ich mir auf jeden Fall mal anschauen. 👍


Anmelden zum Antworten