Mathematik-Funktionen im Kernel



  • Wie kann ich Math-Funktionen in einem Treiber verwenden?
    Also Sqrt, Trunc, Round...

    Habe dazu nichts gefunden.



  • #include <math.h>
    

    Was geht an denen nicht ?



  • DarkShadow44 schrieb:

    #include <math.h>
    

    Was geht an denen nicht ?

    das ist ne userspace lib 🙄

    Flamefire schrieb:

    Wie kann ich Math-Funktionen in einem Treiber verwenden?
    Also Sqrt, Trunc, Round...

    Habe dazu nichts gefunden.

    gar nicht bzw selbst schreiben.



  • Bin auf der Suche nach anderen Implementationen auf die Info gestoßen, dass der Prozessor die Wurzel berechnet. Wenn ich mich richtig erinnere gibt es auch Befehle zum Runden (alle 3).
    Demnach müsste theoretisch das ganze im Kernel genau wie im UserModus funktionieren. Oder hab ich was übersehn?



  • Prozessor die Wurzel berechnet

    Wer sonst ?

    Runden ist ja einfach.

    float f;
    int zahl=f; //Abgerundet
    
    int rest;
    
    while(f> 0 +1 )
    {
        f--;
    }
    
    while(f< 0 -1 )
    {
        f++;
    }
    
    rest=f*10; //Jetzt ist Rest die Zahl, nach der gerundet wird;
    
    if(rest>=5) zahl++;
    

    Schon gerundet :p



  • Du koenntest die Mathe-Bibliothek statisch linken, sofern nicht auf malloc und so zurueckgegriffen wird. Auch kannst du Funktionen wie cos, sin oder aber sqrt schnell iterativ implementieren.



  • Das schon, nur meinte ich, dass es z.b. für die Wurzel einen ASM Befehl gibt, so dass man der CPU nur sagt: Wurzel von x und die macht das dann. Also dass die Funktion an sich in der CPU liegt.
    Deshalb ist es ja eigendlich Unsinn, eine iterative und damit weit langsamere Methode zu schreiben.



  • tja nur so nen befehl gibt es nicht außerdem wär das prozessorabhängig und das willste in code nicht haben.



  • Flamefire schrieb:

    Das schon, nur meinte ich, dass es z.b. für die Wurzel einen ASM Befehl gibt, so dass man der CPU nur sagt: Wurzel von x und die macht das dann.

    für x86-Prozessoren:

    float		myFloat=16.0;
    		double		myDouble=2.0;
    		long		myLong=16;
    		long long	myLongLong=1234;
    
    		__asm
    		{
    			fld myFloat		// laden
    			fsqrt
    			fstp myFloat	// schreiben
    
    			fld myDouble
    			fsqrt
    			fstp myDouble
    
    			fild myLong
    			fsqrt
    			fistp myLong
    
    			fild myLongLong
    			fsqrt
    			fistp myLongLong
    		}
    


  • Genau das habe ich gesucht.
    Nur woher weiß der Prozessor (oder Assembler) welche Länge der Wert hat?
    Der Befehl ist ja der gleiche.



  • Mal kurz Realitätscheck: Kann es wirklich sein, dass jedes Kernelmodul (oder wie auch immer das unter Windows heißt) sämtliche Library-Funktionalität selbst implementieren muss?



  • Bashar schrieb:

    Mal kurz Realitätscheck: Kann es wirklich sein, dass jedes Kernelmodul (oder wie auch immer das unter Windows heißt) sämtliche Library-Funktionalität selbst implementieren muss?

    Nein, im Treiber hat man jediglich keinen Zugriff auf die Usermode-API und alles was Speicher alloziert, muss angepasst werden.

    Zb die STL-Funktion die es in C++ gibt erlauben das einfache Setzen eines eigenen allocators womit es kein Problem ist sie zu benutzen.



  • kein mensch benutzt c++ oder gar irgendwelchen sdl müll im kernel. der kernel hat eigene bibliotheken, ne safe string library gibt es und ein paar andere clib funktionen, guck dir die RTLxxx dinger an. alles andere musst du selbst machen, aber wozu sollte man das auch im kernel brauchen. das ist kein spielkasten.



  • stl muss das natürlich heißen.


Anmelden zum Antworten