D
das.chaos
Guest
Nun denn, ich hatte mich wohl (zuvor) ins falsche Unterforum verirrt und die falschen Fragen gestellt (sowas passiert mir abundan, wenn ich dann irgendwie mich verhaspel - liegt am kaffee - und vom Thema abschweife, mein Nickname kommt nicht von ungefaehr), egal... sorry, habe wenig Erfahrung mit www Foren und dergleichen, da ich mich eher selten im sogenannten www des Internets bewege.
Im Laufe der Zeit, seitdem ich FreeBSD kennenlernte, entwickelte sich bei mir (zunaechst aus reiner Neugier) ein signifikantes Interesse bzgl. Betriebssystemarchitektur und dessen programmatischer Optimierung.
Bevor man als Student eigeninitiativ (in Bibliotheken und oder im besagten www, wie oftmals von der Systemumwelt gefordert wird), vernuenftig (!) recherchieren kann, ist es manchmal als "Unwissender" unumgaenglich, Wissende nach bestimmten Namentlichen Bezeichnungen oder Begrifflichkeiten aus dem Bereich Betriebsystementwicklung und Softwarearchitektur mit der Zielsetzung zu erfragen (ohne dasz man als sogenannter Kretin bzw. unwissentlich als Provokant wahrgenommen wird), um Recherecheaktivitaeten in eine guenstige Richtung zu verlagern. Eine detaillierte Recherche gestaltet sich schwierig, wenn man nach was sucht, was man nicht namentlich kennt (oder kennen kann).
Um es vorweg zu nehmen, Literaturverweise die innerhalb folgenden Quellen existieren:
o Design and Implementation of the FreeBSD Operating System, McKusick
o TCP/IP Illustrated Vol. 2, Stevens
o Buecher von Joseph Kong
o Modern Operating Systems, Tannenbaum
habe ich schon beruecksichtigt und bin diese am analysieren. Unter anderem beruecksichtige ich bspw. in /usr/share/doc und /usr/share/examples existierende Dokumentation.
Nun, einige ernstgemeinte Fragen...
#1:
Fuer Testzwecke habe ich mir mal just for fun eine netgraph(4) Klasse implementiert, welche einen OSI-L2 basierenden Datenstrom nach Rahmentyp demultiplexiert und umgekehrt (man musz ja mit seinem Computer etwas "spielen" und sich "austoben" bzgl. Autodidaktik).
Das Verhalten einer Instanz steht in Abhaengigkeit, welche Hooks in Bezug zur Systemumwelt dieses Knotens stehen bzw. ob diese einen Hook einer Partnerinstanz referenzieren. D. h. keine Referenz impliziert keinen moeglichen Datenkanal fuer systeminterne Verteilung von Information (bzw. Referenzen auf Dateneinheiten /-objekte). Mindestens der Downstreamhook und ein beliebig anderer Hook sollten mit fremden Instanzen (oder auch der selben und mit mindestenz einer fremden Instanz, die mindestens einen Hook oder mehrere Hooks zur Verfuegung stellen kann) assoziiert sein, sonst werden keine message_primitives (OSI-Terminologie: gemeint sind Mbufs oder auch diese kapselnden struct ng_item Container) verarbeitet (entweder werden gebundene Ressourcen per m_freem(9) freigegeben sowie die der erwaehnten Container oder wiederum das Einbetten von Mbufchains oder Mbufs in einen besagten Container und Uebergabe seiner Referenz an eine Partnerinstanz).
Ich bin mal so mutig und poste (als unerfahrene Person bzgl. C im Kontext von Systementwicklung, daher bitte nicht Steinigen wenn Fehler gegeben sind, aufgrund mir unbekannter Ur- und Tatsachen, ein Malerlehrling kann unmoeglich ein Picasso sein) einen Auszug, um den Kontext der hier gegebenen Fragestellung (#1) darzustellen. Nun gut, dann sorge ich mal fuer *more drama*
Im Hinblick gegebener Autodidaktik studiere ich (seit geraumer Zeit intensiv), im Rahmen des Informatikstudiums und aus privaten Interesse, den mir in /usr/src/sys dargebotenen Quellcode, mir ist aufgefallen, dasz haeufig von goto's bzgl. Exceptionhandling, was ich als Verfahrensweise naiv in o.g. Beispielcode uebertragen habe.
Es existiert stets die Moeglichkeit Exceptionhandling
bspw. als
zu realisieren.
Naiv gefragt: Gibt es spezifiche (technische) Vorraussetzungen (Stichworte: heap, stack, text, bss Segment ?!??), wann eine der beiden Formen von Exceptionhandling zu praeferieren sei und oder gemischte Verfahrensweisen geboten sind? Steht dieses im Bezug zur Effizienz (O(blablubb) etc.pp.)? Wieso werden goto's als schlechter Stil betrachtet, aber warum wird haeufig davon gebrauch gemacht, insbesonders dann, wenn es sich um Softwaremodule handelt, die dem Kernelspace zugeordnet sind?
#2:
Existieren, abgesehen von style(9), Literatur oder Industrielle Standards (Normschriften), welche Programmierrichtlinien bzgl. Kernel Normal Form (KNF) diskutieren? Gibt es eine zu empfehlen aus perspektive eines (erfahrenen) Systementwicklers?
#3:
Mir wurde MISRA-C empfohlen (*danke*), was ich mir umgehend bestellt habe. Gibt es nocht mehr derartige Richtlinien, die Unix Systementwicklung bzw. Betriebsystemarchitektur zum Gegenstand haben?
#4
Oder mir ist bei naeherer Untersuchung von Quellcode, bspw. aus /usr/src/net/if_clone.h, folgende Konvention bzgl. Strukturen aufgefallen
Bei Artefakten bzw. Members wird in der namentlichen Bezeichnung ein Praefix aus den ersten Buchstaben der Bestandteile der Strukturbezeichnung gebildet.
Code:
dann begegne ich beim Quellcodestudium oftmals Strukturen, wo diese Konvention nicht gelten vermag. Ist die o.g. Form namentlicher Bezeichnung willkuerlich oder hat dies einen speziellen Hintergrund bzw. eine spezifische Systematik, der irgendeiner (mir logischerweise unbekannten) Industrienorm zugrundeliegt? (Wenn ja, welche??? Wo kann ich diesbezueglich Informationen abschoepfen?). Usw.Usf.
Auf welchen Namensraumkonvetionen baut denn der Quellcode oder Teile aus /usr/src/sys auf???
Literaturtips?
#5:
Vor geraumer Zeit habe ich mir das Buch "Design Patterns" beschafft, gibt es aehnliche empfehlenswerte Literatur, welche sich aus Softwareentwicklersicht spezifisch mit Betriebssystemarchitektur befasst (ich meine jetzt nicht "Modern Operating Systems" von Tannenbaum - das ist mir zu oberflaechlich)?
Ich wuerde mich ueber fundierte Antworten freuen, da ich ein ernsthaftes Interesse verfolge, irgendwann einen klitzekleinen und unbedeutenden Beitrag zum FreeBSD Projekt leisten zu koennen (ich kann ja nicht nur nehmen, ich will auch zurueckgeben).
Im Laufe der Zeit, seitdem ich FreeBSD kennenlernte, entwickelte sich bei mir (zunaechst aus reiner Neugier) ein signifikantes Interesse bzgl. Betriebssystemarchitektur und dessen programmatischer Optimierung.
Bevor man als Student eigeninitiativ (in Bibliotheken und oder im besagten www, wie oftmals von der Systemumwelt gefordert wird), vernuenftig (!) recherchieren kann, ist es manchmal als "Unwissender" unumgaenglich, Wissende nach bestimmten Namentlichen Bezeichnungen oder Begrifflichkeiten aus dem Bereich Betriebsystementwicklung und Softwarearchitektur mit der Zielsetzung zu erfragen (ohne dasz man als sogenannter Kretin bzw. unwissentlich als Provokant wahrgenommen wird), um Recherecheaktivitaeten in eine guenstige Richtung zu verlagern. Eine detaillierte Recherche gestaltet sich schwierig, wenn man nach was sucht, was man nicht namentlich kennt (oder kennen kann).
Um es vorweg zu nehmen, Literaturverweise die innerhalb folgenden Quellen existieren:
o Design and Implementation of the FreeBSD Operating System, McKusick
o TCP/IP Illustrated Vol. 2, Stevens
o Buecher von Joseph Kong
o Modern Operating Systems, Tannenbaum
habe ich schon beruecksichtigt und bin diese am analysieren. Unter anderem beruecksichtige ich bspw. in /usr/share/doc und /usr/share/examples existierende Dokumentation.
Nun, einige ernstgemeinte Fragen...
#1:
Fuer Testzwecke habe ich mir mal just for fun eine netgraph(4) Klasse implementiert, welche einen OSI-L2 basierenden Datenstrom nach Rahmentyp demultiplexiert und umgekehrt (man musz ja mit seinem Computer etwas "spielen" und sich "austoben" bzgl. Autodidaktik).
Das Verhalten einer Instanz steht in Abhaengigkeit, welche Hooks in Bezug zur Systemumwelt dieses Knotens stehen bzw. ob diese einen Hook einer Partnerinstanz referenzieren. D. h. keine Referenz impliziert keinen moeglichen Datenkanal fuer systeminterne Verteilung von Information (bzw. Referenzen auf Dateneinheiten /-objekte). Mindestens der Downstreamhook und ein beliebig anderer Hook sollten mit fremden Instanzen (oder auch der selben und mit mindestenz einer fremden Instanz, die mindestens einen Hook oder mehrere Hooks zur Verfuegung stellen kann) assoziiert sein, sonst werden keine message_primitives (OSI-Terminologie: gemeint sind Mbufs oder auch diese kapselnden struct ng_item Container) verarbeitet (entweder werden gebundene Ressourcen per m_freem(9) freigegeben sowie die der erwaehnten Container oder wiederum das Einbetten von Mbufchains oder Mbufs in einen besagten Container und Uebergabe seiner Referenz an eine Partnerinstanz).
Ich bin mal so mutig und poste (als unerfahrene Person bzgl. C im Kontext von Systementwicklung, daher bitte nicht Steinigen wenn Fehler gegeben sind, aufgrund mir unbekannter Ur- und Tatsachen, ein Malerlehrling kann unmoeglich ein Picasso sein) einen Auszug, um den Kontext der hier gegebenen Fragestellung (#1) darzustellen. Nun gut, dann sorge ich mal fuer *more drama*
Code:
struct protoent {
uint16_t type; /* frame type */
hook_p hook; /* refers peer hook of given instance */
};
struct ng_etype_split_softc {
struct protoent sc_arp;
struct protoent sc_ip;
struct protoent sc_pppoe;
struct protoent sc_pppoedisc;
struct protoent sc_revarp;
struct protoent sc_orphan;
struct protoent sc_downstream;
... unwichtiger trash, statistiken, etc.pp. ...
node_p node; /* backpointer to node structure of instance */
};
typedef struct ng_etype_split_softc *sc_p;
... nochmehr trash, constructoren, destructoren, messaging stuff ...
static int
ng_etype_split_rcvdata(hook_p hook, item_p item)
{
int err = 0;
struct mbuf *m;
const sc_p sc = NG_NODE_PRIVATE(NG_HOOK_NODE(hook));
const struct protoent *src = NG_HOOK_PRIVATE(hook);
if (!src) {
err = ENETDOWN;
if (item)
NG_FREE_ITEM(item);
} else {
struct protoent *dst;
struct ether_header *eh;
uint16_t type;
NGI_GET_M(item, m);
if (m->m_pkthdr.len < ETHER_HDR_LEN) {
err = EINVAL;
goto bad;
}
/*
* If data field of message primitive
* is contiguous.
*/
if (m->m_len < ETHER_HDR_LEN) {
m = m_pullup(m, ETHER_HDR_LEN);
if (!m) {
err = ENOBUFS;
goto bad;
}
}
eh = mtod(m, struct ether_header *);
type = ntohs(eh->ether_type);
switch (src->type) {
case ETHERTYPE_ARP:
case ETHERTYPE_IP:
case ETHERTYPE_PPPOE:
case ETHERTYPE_PPPOEDISC:
case ETHERTYPE_REVARP:
if ((src->type == type) && (sc->sc_downstream.hook))
NG_FWD_NEW_DATA(err, item, sc->sc_downstream.hook, m);
else {
err = EINVAL;
goto bad;
}
break;
case ORPHAN:
if (!sc->sc_downstream.hook) {
err = EINVAL;
goto bad;
}
NG_FWD_NEW_DATA(err, item, sc->sc_downstream.hook, m);
break;
default: /* If frame comes from downstream... */
switch (type) {
case ETHERTYPE_ARP:
dst = &sc->sc_arp;
break;
case ETHERTYPE_IP:
dst = &sc->sc_ip;
break;
case ETHERTYPE_PPPOE:
dst = &sc->sc_pppoe;
break;
case ETHERTYPE_PPPOEDISC:
dst = &sc->sc_pppoedisc;
break;
case ETHERTYPE_REVARP:
dst = &sc->sc_rarp;
break;
default:
dst = &sc->sc_orphan;
}
/*
* ... every mbuf chain wich not holds data in a
* cluster may be transformed for further processing,
* but single message primitives may passed and won't
* touched or passed throught orphan hook, if possible.
*/
if (dst->hook) {
if (m->m_next) {
int len = m->m_pkthdr.len;
char buf[len];
struct mbuf *n;
MGET(n, M_NOWAIT, MT_DATA);
if (!n) {
err = ENOBUFS;
goto bad;
}
MCLGET(n, M_NOWAIT);
if (!(n->m_flags & M_EXT)) {
m_freem(n);
err = ENOBUFS;
goto bad;
}
m_move_pkthdr(n, m);
m_copydata(m, 0, len, buf);
m_freem(m);
if (!m_append(n, len, buf)) {
m_freem(n);
err = ENOBUFS;
goto bad;
}
NG_FWD_NEW_DATA(err, item, dst->hook, n);
} else
NG_FWD_NEW_DATA(err, item, dst->hook, m);
} else {
if (!sc->sc_orphan.hook) {
err = EINVAL;
goto bad;
}
NG_FWD_NEW_DATA(err, item, sc->sc_orphan.hook, m);
}
}
}
return(err);
bad:
NG_FREE_M(m);
if (item)
NG_FREE_ITEM(item);
return(err);
}
Im Hinblick gegebener Autodidaktik studiere ich (seit geraumer Zeit intensiv), im Rahmen des Informatikstudiums und aus privaten Interesse, den mir in /usr/src/sys dargebotenen Quellcode, mir ist aufgefallen, dasz haeufig von goto's bzgl. Exceptionhandling, was ich als Verfahrensweise naiv in o.g. Beispielcode uebertragen habe.
Es existiert stets die Moeglichkeit Exceptionhandling
Code:
MGET(n, M_NOWAIT, MT_DATA);
if (!n) {
err = ENOBUFS;
goto bad;
}
Code:
MGET(n, M_NOWAIT, MT_DATA);
if (!n) {
NG_FREE_M(m);
NG_FREE_ITEM(item);
return(ENOBUFS);
}
Naiv gefragt: Gibt es spezifiche (technische) Vorraussetzungen (Stichworte: heap, stack, text, bss Segment ?!??), wann eine der beiden Formen von Exceptionhandling zu praeferieren sei und oder gemischte Verfahrensweisen geboten sind? Steht dieses im Bezug zur Effizienz (O(blablubb) etc.pp.)? Wieso werden goto's als schlechter Stil betrachtet, aber warum wird haeufig davon gebrauch gemacht, insbesonders dann, wenn es sich um Softwaremodule handelt, die dem Kernelspace zugeordnet sind?
#2:
Existieren, abgesehen von style(9), Literatur oder Industrielle Standards (Normschriften), welche Programmierrichtlinien bzgl. Kernel Normal Form (KNF) diskutieren? Gibt es eine zu empfehlen aus perspektive eines (erfahrenen) Systementwicklers?
#3:
Mir wurde MISRA-C empfohlen (*danke*), was ich mir umgehend bestellt habe. Gibt es nocht mehr derartige Richtlinien, die Unix Systementwicklung bzw. Betriebsystemarchitektur zum Gegenstand haben?
#4
Oder mir ist bei naeherer Untersuchung von Quellcode, bspw. aus /usr/src/net/if_clone.h, folgende Konvention bzgl. Strukturen aufgefallen
Code:
struct if_clone {
...
const char * ifc_name;
int ifc_maxunit;
...
};
Code:
Code:
Strukturname: if_clone => Membername: ifc_blablubb
Auf welchen Namensraumkonvetionen baut denn der Quellcode oder Teile aus /usr/src/sys auf???
Literaturtips?
#5:
Vor geraumer Zeit habe ich mir das Buch "Design Patterns" beschafft, gibt es aehnliche empfehlenswerte Literatur, welche sich aus Softwareentwicklersicht spezifisch mit Betriebssystemarchitektur befasst (ich meine jetzt nicht "Modern Operating Systems" von Tannenbaum - das ist mir zu oberflaechlich)?
Ich wuerde mich ueber fundierte Antworten freuen, da ich ein ernsthaftes Interesse verfolge, irgendwann einen klitzekleinen und unbedeutenden Beitrag zum FreeBSD Projekt leisten zu koennen (ich kann ja nicht nur nehmen, ich will auch zurueckgeben).
Zuletzt bearbeitet von einem Moderator: