Frage zu k_printf



  • Hallo kann man die k_printf Funktion z.b. auch einfach im Windows mit einem normalen C Compiler testen?

    #include <stdio>
    
    unsigned int k_printf(char* message, unsigned int line, char attribute)
    {
    	char* vidmem = (char*) 0xb8000;
    	unsigned int i = line*80*2;
    
    	while(*message!=0)
    	{
    		if(*message=='\n') // check for a new line
    	    {
    	      line++;
    	      i=(line*80*2);
    	      *message++;
    	    }
            else
            {
    		  vidmem[i]=*message;
    		  *message++;
    		  ++i;
    		  vidmem[i]=attribute;
    		  ++i;
            }
    	}
    	return 1;
    }
    
    int main()
    {
    
    	k_printf("test", 0, 0xA);
    
    	return 0;
    }
    


  • Nein, denn sie beschreibt direkt den Videospeicher für VGA.
    Windows läuft aber nicht im VGA-Modus, sodass es unwahrscheinlich ist, das der Grafikspeicher an der gleichen Stelle liegt, zudem läuft WIndows ja nicht in einem Textmodus und drittens würde die entsprechende Speicherstelle durchs Paging vor unautorisiertem Zugriff geschützt (Tut PrettyOS auch, soweit ich weiß^^)


  • Mod

    Ich habe es mal direkt getestet, aber mit

    #include <stdio.h>
    

    Dieser Header wird aber nirgends verwendet, also einfach weglassen.

    Da kommt folgende Fehlermeldung:

    Die Anweisung in "0x0040136b" verweist auf Speicher in "0x000b8000". der Vorgang "written" konnte nicht auf dem Speicher durchgeführt werden.

    In PrettyOS geben wir diesen Bereich explizit für User-Programme frei, oder wir schaffen einen entsprechenden syscall. 😉

    MS Windows lässt solche Zugriffe nicht mehr zu, damit Programme sich - wie in besten DOS-Zeiten - nicht gegenseitig ins Gehege kommen können. Hat Vor- aber auch Nachteile.



  • Erhard Henkes schrieb:

    In PrettyOS geben wir diesen Bereich explizit für User-Programme frei, oder wir schaffen einen entsprechenden syscall. 😉

    Letzteres afaik.


  • Mod

    userlib.c:

    void printLine(const char* message, uint32_t line, uint8_t attribute)
    {
        if (line <= 45) // User may only write in his own area (size is 45)
        {
            __asm__ volatile("int $0x7F" : : "a"(91), "b"(message), "c"(line), "d"(attribute));
        }
    }
    

    syscall.c und console.c:

    void cprintf(const char* message, uint32_t line, uint8_t attribute, ...)
    {
        uint8_t old_attrib = getTextColor();
        uint8_t c_x = currentConsole->cursor.x;
        uint8_t c_y = currentConsole->cursor.y;
        scroll_flag = false;
    
        textColor(attribute);
        currentConsole->cursor.x = 0; currentConsole->cursor.y = line;
    
        // Call usual printf routines
        va_list ap;
        va_start(ap, attribute);
        vprintf(message, ap);
        va_end(ap);
    
        scroll_flag = true;
        textColor(old_attrib);
        currentConsole->cursor.x = c_x;
        currentConsole->cursor.y = c_y;
    }
    

    ... aber inzwischen als veraltet (deprecated) gekennzeichnet.


Anmelden zum Antworten