Anzeige:
Ergebnis 1 bis 2 von 2

Thema: Linux-Bug gefunden?

  1. #1
    Registrierter Benutzer
    Registriert seit
    17.07.2007
    Beiträge
    38

    Linux-Bug gefunden?

    Hallo,

    ich vermute, einen Bug im Linux Kernel gefunden zu haben, da ich mit C allerdings noch nicht viel Erfahrung habe, will ich das hier erstmal bestätigen lassen.
    Hier erstmal mein Programm, mit dem ich teste:

    Code:
    #include <stdio.h>
    #include <string.h>
    #include <fcntl.h>
    #include <sys/types.h>
    #include <stdint.h>
    #include <errno.h>
    #include <unistd.h>
    
    void cpuid(int *a, int *b, int *c, int *d)
    {
        asm volatile (" mov %4, %%eax;"
                      " mov %5, %%ecx;"
                      " cpuid;"
                      " mov %%eax, %0;"
                      " mov %%ebx, %1;"
                      " mov %%ecx, %2;"
                      " mov %%edx, %3;"
      /* Output */    : "=a" (*a), "=r" (*b), "=c" (*c), "=d" (*d)
      /* Input  */    : "a" (*a), "c" (*c)
      /* Clobbered */ : "cc");
    }
    
    int cpuidx(int *ra, int *rb, int *rc, int *rd)
    {
      int fd;
      char cpuid_filename[64];
      int cpu=0;
    
      uint32_t data[4];
      uint32_t adr[2];
      uint64_t address;
    
      adr[0]=*ra;
      adr[1]=*rc;
    
      if ( *ra != 4 ) *rc=0;
    
      memcpy(&address,adr,8);
    
      //address=adr[0];
      //printf("%X\n",address);
    
      sprintf(cpuid_filename, "/dev/cpu/%d/cpuid", cpu);
    
      if ( (fd = open(cpuid_filename, O_RDONLY)) < 0 )
      {
        printf("Error opening %s errno=%d (%s)\n", cpuid_filename, errno, strerror(errno));
        return errno;
      }
    
      lseek(fd, address, SEEK_SET);
      read(fd, &data, 16);
    
      close(fd);
    
      *ra=data[0];
      *rb=data[1];
      *rc=data[2];
      *rd=data[3];
    
      return 0;
    }
    
    int main()
    {
      int a=0,b=0,c=0,d=0;
      a=0x80000000;
      cpuid(&a,&b,&c,&d);
      printf("%X %X %X %X\n",a,b,c,d);
      a=0x80000000;
      cpuidx(&a,&b,&c,&d);
      printf("%X %X %X %X\n",a,b,c,d);
    
      return 0;
    }
    Ist ein umgebauter Ausschnitt aus einem anderen Programm, sieht deswegen so unordentlich aus.
    Sinn und Zweck des ganzen ist es, die CPUID-Instruktion zu nutzen, um Daten über die CPU zu Erfahren.
    Hier nun der Output auf meinem System:
    Code:
    # ./test 
    80000008 0 0 0
    80000008 0 0 0
    Sieht wie erwartet aus, das /dev/cpu/0/cpuid-Interface und die cpuid-Instruktion liefern beide die selben Daten.
    Hier nun die Ausgaben von einem Xeon, auf dem mein ursprüngliches Programm plötzlich gesponnen hat:
    Code:
    # ./test 
    80000004 0 0 0
    B7F50FF4 B7F514F8 1 BFF4F140
    Eindeutig ist die Ausgabe des Interfaces vom Linux-Kernel totaler Müll, die cpuid-Instruktion liefert gänzlich andere (und offensichtlich richtige) Daten.

    Habe ich einen Bug im Programm oder liegt es am Betriebssystem???

  2. #2
    Registrierter Benutzer Avatar von ContainerDriver
    Registriert seit
    10.01.2003
    Beiträge
    418
    Hallo,

    kann den Code-Schnipsel leider nicht ausprobieren, weil mir /dev/cpu/... fehlt (wie bekommt man denn das?). Kannst du vielleicht ein bisschen genauer erklären, warum der Dateizeiger um den Wert in address weitergeschoben wird? Bist du dir sicher, dass bei dem memcpy alles glatt läuft?

    Gruß, Florian
    Ein gebrechlich Wesen ist der X-Server.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •