Autor Thema: Turbo C - COM Datei erstellen  (Gelesen 8092 mal)

Cjreek

  • Beiträge: 104
    • Profil anzeigen
Gespeichert
« am: 28. February 2010, 21:16 »
Hi,

Ich versuche gerade mit einer alten 16-Bit Turbo C Version eine 16-Bit COM-Datei zu erstellen, die ich auch für meinen Bootloader benutzen kann.

Habe dazu erstmal eine Testdatei erstellt:

test.c

int main()
{

}

Compilieren tue ich die Datei folgendermaßen:

Zitat
tcc -mt -c test.c

-c = Nur compilieren, nicht linken
-mt = Tiny Memory Model

Das funktioniert auch schonmal ganz gut und ich erhalte die gewünschte test.obj. Allerdings scheitere ich jetzt beim linken:

Zitat
tlink test.obj /n /t

/n = Keine default libs verwenden
/t = COM Datei erstellen

Allerdings erhalte ich immer die Meldung:

Zitat
Cannot generate COM file : invalid initial entry point address

Kenne mich aber weder mit dem Linker noch mit dem Compiler noch generell mit C wirklich gut aus.

Also wie kann ich ihm jetzt den richtigen Entry-Point (0x100) übergeben?

Per Compilerschalter oder irgendwie doch über den Linker oder sonst irgendwie?

Gruß
Cjreek
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

AGGROStar1991

  • Beiträge: 29
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 10. March 2010, 19:19 »
1.)Vorneweg, wenn du dich mit C nicht auskennst solltest du das mit dem Betriebssystem Lassen, bevor dus besser kannst.

2.)Bootloaderempfehlung=GRUB. Alles andere grenzt schon an masochismus .Und warum neu erfinden wos sowas tolles gibt?

3.)Bootloader( und so ziemlich alles bis zum PM) schreibt man eig in Assembly

4.)Warum nutzt du Turbo C und COM-Dateien? wenns schon 16-bit C sein muss nimm bcc der wird wenigstens noch entwickelt^^

mfg

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 10. March 2010, 20:55 »
1.)Vorneweg, wenn du dich mit C nicht auskennst solltest du das mit dem Betriebssystem Lassen, bevor dus besser kannst.
Naja, wenn man es durchzieht, ist die Lernerfahrung u.U. wesentlich höher. Grundlegende Kenntnisse der Programmiersprache sind aber nötig (und je weniger Ahnung von C, desto mehr Ahnung brauchst du von der Hardware...)

2.)Bootloaderempfehlung=GRUB. Alles andere grenzt schon an masochismus .Und warum neu erfinden wos sowas tolles gibt?
Ich persönlich mag GRUB nicht und nutze auf meinem eigenen Rechner ein Syslinux (Extlinux). Der beherrscht auch andere Formate. Zum Einstieg würde ich trotzdem ebenfalls Grub empfehlen; einen eigenen Bootloader kannst du später noch nachschieben.

3.)Bootloader( und so ziemlich alles bis zum PM) schreibt man eig in Assembly
Nicht zwingend, in C geht es auch und wird auch relativ oft gemacht. In Assembler wird meist nur die Hardware-Initialisierung (Taktfrequenz, Speichereinrichtung, Stack) gemacht, damit compilergenerierter Code lauffähig ist.

4.)Warum nutzt du Turbo C und COM-Dateien? wenns schon 16-bit C sein muss nimm bcc der wird wenigstens noch entwickelt^^
Richtig. ;-)

Eine COM-Datei ist im Übrigen nicht als Bootloader gebrauchbar, da dort von <seg>:100h ausgegangen wird, das BIOS den Bootsektor aber nach (absolut) 7c00h lädt. Was du möchtest, ist ein "flat binary" oder auch "raw format", wie das genannt wurde, weiß ich nicht. Du kannst eine EXE mit dem Tool EXE2BIN (gehört zu DOS dazu) in eine Binärdatei umwandeln. Inwieweit da die Offsets stimmen, weiß ich aber auch nicht.

Möglicherweise stört sich der Linker auch an deiner leeren main()-Funktion. Hast du da auch was drin stehen? Wenn nicht, und er optimiert die Funktion weg, dann hat der Linker nichts zu linken und damit auch keinen entry point...

Gruß,
Svenska

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 10. March 2010, 22:27 »
Möglicherweise stört sich der Linker auch an deiner leeren main()-Funktion. Hast du da auch was drin stehen? Wenn nicht, und er optimiert die Funktion weg, dann hat der Linker nichts zu linken und damit auch keinen entry point...
Wenn er eine Funktion wegoptimiert, die nicht static ist, ist der Compiler buggy...
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

AGGROStar1991

  • Beiträge: 29
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 11. March 2010, 17:26 »
Svenska welche formate frisst Syslinux denn alles? würde mich ja schon mal interessiern :)
Was findest du sonst alles so besser als GRUB an dem?

mfg
« Letzte Änderung: 11. March 2010, 17:29 von AGGROStar1991 »

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 12. March 2010, 13:55 »
taljeth: Bei einem antiken Turbo C würde ich das durchaus in Betracht ziehen.

aggrostar1991: siehe http://syslinux.zytor.com/wiki/index.php/Common_Problems
Syslinux erkennt anhand der Dateiendung den Typ des Images. Allerdings unterstützt es z.B. nicht die Multiboot-Spezifikation.

Was mir an Syslinux im Gegensatz dazu gefällt, ist, dass es ein netter Bootloader ist - er installiert sich direkt auf die Partition und nicht in irgendwelche reservierten Bereiche der Platte. Außerdem ist er sehr schnell. Und ich kann ihn für FAT/FAT32, EXT2/EXT3 und PXE nehmen (ISO auch, aber ich nutze keine CDs).

Gruß,
Svenska

Cjreek

  • Beiträge: 104
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 12. March 2010, 19:31 »
Oh hab ja gar nicht mehr gemerkt dass hier Antworten kamen.

@AGGROStar1991:

1) Ich muss dich enttäuschen aber C ist immer noch nicht die Sprache aller Sprachen. Auch wenn manche Leute das glauben. Ich bin mit Pascal/Delphi aufgewachsen und beherrsche diese Sprache(n) mittlerweile auch. Mit C oder C++ hatte ich bisher sogut wie nichts zu tun und ich bereue das auch nicht.

2) Ich hab die GRUB Parolen schon oft genug gehört - Danke. Dein Argument, dass es unsinnig ist etwas neu zu erfinden, was es schon gibt ist etwas Schwachsinnig. Was tust du denn wenn du ein Betriebssystem entwickelst? Das ist genau das gleiche. Was ist also das Problem einen Bootloader zu programmieren, wenn ich Interesse und Spaß daran habe?

3) Jo da hast du mehr oder weniger Recht. Aber eben auch weil einem nicht viel anderes übrig bleibt. Ist ja nicht so, dass ich kein Assembler könnte, aber sowas wie FAT-Treiber in Assembler zu schreiben ist halt ziemlich unübersichtlich...

4) Ich entwickele gerade eine eigene kleine Sprache mit der ich solche Sachen leicht und vorallem übersichtlich programmieren kann. Wenn sie fertig ist, werde ich sie auch wahrscheinlich hier vorstellen.
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 12. March 2010, 21:11 »
Bei 3. kommt es natürlich drauf an, was für eine Art Bootloader es werden soll. Der typische hingerotzte Bootsektor, der irgendwie auf mancher Hardware eine Datei aus dem Wurzelverzeichnis in den Speicher gelesen bekommt, oder was richtiges. Wenn was richtiges (was ich hier einfach mal unterstelle), ist Assembler natürlich nicht mehr die Sprache die Wahl (und dann hat sich übrigens 2. auch erledigt - das ist nur anwendbar, wenn jemand lieber einen kaputten Bootsektor zusammenkopiert und daran dann verzweifelt)
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

AGGROStar1991

  • Beiträge: 29
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 12. March 2010, 22:26 »
zu 1.) ich sagte nicht das C die Sprache aller Sprachen wäre...aber wenn man ein OS in C programmieren will sollte man C können, mehr wollte ich nicht aussagen ;)

Das GRUB nicht die einzige gute alternative ist wurde mir hier nun auch schon ausgeredet^^

mfg


Cjreek

  • Beiträge: 104
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 13. March 2010, 01:25 »
Bei 3. kommt es natürlich drauf an, was für eine Art Bootloader es werden soll. [...]

Ja ich habe schon vor etwas richtiges hinzubekommen. Für einen 08/15 "Bootloader" der einfach die nächsten 512 Bytes lädt und "Hallo Welt" ausgibt o.ä. würde ich sicherlich nicht so einen Aufwand betreiben ;-)
An GRUB wird mein Bootloader sicherlich nicht rankommen aber das ist auch nicht mein Ziel^^

zu 1.) ich sagte nicht das C die Sprache aller Sprachen wäre...aber wenn man ein OS in C programmieren will sollte man C können, mehr wollte ich nicht aussagen ;)

