Netzwerkkartentreiber programmieren

Hallo Gemeinde,

gibt es eigentlich irgendwo im Netz informationen darüber, wie man einen Netzwerkkartentreiber unter GNU C programmieren kann?
Wenn Assembler sein muss, dann NASM.
Bin gerade dabei mich in die Netzwerktechnik reinzufummeln, weiss aber nicht wo ich ansetzen soll.
Das OSI 7 Schichten Modell habe ich schon theoretisch durchgenommen.
wer mal gugkn will was ich das so treibe, kann sich den Source einer ISO Datei herunterladen - ist ein kleines OS - naja mehr spielerrei.

hier die URL:
ftp://kallup.no-ip.org/kabox

Also wer Informationen hat, wie man den Netzwerkkarten-String (bei mir ist das im Moment eine SIS AMD OnBoard Karte) herausbekommen kann und auf Grund dieses Strings dann einen Treiber programmieren kann und mir Infos dazu geben kann wäre ich voll auf zufrieden.

Mit freundlichen Grüßen und nachträglchen Ostergrüße
jkallup
 
Mal ne Frage zu deinem OS.
Ich habe es mir gerade heruntergeladen aber wie starte ich dieses?
Muss ich es zuvor noch compilieren??

Könntest du mir mal dein Programm etwas genauer Erläutern?
(Grunfunktion eines OS, was muss ich ich beachten, welchen compilier nutze ich am besten)

Ich versuche seitdem ich programmiere (10 Jahren) verzweifelt nach einer Lösung
für ein eingenes OS....
Also etwas ganz simples...Nicht Linux neu compilieren oder so...

Würde mich über eine Antwort sehr freuen!!!

(Ihr könnt mir auch einfach eine Mail schreiben! MasterOfMetallica@lycos.De)

DANKE!!
 
Hallo,

du benötigst die MinGW Entwicklungsumgebung (Windows).
Habe nochmal auf den FTP ein ISO-Boot Image gepackt.
Dieses habe ich unter vmware irgendwie nicht zum laufen benkommen, vielleicht auch nur bedienungsfehler.
Also hab ich das ganze unter VirtualPC von Microsoft getestet, um nicht ständig CD-Rohling zu opfern - da scheint es zu klappen.

Also ein OS ist ja nichts weiteres als ein Programm, das Kommandos entgegennimmt und diese ausführt.
Die Grundfunktionen halt (Schreiben eines Zeichens auf dem Bildschirm zum Beispiel, Speicherverwaltung, Garbage-Collector, Disketten oder Netzzugriffe)
Wie diese interne Funktionen dann angesprochen werden, das regelt dann unter Linux die Shell.
Also in der Shell "copy datei to A:" wird als Zeichenkette interpretiert und in interne Kommandos umgesetzt.
COPY wird dabei zum beispiel die interne Funktion "OSCopyFile(char *from, char *to);" zugeordnet.

Falls Du möchtest können wir uns zusammen tun ...
Ich programmiere auch schon seit 10 Jahren unter TP (Delphi) C und C++

Dabei programmiere ich meistens an mehreren Sachen.
Zur Zeit ist es zum Beispiel ein Interpreter in Delphi 7, bei dem ich mal Hilfe bräuchte, wegen einer verflixten Exception - bin halt nicht so gut in OOP Debuggen.

Und dann hab ich halt mal versucht bestehenden Code zu verwenden um ein eigenes OS zu basteln - naja mehr spielerei um mal zu sehen ob und wie man es macht, das der Computer nach dem Boot ein OS startet ...


MingW:
http://prdownloads.sourceforge.net/mingw/MinGW-3.1.0-1.exe?download

NASM für Windows:
http://www.kernel.org/pub/software/devel/nasm/binaries/win32/nasm-0.98-win32.zip

GCC:
http://prdownloads.sourceforge.net/mingw/gcc-core-3.3.1-20030804-1.tar.gz?download
 
So ich habe alles gedownloadet was du oben aufgelistet hast..
Ich bin nur was C bzw. C++ mehr ein Anfänger...

Was hat es mit dieser "MAKEFILE" auf sich? Und wie führe ich diese aus?

Wenn ich das richtig verstehe erzeugt diese "MAKEFILE" die "LOADER.SYS" auf dem
Cd-Image..Oder seh ich das falsch?

Und wie stelle ich das an, wenn ich statt des Images "mein eigenes" os auf Festplatte
installieren will?

Kurz gesagt kannst du mir den Source-Code ein wenig erläutern (und wie ich diesen richtige compiliere) und mir erklären was es mit dieser "MAKEFILE" und mit dem Programm"nasmw.exe " auf sich hat?Erzeugt diese das Image?

Wie gesagt ich kenne mich mit c nicht so gut aus...
Immer wenn ich ein kleines C-Programm schrieb, compilierte ich es mit
"gcc xyz.c" bzw. "gpp xyz.cpp".
Könntest du mir dies bitte genauer erklären?

Vielen Dank im voraus!!

Ciao Joshi (alias Metallica)
 
Hallo Joshi,

das Makefile dient eigentlich nur dazu, die Kommandos, die Du in der Konsole eingibst automatisch ausführt.

