Autor Thema: C Kernel starten  (Gelesen 25197 mal)

bscreator

  • Gast
Gespeichert
« am: 14. March 2011, 10:31 »
Hallo,

möcht mich nach jahrelangem Kampf mit Assembler mal wieder mit C rumschlagen und meinen ASM-Kernel durch einen C-Kernel ersetzen.
Das Tutorial über "Einen C-Kernel starten hab ich schon gelesen, allerdings will ich es selbst machen und so verstehen.
Was ich bisher weiß über die einzelnen Schritte, um einen C-Kernel zu starten:

1. ASM-Bootloader
2. Sprung in den Protected Mode
3. Laden des C-Kernels
4. Anspringen der C-Kerneladresse

Und momentan bin ich beim Übergang von 1 zu 2.
Viele sagen, dass man den Bootloader nicht selbst sondern mit GRUB machen soll -> Sorry, dem kann ich nicht zustimmen. Ich schreib lieber alles selbst.

Stimmen die obigen 4 Schritte überhaupt.?

Viele Grüße,
bsc


DerHartmut

  • Beiträge: 236
    • Profil anzeigen
    • Mein Blog
Gespeichert
« Antwort #1 am: 14. March 2011, 11:14 »
Viele sagen, dass man den Bootloader nicht selbst sondern mit GRUB machen soll -> Sorry, dem kann ich nicht zustimmen. Ich schreib lieber alles selbst.

Sorry, aber wenn du oft gesagte und noch öfter gepredigte gute Ratschläge nicht beachtest wirst du auch wenig Hilfe finden. Ohne jetzt erneut die uralte Diskussion zu öffnen sei dir folgendes gesagt:

Ein eigener Bootloader ist ein Projekt für sich, selbst wenn dieser noch so popelig sein soll und lediglich deinen Kernel laden soll. Aber wieso damit die Mühe machen? GRUB erledigt das und vieles weiteres für dich.

Und da du selber sagst, dass die Arbeit mit Assembler ein Kampf war, warum dann Zeit investieren und einen Bootloader schreiben?
$_="krJhruaesrltre c a cnp,ohet";$_.=$1,print$2while s/(..)(.)//;
Nutze die Macht, nutze Perl ;-)

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 14. March 2011, 13:38 »
Dein eigener Bootloader wird den Kernel vielleicht von Diskette oder Festplatte (mit BIOS-Funktionen) starten können, sogar mit Dateisystem. Aber Dinge wie Netzwerkboot und ähnliches gehen dann halt nicht. Wenn du GRUB nicht magst, nimm etwas anderes - es gibt noch andere Urlader auf dieser Welt.

Um den C-Kernel starten zu können, springst du einfach die Funktion "main" an. Der Kernel setzt eine bestimmte Umgebung voraus (das kann Protected Mode mit aktivem Paging sein, das kann aber auch Real Mode mit Segmentierung sein), die muss der Bootloader erzeugen. Deine Liste ist eine mögliche Herangehensweise, wenn auch unpraktisch.

Ansonsten bist du in der Wahl der Waffen frei.

Gruß,
Svenska

bscreator

  • Gast
Gespeichert
« Antwort #3 am: 14. March 2011, 14:04 »
Zitat
Und da du selber sagst, dass die Arbeit mit Assembler ein Kampf war, warum dann Zeit investieren und einen Bootloader schreiben?
Ja, irgendwie hast du recht.

Zitat
m den C-Kernel starten zu können, springst du einfach die Funktion "main" an. ... das kann aber auch Real Mode mit Segmentierung sein
Netzwerkboot usw. interressiert mich noch nicht.

OK, wenn meine Umgebung Real-Mode mit Segmentierung ist, kann ich dann einen C-Kernel durch einen einfachen JMP-Befehl (wie einen in ASM geschriebenen Kernel) einfach anspringen und so starten ?

Gruss,
bsc

sfan

  • Beiträge: 94
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 14. March 2011, 14:15 »
OK, wenn meine Umgebung Real-Mode mit Segmentierung ist, kann ich dann einen C-Kernel durch einen einfachen JMP-Befehl (wie einen in ASM geschriebenen Kernel) einfach anspringen und so starten ?
Ich halte es zwar für nicht so gute Idee einen Bootloader selbst zu schreiben....

Wenn du schon im Protected Mode bist, kannst du JMP benutzten.

Wenn nicht: Lies http://www.fh-zwickau.de/doc/prmo/pmtutor/text/index.htm!