Nun gut, da kann ich dir dann schon zustimmen  :-D Allerdings hatte ich nie vor ein Betriebssystem in C zu schreiben. Für das Betriebssystem selbst hätte ich Pascal genommen. Für den Bootloader hätte dann halt notfalls z.T. C herhalten müssen, weil ich keinen Pascal Compiler kenne, der Code ausspuckt, der in dieser Situation verwendbar wäre  :-(

Aber das hat sich ja erledigt. Jetzt versuche ich mich als "kleines" Zwischenprojekt an einer kleinen aber hoffentlich feinen Programmiersprache  :-) Mal schauen obs was wird  :-D

Das GRUB nicht die einzige gute alternative ist wurde mir hier nun auch schon ausgeredet^^

Ja das meine ich nichtmal unbedingt... Es nervt nur etwas, dass von allen Seiten die "GRUB"-Schreie ertönen, sobald man das Wort "Bootloader" in den Mund nimmt (Um mal ein wenig zu übertreiben). Wenn man dann noch davon spricht sich an einem eigenen Bootloader versuchen zu wollen dann ist's ganz aus  :-D

Deswegen reagiere ich auf GRUB z.T. etwas allergisch  :lol:
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 13. March 2010, 03:30 »
cjreek: Du wirst später vermutlich nicht mehr um C herumkommen, zumindest dann nicht, wenn du in der Richtung mal tätig werden wirst.

Ich dachte auch, dass ich C nie brauchen werde (hatte Delphi in der Schule) und als ich C dann gesehen habe, fand ich es richtig mies. Inzwischen unterrichte ich das für die Erstsemester... und ich studiere nicht Informatik (sondern Informationstechnik).

Man gewöhnt sich zwangsweise dran. In Delphi könnte ich ohne viel Nachschlagen in alten Programmen nichtmehr mit Zeigern hantieren.

Grub persönlich mag ich nicht. Wenn du ein eigenes Projekt hochziehen möchtest, würde ich mich am Funktionsumfang von Syslinux orientieren, möglicherweise sogar mit hartkodierter Konfigurationsdatei. Vielleicht ist das sogar gut in 512 bzw. 448 Bytes schaffbar... die Quelltexte sind ja ein gutes Nachschlagewerk.

Ich vermute mal, dass es den Aufwand nicht wert ist, etwas anderes als C oder Assembler für den Bootsektor verwenden zu wollen. Letzteres könnte aufgrund der Platzproblematik sogar besser sein.

Gruß,
Svenska

AGGROStar1991

  • Beiträge: 29
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 13. March 2010, 08:00 »
CJreek: lass maln paar infos über die Sprache rüberwachsen :D
mit was erstellst du lexer und parser? ind was wird sie kompiliert? wie soll sie syntaxmässig aussehen? interessiert mich schon ein wenig, selber ne sprache schreiben find ich unglaublich faszinierend ^^


mfg

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 13. March 2010, 09:57 »
Für das Betriebssystem selbst hätte ich Pascal genommen. Für den Bootloader hätte dann halt notfalls z.T. C herhalten müssen, weil ich keinen Pascal Compiler kenne, der Code ausspuckt, der in dieser Situation verwendbar wäre  :-(
Wenn dein Problem ist, dass du keinen vernünftig handhabbaren 16-Bit-Pascalcompiler hast, hast du schonmal über Protected Mode nachgedacht? GRUB läuft, soweit ich das weiß, auch grundsätzlich im PM und schaltet nur für die BIOS-Interrupts (also im Wesentlichen Plattenzugriff) in den RM zurück. Das dürfte im Vergleich zum Rest ein relativ kurzes Codestück sein, das man locker in Assembler schreiben könnte.

Aber ich will dich natürlich nicht von deinen Plänen abbringen, wenn du dich jetzt schon mit dem RM eingerichtet hast. ;)

Zitat
Aber das hat sich ja erledigt. Jetzt versuche ich mich als "kleines" Zwischenprojekt an einer kleinen aber hoffentlich feinen Programmiersprache  :-) Mal schauen obs was wird  :-D
Eine Programmiersprache als "Zwischenprojekt" ist mutig.

Trotzdem eine interessante Sache. Du kannst ja auch mal ein paar Ansätze hier posten, da diskutieren sicher einige gern drüber mit dir. ;)

Man gewöhnt sich zwangsweise dran. In Delphi könnte ich ohne viel Nachschlagen in alten Programmen nichtmehr mit Zeigern hantieren.
Also dann hast du sie entweder früher schon nie richtig benutzt oder machst sonst irgendwas falsch. Ich programmiere eigentlich auch fast nur noch C, aber ernsthafte Probleme mit der Pascal-Syntax für Zeiger sind mir seither trotzdem noch nicht untergekommen. ;)