Ein Makefile baut sich in etwa so auf:
Kommentaren wird eine Raute (#) vorangestellt.

# all dient als kürzel, für "Make" all, dort kannst du alle Optionen angegeben, die kompiliert werden sollen.
# Du kannst aber auch speziefische makes machen
all:

# zum beispiel:
boot-cd: macro1 macro2

#da wird dann alles kompiliert was unter der konsole mit "make boot-cd" angegben wurde.

Beispiel:

# BOF

all: meine.exe

objs = objectfile1.o

objectfile1.o: objectfile1.c
gcc -O2 -c objectfile1.c -o objectfile1.o

meine.exe: $(objs)
gcc -o meine.exe $(objs)

#EOF


hier wird zum Bleistift alles Kompiliert (all) was dort angegben wurde (meine.exe).
im macro meine.exe: $(objs) unten wird angegeben, welche dateien vorhanden sein müssen = $(objs) ist dabei der Platzhalter für die im macro "objs" (oben) object files.
das macro "objs" setzt dann wiederrum die Datei objectfile1.o vorraus, die wiederum (als macro in der mitte) mit gcc -O2 ... übersetzt wird.

falls du die make.EXE noch nicht haben solltes, kann diese unter
http://prdownloads.sourceforge.net/mingw/make-3.79.1-20010722.tar.gz
herunter geladen werden.

das Makefile erzeugt also die LOADER.SYS automatisch und erstellt das cd-image (makecd.exe)

als erstes werden im Makefile die benötigten Tools erstellt.
dann die object files.
boot.asm ist dabei die erst Datei.
diese dient als bootsector loader, um überhaupt booten zu können.
modes.S dient zum enablen des Protected Modus (wichtig für 32-Bit Anwendungen)

video enthält ein Paar Bildschirm-Operationen.

mm - Speicher manager

int386 dient zum ansprechen eines Interrupts, da nicht direkt ein "INT 0x??" (Assembler) in 32 Protected Mode gemacht werden kann.

i386trap dient für die behandlung von evetuell auftrettenden Exceptions.

und der rest _umoddi3.o, .. sind extrahierte module aus der standard libary, der der gcc als symbol erzeugt während des compilens.

ich schau gerade mal ob diese überhaupt im Archiv mit sind ...

Was schriebbselst denn für Programmiersprachen sonst noch?
Du hast doch oben geschrieben das Du schon 10 Jahre programmierst ...
Ich hoffe Delphi ...
Da brauch ich ne helfende Hande ...

Jens
 
Juchu es funzt!!!

Mal ne Frage wie kann ich ein "char" zu einem String addieren?

Beispiel:

char mein_char[2];
char *mein_string;

mein_char[0]=97;
mein_char[1]=98;
mein_char[2]=99;

mein_string=mein_char[0] && mein_char[1] && mein_char[2];

bzw.

mein_string=mein_char[0] + mein_char[1] + mein_char[2];


funktioniert nicht! Warum?
Ich wollte es in der "start.c" benutzen um eine Konsole zu schreiben,so dass
die zeichen aus der Variable (ich glaube die variable war c) in einer Stringvariable
addiert werden...

wie kann ich die header "stdio.h" nicht benutzen? Selbst wenn ich die
funktionen printf(); (ich vermute mal du hast diese selbst geschrieben) aus dem
Source code entferne, funktioniert dies nicht...
Könnte es evtl. daran liegen das sich die printf(); funktion auf die "video.h" bezieht
und funktion aus der stdio.h nicht?
Oder muss ich alle funktionen "neu" schreiben?

Ich hoffe du kannst mir weiterhelfen...

Ciao Metallica

Ich habe jahrelang nur Basic programmiert und seit ein paar Jahren versuche ich mich
an c bzw c++. Aber jetzt schnalle ich allmählich wie die Sprache funktioniert...
Seit dem ich mir dein OS gesaugt habe, beschäftige ich mich ziemlich intensiv mit c
und siehe da: es klappt (fast) alles....
 
Um einen oder mehrere chars zu einen String zu verknüpfen würde ich in C folgendes machen:

#include <stdio.h>
#include <strings.h>

int main(int argc, char **argv)
{
char mein_string[20]; // statischer Puffer mit 20 Zeichen
char mein_charA, mein_charB;

mein_charA = 65; // 0x41
mein_charB = 66;
sprintf(mein_string,"%c%c",mein_char_A,mein_charB);
printf("--> %s\n", mein_string);
system("pause");
}

oben wird mein_string als statischer Puffer verwendet, wenn dieser aber dynamisch verwaltet wird, wie es zum Beispiel bei char *mein_string; der Fall ist, muss dieser Speicher erst allokiert werden.
Das heisst, bei dynamischen Strings ist die Länge am Anfang nicht bekannt und kann dann während der Laufzeit geändert werden (verkleinert oder vergrössert).
Wenn Du keinen Speicher zuweist, kommt es zu einen Fehler - denn wo im Speicher soll den geschrieben werden ...

#include <stdio.h>
#include <strings.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
char *mein_string; // Länge hier noch nicht bekannt
char A = 0x41, B = 66; // einfache Zuweisung

mein_string = (char*) malloc(20); // 20 Bytes Speicher zuweisen ...
sprintf(mein_string,"--> %c,%c\n",A,B);
printf(mein_string);
system("pause");

free(mein_string);
}

Leider kannst Du die Prototypen-Include-Datei stdio.h nicht direkt benutzen, da alle Funktionen für das System neu geschrieben werden müssen.
In video.c zum Beispiel befindet sich "printf". Sie ist nicht 100% kompatibel zur eigentlichen printf stdlib Funktion.
Wie gesagt, alles muss neu geschrieben werden.
Wie Du sehen kannst im Quellcode wird in der printf-Funktion "VideoPutChar" aufgerufen, diese ist ebenfalls in video.c geschrieben, die direkt auf den Videospeicher ein Zeichen schreibt (0xa000).
 
Zurück
Oben