Sfan
« Letzte Änderung: 14. March 2011, 14:17 von sfan »

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 14. March 2011, 14:51 »
Hallo,


OK, wenn meine Umgebung Real-Mode mit Segmentierung ist, kann ich dann einen C-Kernel durch einen einfachen JMP-Befehl (wie einen in ASM geschriebenen Kernel) einfach anspringen und so starten?
Grundsätzlich Ja. Das ist weitgehend unabhängig vom CPU-Mode. Du solltest aber noch die Aufrufkonvention bei der Übergabe von Parametern berücksichtigen falls die C-Funktion Parameter erwartet oder Werte zurück gibt. Falls Deine C-Funktion zurückkehren möchte wäre es aber geschickter im Assembler-Teil ein CALL anstelle eines JMP zu benutzen.


Ansonsten bist du in der Wahl der Waffen frei.
Das war Don Quichotte auch! Und was hat es ihm gebracht? ;)


Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

bscreator

  • Gast
Gespeichert
« Antwort #6 am: 14. March 2011, 18:01 »
OK,

wenn ich einen einfachen C-Kernel starten möchte, der lediglich einen Text ausgibt, muss ich zuerst eine
Binärdatei (*.bin) aus dem Kernel machen.

Brauche ich dazu sowas wie einen Cross-Compiler ?
Und einen speziellen Linker ?

Gruss,
bsc

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 14. March 2011, 18:29 »
Nein.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #8 am: 15. March 2011, 18:21 »
OK, wenn meine Umgebung Real-Mode mit Segmentierung ist, kann ich dann einen C-Kernel durch einen einfachen JMP-Befehl (wie einen in ASM geschriebenen Kernel) einfach anspringen und so starten?
Grundsätzlich Ja. Das ist weitgehend unabhängig vom CPU-Mode. Du solltest aber noch die Aufrufkonvention bei der Übergabe von Parametern berücksichtigen falls die C-Funktion Parameter erwartet oder Werte zurück gibt. Falls Deine C-Funktion zurückkehren möchte wäre es aber geschickter im Assembler-Teil ein CALL anstelle eines JMP zu benutzen.
Das ist aber nicht unabhängig vom Compiler. Der gcc erzeugt 32Bit Code und das kann/sollte man nicht einfach so anspringen, sondern man muss vorher in den Protected-Mode.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 15. March 2011, 19:12 »
Hallo,


Das ist aber nicht unabhängig vom Compiler. Der gcc erzeugt 32Bit Code und das kann/sollte man nicht einfach so anspringen, sondern man muss vorher in den Protected-Mode.
Ich meinte dass das Anspringen des C-Codes aus dem Assembler-Code heraus immer nach ungefähr dem selben Grundprinzip abläuft, das man dabei natürlich die Gegebenheiten vom Compiler (Aufrufkonventionen usw.) und die Bedürfnisse des vom Compiler generierten Binär-Codes (CPU-Mode usw.) beachten muss hab ich einfach mal so stillschweigend vorausgesetzt.


@bscreator:
Es muss halt einfach alles zusammen passen, also der vom Compiler generierte Code erwartete CPU-Mode, Aufrufkonventionen usw. müssen von Deinem Assembler-Code passend vorbereitet werden. In was für einem Datei-Format der C-Kernel vorliegt ist auch eher nebensächlich solange Dein Assembler-Code oder der benutzte Boot-Loader das korrekt verarbeiten kann, hierfür wird aus vielen praktischen Gründen ELF und Grub empfohlen (was ich Dir hiermit ebenfalls ans Herz legen möchte) aber damit fällt natürlich Real-Mode und Segmentierung (auch im PM) aus.


Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

bscreator

  • Gast
Gespeichert
« Antwort #10 am: 19. June 2011, 12:34 »
So, jetzt gehts langsam los mit nem C-Kernel.

Kennt ihr nen guten Windows C-Compiler, der auch 16 Bit Code erzeugen kann?
Im Internet gibts soviel ich weiß nur 32 Bit Code-Compiler. Da bin ich mir aber nicht sicher, ob die auch 16-Bit Code erzeugen können (für Real Mode).

Vielen Dank,
bscreator (der nix mit GRUB und Protected Mode anfangen will)

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 19. June 2011, 13:21 »
Dieser Text wird unter jedem Beitrag angezeigt.

bscreator

  • Gast
Gespeichert
« Antwort #12 am: 20. June 2011, 15:09 »
Zitat
http://forum.lowlevel.eu/index.php?topic=2352.0
Vielen Dank, hilft mir aber überhaupt nicht, da es diesen nicht zum Download gibt.
Gibts auch nen anderen 16-Bit-C-Compiler ?

Wenn ich dann nen 16-Bit-C-Compiler hab, wie kann ich dann die OBJ-Datei, die vom Compiler erstellt wird, in eine Binary umwandeln, bzw. welchen Linker sollte ich dann verwenden ?

Vielen Dank,
bscreator

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 20. June 2011, 15:36 »
Hast du das überhaupt gelesen?

Den BCC gibt es für Linux (mit dem wurde ELKS entwickelt) und Turbo C 2.01 (1989) ist von Borland freigegeben worden. Die Originalseite gibt es nicht mehr, aber die Datei TC201.ZIP findet man trotzdem, z.B. unter ftp://ftp.univ-paris5.fr/Windows/TurboC/tc201.zip.

Gibt es einen Grund für "ich will Real Mode und keinen GRUB" oder ist das einfach nur ein "aber ich will das so und damit fertig"?

Mit MS-DOS wurde (wimre auf der Supplement-Disk) das Tool EXE2BIN geliefert. Was das tut, weiß ich nicht genau. Ansonsten kannst du natürlich auch COM-Dateien erstellen, das sind an 100h gelinkte Binaries. Der Linker von Turbo C heißt TLINK. Ein Debugger deiner Wahl dürfte DEBUG sein (gehört ebenfalls zu MS-DOS).

Ansonsten setzt du gerade auf Technologien, die ungefähr 20 Jahre alt sind. Damit bin ich kaum älter als dein C-Compiler und das trifft wohl für die meisten hier zu. Erwarte also keine Hilfe.

Gruß,
Svenska
« Letzte Änderung: 20. June 2011, 15:42 von Svenska »

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 20. June 2011, 17:21 »
Hallo bscreator,


wie schon in dem verlinkten Thread möchte ich Dir noch mal den Open-Watcom-Compiler ans Herz legen, der kann 16-Programme für den Real-Mode erstellen (auch 32Bit-Programme die dann natürlich einen >=386 erfordern aber trotzdem den selben Real-Mode-Beschränkungen unterliegen) und es gibt eine recht hübsche und komfortable Windows-IDE dazu (hab ich ein paar Jahre lang mit gearbeitet). Die ganzen Tools (Compiler, Linker usw. , ein MAKE-Verschnitt ist wimre auch dabei) sollten alle auch unter reinem DOS laufen so das man komplett unter DOS entwickeln kann (falls Du einen brauchbaren Editor für DOS hast).

Das EXE2BIN kann nur die MZ-Executables in ein Simples Binär-Datei umwandeln die auch so schon ziemlich simpel sind (also nur ein Segment enthalten und keine Relozierung beim Laden benötigen) was defacto auf keine EXE zutrifft die aus einem normalen Compiler rauspurzelt. DEBUG ist zwar extrem spartanisch aber trotzdem nicht zu verachten. Empfehlen würde ich aber eher eine DOS-Version von codeview von MS (auch damit hab ich einige Zeit gearbeitet, zumindest mit Programmen die mit einem DOS-Extender im PM liefen).

Auf reine Binär-Dateien würde ich aber trotzdem nicht zurück greifen, das MZ-EXE-Format ist eigentlich recht simpel.
Erklärt hatte ich das schon mal: http://forum.lowlevel.eu/index.php?topic=2631.msg29953#msg29953.

Wo ich gerade so die alten Threads von Dir durchgegangen bin, um das eben zu finden, ist mir aufgefallen das Du nicht wirklich vorwärts zu kommen scheinst. Ich will Dir ja nicht in Dein Projekt rein reden aber vielleicht solltest Du erst mal einen der großzügig ausgetrampelten Standard-Wege (32Bit-PM / ELF / GRUB) benutzen um überhaupt mal zu etwas zu kommen und dabei auch den richtigen Umgang mit den nötigen Tools zu lernen. Wenn Du danach dann richtig Ahnung hast kannst Du Dich immer noch mal auf den Real-Mode stürzen. Ich kann ja nachvollziehen das der Real-Mode durchaus eine gewisse Anziehungskraft hat aber aufgrund seiner speziellen Komplexität und der Tatsache das er seit 20 Jahren nicht mehr ernsthaft benutzt wird ist dieses Unterfangen nicht gerade einfach.