Zitat
Grub persönlich mag ich nicht. Wenn du ein eigenes Projekt hochziehen möchtest, würde ich mich am Funktionsumfang von Syslinux orientieren, möglicherweise sogar mit hartkodierter Konfigurationsdatei.
Also kein Funktionsumfang? :-P

Ich persönlich mag Bootloader, die mir alles booten können, was ich grad so rumliegen habe; auch wenn ich es vorher nicht in eine Konfigurationsdatei eingetragen habe.

Zitat
Vielleicht ist das sogar gut in 512 bzw. 448 Bytes schaffbar... die Quelltexte sind ja ein gutes Nachschlagewerk.

Ich vermute mal, dass es den Aufwand nicht wert ist, etwas anderes als C oder Assembler für den Bootsektor verwenden zu wollen. Letzteres könnte aufgrund der Platzproblematik sogar besser sein.
Ich glaube, es ging um einen richtigen Bootloader, nicht nur um einen Bootsektor.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Cjreek

  • Beiträge: 104
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 13. March 2010, 11:53 »
@Svenska: Ich werde um C rumkommen  :wink:  :-D

Wegen Delphi und Zeiger... Glaub mir, ich liebe Zeiger und ich kann auch in Delphi oder Pascal den größten Blödsinn damit veranstalten  :evil:  :-D

Wenn dein Problem ist, dass du keinen vernünftig handhabbaren 16-Bit-Pascalcompiler hast, hast du schonmal über Protected Mode nachgedacht? GRUB läuft, soweit ich das weiß, auch grundsätzlich im PM und schaltet nur für die BIOS-Interrupts (also im Wesentlichen Plattenzugriff) in den RM zurück. Das dürfte im Vergleich zum Rest ein relativ kurzes Codestück sein, das man locker in Assembler schreiben könnte.

In den PM wollte ich eigentlich erst kurz vor dem Laden des Betriebssystems springen. Ich werde meinen Ansatz mal weiterverfolgen und schauen ob was vernünftiges bei rumkommt  :-)

Eine Programmiersprache als "Zwischenprojekt" ist mutig.

Trotzdem eine interessante Sache. Du kannst ja auch mal ein paar Ansätze hier posten, da diskutieren sicher einige gern drüber mit dir.

Naja sagen wir es so: Ich mache mir keinen Zeitdruck. Alles dauert halt solange es dauern muss. Von daher passt das mit dem "Zwischenprojekt" schon^^

Ich werde mal ein paar Infos über meine Sprache zusammentragen und sie dann nachher in einem eigenen Thread vorstellen  :wink:
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 13. March 2010, 17:37 »
Man gewöhnt sich zwangsweise dran. In Delphi könnte ich ohne viel Nachschlagen in alten Programmen nichtmehr mit Zeigern hantieren.
Also dann hast du sie entweder früher schon nie richtig benutzt oder machst sonst irgendwas falsch. Ich programmiere eigentlich auch fast nur noch C, aber ernsthafte Probleme mit der Pascal-Syntax für Zeiger sind mir seither trotzdem noch nicht untergekommen. ;)
Ich habe seit drei Jahren kein bisschen Delphi mehr programmiert, dafür ausschließlich (und viel) C. Privat hatte ich mich damals mit Visual Basic befasst. Was man nicht anguckt oder anfasst, verliert man in der Zeit schon recht zügig...

Zitat
Grub persönlich mag ich nicht. Wenn du ein eigenes Projekt hochziehen möchtest, würde ich mich am Funktionsumfang von Syslinux orientieren, möglicherweise sogar mit hartkodierter Konfigurationsdatei.
Also kein Funktionsumfang? :-P
Wieso? Du hast eine simple Konsole, in der du alles per Hand machen kannst, du hast die Einträge der Konfigurationsdatei und du kannst alles hochinteressante (Menü, Memtest, VESA-Menü, ...) nachladen. Das meist wird sogar mitgeliefert.

Ich persönlich mag Bootloader, die mir alles booten können, was ich grad so rumliegen habe; auch wenn ich es vorher nicht in eine Konfigurationsdatei eingetragen habe.
Musst du ja nicht - es gibt ja eine Konsole. Und das Programm fürs Bootmenü (Text oder VESA) wird als "kernel" (COMBOOT32) nachgeladen und kann jederzeit wieder in Syslinux zurückspringen.

Ich glaube, es ging um einen richtigen Bootloader, nicht nur um einen Bootsektor.
Warum nicht einen simplen Bootmanager/Bootloader in den Bootsektor schreiben? Für ein Dateisystem (z.B. FAT) zum Datei finden/lesen sollte es eigentlich reichen... muss ja nicht FAT, ext, NTFS und gleichzeitig reiserfs können. Wobei ich das bisher nicht gemacht habe.

Gruß,
Svenska

 

Einloggen