Re: Netzwerktreiber/kernel-make-Fehler

From: Jan Peuker <lists(at)janus-graphics.de>
Date: Fri, 13 Sep 2002 23:47:00 +0200

Guten Abend,

ja ich weiß, ich halte mich nicht an die Regeln, liegt allerdings
hauptsächlich daran, dass ich BSD im Moment nicht sehr viel Zeit einräume.
Mein Hauptproblem ist der Rechner, ohne Diskettenlaufwerk und ohne Netzwerk
ist es *nervig* logs mal so eben "anzuhängen". Trotzdem Danke für Eure
Hilfe, jetzt wo ich weiß, das ich auch aufwändigere Fragen stellen darf,
kann ich mal richtig anfangen:
Harold schrieb:

> MFREE() ist in sys/kern/uipc_mbuf.c definiert, das sollte aber
> eigentlich auch zu jeden Kernel hinzugelinkt werden:

ergab bei mir auf einen grep uipc_mbuf.c /sys/conf/files hin diese
Meldung(also das gleiche):
kern/uipc_mbuf.c standard

Alexander schrieb:
> Huhu!
>
> > > beim make des Kernels folgenden Fehler: "if_hp.o: Undefined reference
to
> > > MFREE". Ich habe mir den C-Quelltext angesehen, eigentlich müsste
MFREE als
> > > Funktion(bzw. Makro) doch existieren, oder fehlen dafür Bibliotheken?
> > MFREE() ist in sys/kern/uipc_mbuf.c definiert, das sollte aber
> > eigentlich auch zu jeden Kernel hinzugelinkt werden:
>
> if_hp.c gibt es bei mir nicht - gehoert das zu dem Quelltext deiner
> Netzwerkkarte, die Du irgendwo runtergeladen hast?

ja, das gehört zum Treiber, den mir der Autor geschickt hat. Allerdings mit
dem Verweis, dass es für nen 4.3er Kernel gedacht war, und seit dem nicht
mehr upgedated wurde. Hier liegt vielleicht genau der Fehler. Allerdings war
auch noch eine 4.4er Testversion dabei, welche exakt die gleichen Fehler
liefert.

>
> In dem Fall ist es höchstwahrscheinlich ein Kernel-Modul, und das
> sollte dynamisch gelinkt werden, ergo sollten undefined references
> gar nicht auftreten.

eher kein Modul, denn ich musste die Dateien src/sys/conf/files und
src/sys/i386/i386/userconfig.c patchen, also Zeilen einfügen:
dev/hp100vg/if_hp.c optional hp
pci/if_hp_p.c optional hp
bzw.
{"hp", "HP Cascade series 10/100VG ethernet adapter", 0, CLS_NETWORK}

>
> Wahrscheinlich macht das Makefile nicht, was es soll, aber auch hier
> können wir wieder nur raten, da Du nur die Hälfte von Informationen
> lieferst (warst Du nicht der, der das auch schon bei pciconf gemacht
> hatte? :-)

ja, das war ich. Wie gesagt, ich behandle meine bsd-Probleme etwas
stiefmütterlich. Vor allem habe ich keinerlei Doku bis auf das Handbuch,
also keine Ahnung von pciconf oder so. Ich dachte bisher immer, die Fragen
wären allgemein auch zu beantworten.

>
> Bitte gewöhn Dir an, Logs zu schicken, mit denen man was anfangen kann.

Hier die wichtigen ;-) Zeilen aus dem make-output(das ist auch alles!):

if_hp.o: In function 'hp_start'
if_hp.o(.text+0x1093): undefined reference to MFREE

> Wenn Du keine Ahnung von C hast, dann könntest Du grob die 5-10 Zeilen
> vor der zuerst auftretenden FEhlermeldung auch noch mitschicken (und -
> während Du auf eine Antwort wartest - C lernen)
> Mit der Fehlermeldung alleine, einfach aus dem Kontext gegriffen, kann
> eigentilch niemand etwas anfangen.

Nun. Das schöne an C ist, selbst so Menschen wie ich "können" es, denn die
Sprache selber ist meines erachtens ein wenig simpler als das, was man damit
tun will(was das ganze Unterfangen ja so tückisch macht).
Die Fehlermeldung tritt an dieser Codestelle auf:

// Die Definition - mbuf scheint vorgebeben

struct mbuf *m, *m0;

// Dann folgt einiges, was offentsichtlich ein Paket bearbeitet, das Paket
ist m, das Startpaket wohl m0(nein!wirklich!)

 for (m = m0, offset = 0; m != 0;) {
  int clen;

  HP_OUTL(32_FRAGMENT_LEN, m->m_len);
  HP_OUTL(32_OFFSET, offset);
  /*
   * Need to pad to full longs. Note we can't
   * simply mcopy/outsl more out of the mbuf because
   * that may end up accessing an unmapped page...
   */
  clen = m->m_len & ~3;
  /* can this happen, an mbuf with < 4 bytes? */
  if (clen) {
   if (pio)
    HP_OUTSL(mtod(m, caddr_t), clen / 4);
   else
    memcpy((void *)sc->maddr, mtod(m, caddr_t), clen);
  }
  if (m->m_len & 3) {
   long lastl;
   memcpy(&lastl, mtod(m, caddr_t) + clen, m->m_len & 3);
   if (pio)
    HP_OUTL(DATA32, lastl);
   else
    memcpy((void *)(sc->maddr+clen), &lastl, 4);
  }
  offset += m->m_len;
  MFREE(m, m0);
  m = m0;
 }

Für mich sieht das wie eine "normale" Routine zum freischaufeln aus, also
hier vielleicht: gebe den Speicherblock m bis m0 frei?
In einem BSD-whitepaper wird das als Memorymanagment bei Netzwerktreibern
beschrieben - das ist der Grund warum ich annahm, dass dieses "Makro"
existieren müsste, siehe:
http://docs.freebsd.org/44doc/smm/18.net/paper-5.html

>
> Ausserdem hättest Du so gut sein können, und uns sagen können, wo es
> die Sourcen zu dem offensichtlich nur aus dritter Hand stammenden
> Treiber gibt, damit wir auch das nachvollziehen können.

s.o.

>
> Danke

Ich habe zu danken. Oder war das ironisch?

>
> Alex

jan

ps: ich würde es ja gerne selber schaffen!

To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Fri 13 Sep 2002 - 23:47:01 CEST

search this site