Ich bin zwar alt genug um von dem was Du tun möchtest noch einigermaßen Ahnung zu haben (in den gut 10 Jahren die ich Programme für DOS entwickelt habe war auch einiges Real-Mode-Zeugs dabei) aber wirklich helfen kann auch ich Dir kaum da es Dir meiner persönlichen subjektiven Meinung nach einfach noch am nötigen Basiswissen fehlt. Daher kann ich Dir nur raten Dich erst einmal mit normaler SW-Entwicklung zu beschäftigen bis Du mit Compiler/Assembler/Linker/Objekt-Formaten/.... sicher und unfallfrei umgehen kannst und dann noch mal einen Anlauf in Richtung OS-Entwicklung zu nehmen.


Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

bscreator

  • Gast
Gespeichert
« Antwort #15 am: 20. June 2011, 17:32 »
Hallo

Mit
ftp://ftp.univ-paris5.fr/Windows/TurboC/tc201.zip
klappts besser aber vielen Dank svenska.
Zitat
Gibt es einen Grund für "ich will Real Mode und keinen GRUB" oder ist das einfach nur ein "aber ich will das so und damit fertig"?
Momentan noch "damit fertig".

Naja, wenn es so schwer ist, kann ich dann im Real-Mode auch 32-Bit-C-Code ausführen ?
Oder gibts da dann Probleme damit ?

PS: Mir ist egal, ob der Code 16 oder 32-Bit groß ist. Hauptsache er funktioniert im 1 MB grossen
Real-Mode.

Gruss,
bsc

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 20. June 2011, 17:39 »
Du übergehst alle Hinweise wissentlich und willentlich. Dann weißt du es also besser. :roll:

Nein, du kannst im Real-Mode ohne weiteres keinen 32-Bit-Code ausführen. Wenn du es unbedingt möchtest, dann hast du die gleichen Probleme wie bei 16-Bit-Code im Real-Mode. Wenn du die gelöst kriegst: Ja, es geht.

DerHartmut

  • Beiträge: 236
    • Profil anzeigen
    • Mein Blog
Gespeichert
« Antwort #17 am: 20. June 2011, 17:43 »
Deine ganzen Threads scheinen so, als ob du Anfänger wärst, der gar nicht erst irgendetwas lernen will sondern schnell und einfach irgendwas hinfrickeln will, das irgendwie funktioniert.

Lern' doch einfach mal die Basics (damit meine ich nicht einen Bootloader schreiben oder Real-Mode, sondern einen Bootloader benutzen und Protected Mode), dann fällt vieles leichter, die Fragen werden (hoffentlich) besser und deine Reputation ebenso.
$_="krJhruaesrltre c a cnp,ohet";$_.=$1,print$2while s/(..)(.)//;
Nutze die Macht, nutze Perl ;-)

bscreator

  • Gast
Gespeichert
« Antwort #18 am: 20. June 2011, 18:20 »
OK, dann werd ich mal mein Herz ausschütten :
Klar will ich was lernen. Aber all die leider viel zu theoretischen Betriebssystemvorlesungen hab mir nicht besonders viel gebracht. Mein Wunsch ist es nur, ein Betriebssystem zu programmieren. Das mit Assembler klappt schon ganz gut und mir wurde gesagt, dass zu einem Betriebssystem auch ein Bootloader gehört, den man ebenfalls selber programmieren sollte.

Zitat
dann fällt vieles leichter, die Fragen werden (hoffentlich) besser und deine Reputation ebenso.
Dann fällt mir vieles leichter, wenn ich bereits vorgefertigte Programme nehm, die mir das abnehmen ?

Über die ganzen Bootloader, die es gibt (qemu,...) weiss ich nicht viel, außer dass diese Booten und in den Protected Mode schalten. Und mein OS sollte eben auf sovielen Rechnern wie möglich funktionieren, dazu gehören evtl. auch Rechner<386, d.h. nix mit Protected Mode.

bscreator

  • Gast
Gespeichert
« Antwort #19 am: 20. June 2011, 18:24 »
PS:
das OS das ich schreiben will, sollte eigentlich nur so wenig Arbeitsspeicher wie möglich brauchen und auch auf älteren Rechnern noch funktionieren. Und im Protected Mode verbraucht man soviel ich weiß, wesentlich mehr RAM als im Real-Mode.

Aber wenn dann vieles leichter fällt mit z.B. QEMU, dann lernt man doch nicht, was hinter QEMU abläuft, oder ?

PS: Und ich will eigentlich nur SOVIEL ÜBER BETRIEBSSYSTEME LERNEN WIE MÖGLICH.
« Letzte Änderung: 20. June 2011, 18:34 von bscreator »

 

Einloggen