Was verursacht einen Segmentierungsfehler bei einem Aufruf von inb_p ()?

Beim Versuch, einen Port mit inb_p () zu lesen, tritt ein Segmentierungsfehler auf. Ich kompiliere dies auf einem Debian-System, das 2.6.6-Kernel auf einem Intel D525-Dual-Core-System (Advantech PCM 9389 SBC) ausführt. Hier ist ein Beispielprogramm, das den Segfault veranschaulicht.

Was ist die wahrscheinliche Ursache? Wie behebe ich das?

Derzeit sind keine Geräte angeschlossen. Könnte dies den Segfault verursachen? Ich hätte erwartet, entweder eine Null oder ein zufälliges Byte zu erhalten, aber keinen Segfault.

Andere Dinge, die ich versucht habe: 1) Deklarierte die Eingabevariable als int anstelle von char. 2) Verwendete iopl () anstelle von ioperm ()

/*
 * ioexample.c: very simple ioexample of port I/O
 * very simple port i/o
 * Compile with `gcc -O2 -o ioexample ioexample.c',
 * and run as root with `./ioexample'.
 */
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/io.h>

#define BASEPORT 0x0100 /* iobase for sample system */
#define FLIPC 0x01
#define FLIPST 0x0
#define DIPSWITCH 0x25

int main()
{
char cinput;

  cinput = 0xff;
  setuid(0);
  printf("begin\n");
  /* Get access to the ports */
  if (ioperm(BASEPORT+DIPSWITCH, 10, 1)) 
  {
     perror("ioperm");
     exit(EXIT_FAILURE);
  }

  printf("read the dipswitch with pause\n");
  cinput = inb_p(BASEPORT+DIPSWITCH); // <=====SEGFAULT HERE

  /* We don't need the ports anymore */
  if (ioperm(BASEPORT+DIPSWITCH, 10, 0))
  {
     perror("ioperm");
     exit(EXIT_FAILURE);
  }

  printf("Dipswitch setting: 0x%X", cinput); 
  exit(EXIT_SUCCESS);
}

/* end of ioexample.c */

Ausgabe:

root@debian:/home/howard/sources# ./ioexample
begin
read the dipswitch with pause
Segmentation fault

Edit: / proc / ioports hat unter der Adresse 0x100 nichts aufgelistet, daher habe ich mehrere andere aufgelistete Portadressen ausprobiert, mit demselben Ergebnis. Dann habe ich beschlossen, eine zu versuchenAusgabe an einen bekannten Speicherort für den parallelen Anschluss (0x0378) und outb verursachten keinen Segfault. Versuchen Sie jedoch, entweder 0x378 oder 0x379 zu lesentat Ursache eines Segfault. Ich beginne zu vermuten, dass das Problem mit der Hardware zusammenhängt.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage