[C] Struktur deklarieren

Genau.

Also
x.h
C++:
extern char *vidmem;
und in einer .cpp
C++:
char *vidmem;

Verwendet werden kann es jetzt in jeder Datei, die die x.h einbindet
 
Ich bekomme jetzt keine Fehlermeldungen mehr, nur ein paar Warnungen.
Code:
kernel\/header.h:10: warning: useless storage class specifier in empty declaration
In dieser Zeile steht:
C:
} __attribute__((packed));
Das ist das Ende einer Struktur. Das Ganze soll ja ein kleines OS werden, nur leider hängt es einfach. Ich vermute, dass es an den Warnungen liegt, weil die Struktur gepackt sein muss.

EDIT:
Ich habe das packed jetzt mal weggelassen. Das ändert auch nichts. Es hat also damit nichts zu tun.

EDIT2:
C:
extern struct GDTstruct
{
    // ...
} __attribute__((packed));
so sieht du Struktur aus.

EDIT3:
Sorry, für die vielen EDITs. Ich habe das extern jetzt mal weggelassen und bekomme keine Warnungen mehr. Das OS hängt aber trotzdem.
main.c
C:
#include "header.h"
// ...
int main() {
     start_install();
     // ...
}

header.h
C:
struct GDTstruct
{
     // ...
} __attribute__((packed));
// ...
extern void start_install();

functions.c
C:
struct GDTstruct
{
// ...
} __attribute__((packed));
// ...
void start_install();
// ...
void start_install() {
    // ...
}
Ich weiß leider nicht, was ich falsch mache. :(
 
Zuletzt bearbeitet:
Was heißt, das OS hängt? Hast du "nur" die Global Descriptor Table eingebaut? Die wird keine spürbaren Änderungen bewirken, das ist nur die Vorbereitung, um die IDT implementieren zu können. Wo hast du die Infos her, wie man ein OS aufbaut? Liest du LowLevel? Wenn ja, warum baust du dann nur den Code und liest nicht die ganzen Artikel zu den Themen?
 
Nein. Bisher hatte das OS einen Countdown, hat auf eine Taste gewartet und dann rebootet. Ich benutze übrigens GRUB, aber nachdem das OS von GRUB geladen wurde passiert nichts. Es hängt so, als ob ich
C:
while(1);
geschrieben hätte. Ich kann leider nichts überprüfen, da selbst die einfachste Textausgabe nichts bewirkt.
 
Nimm Bochs :-)

Und zwar aus einem Grund: An Bochs kann man GDB dran hängen und damit debuggen. Außerdem kann man Bochs so konfigurieren, das er nicht neu startet - wenn ich mich richtig erinnere (ist schon ne Weile her, dass ich mich mit dem Thema beschäftigt habe).

Läuft der Kernel denn, wenn du die Initialisierung der GDT - also den Funktionsaufruf - wieder raus nimmst? Wenn ja, dann zeig mal den kompletten Code für die GDT. Da bauen Neulinge (auch wie ich damals) gern Fehler ein - ist ein bisschen tricky das Thema.
 
Klar, mach ich natürlich, aber daran kann es doch im Prinzip nicht liegen, weil alles perfekt funktioniert, wenn ich die Strukturen, Variablen und Funktionen alle in der main.c habe und die anderen Dateien weglasse, oder?
EDIT:
Weiß jemand, wie automatisches Neustarten verhindert wird? Google hilft mir leider nicht. *beleidigt* :D
EDIT2:
Ich hab's grad mit echter Hardware versucht (meinem PC) und dort ist es das selbe wie in der VBox.
 
Zuletzt bearbeitet:
Versuch mal das: Öffne die bochsrc-Datei und such nach der Zeile, die mit cpu anfängt. In der stehen Parameter, die durch Komma getrennt sind. Füge dort einen zusätzlichen Parameter reset_on_triple_fault=0 hinzu.

Ansonsten wäre noch zu erwähnen, das Bochs loggen kann. Das solltest du verwenden. Hier ist das Manual zur bochsrc: http://bochs.sourceforge.net/doc/docbook/user/bochsrc.html

Und: Solange du keinen Source zeigst oder sonst irgendwelche Hinweise z.B. ein Log-File kann man dir schlecht helfen.
 
Ich hab's jetzt so gestartet und bekomme folgende Fehlermeldung:
Code:
exception(): 3rd (13) exception with no resolution
Aber nochmal die Frage: Kann es am normalern Code liegen?! Es funktioniert wie gesagt alles perfekt, wenn die Funktionen, Variablen und Strukturen in der main.c deklariere und definiere. Ich habe ja nur versucht, Teile der Datei auszulagern, um mehr Übersichtlichkeit zu haben. Und erst jetzt gibt es das Problem, das der Kernel "hängt". Denn imho muss es doch daran liegen, dass ich die Strukturen, Variablen und Funktionen falsch in die andere Datei ausgelagert habe, oder?
EDIT:
Nachdem ich auf Continue gedrückt habe, kommt noch diese Fehlermeldung:
Code:
Entering to shutdown state still not implemented
Vielleicht hilft das ja. :)
 
Zurück