Lowlevel
Lowlevel => Softwareentwicklung => Thema gestartet von: sebi2020 am 21. December 2009, 22:33
-
Hey,
ich wollte maln Thread für Sachen bezüglich Debuggen erstellen.
So dass man hier seine Fragen reinschreiben kann, und wo ich grad dabei bin, würde ich gleich meine erste Frage stellen. Ich bin gerad dabei sowas wie nen timer zu implementieren, also für anwendungen, z.B. uint8_t* set_timer(uint16_t ticks);.
Ich bekomm jetzt nen exception wenn ich den pointer irgendwo abfrage. Und wollte mal fragen ob mir jemand sagen kann, was diese Meldung bedeutet:
00037134778i[CPU0 ] LOCK prefix unallowed (op1=0x53, attr=0x0, mod=0x0, nnn=0)
00037134780i[CPU0 ] LOCK prefix unallowed (op1=0x53, attr=0x0, mod=0x0, nnn=0)
mfg Sebi
-
Hi,
das bedeutet vermutlich, dass die CPU einen bestimmten Speicherbereich als Code ausführt, der nicht dafür gedacht ist. Also irgendein indirekter Sprung der daneben gegangen ist. Als erstes solltest du herausfinden, welchen Code die CPU gerade ausführt. Manchmal gibt das Hinweise auf die Ursache.
Dazu solltest du logprefix in deiner Bochs-Konfiguration so anpassen, dass es den Wert von EIP ausgibt. Zum Beispiel so:
logprefix: %t-%e-@%i-%d
-
naja, dass hab ich grad versucht, jetzt hängt er aber die ganze zeit, ich weiß nicht ob dass nen fehler von bochs ist oder ob da was mit Grub nicht stimmt, jedenfalls springt er immer beim laden von grub zwischen 0x0000bca1 und 0x0000bc60 hin und her , also im prinzip ne endlosschleife, so dass ich garnicht zum kernel komm:
(http://www.informatikonline.net/images/extern/debugscreen.png)
-
Er sollte da nicht endlos hin- und herspringen. GRUB nutzt das BIOS (u.a. um auf die Laufwerke zuzugreifen) und muss dafür kurz den Protected Mode verlassen.
Du solltest das mal länger laufen lassen, oder vielleicht auch debug-Ausgaben ignorieren lassen.
-
Ich glaub ich hab die lösung schon.
ich hatte in dem "Task" ungefähr sowas(ich hab ja nen timer implementiert, und er sollte was ausgaben, wenn er auf 1 steht, Bsp:
while(*timerptr)
{
print("foobar", DSP_COLOR_GREEN);
}
naja, jetzt wurde in dem multitasking tutorial beschrieben wie das funktioniert, aber es wurde nicht erwähnt das man eine funktion haben sollte, die dem scheduler meldet, wenn ein task beendet ist. Nun ist *timerptr ja gleich 0.
also raus aus der schleife und verlässt die funktion. nun stellt der scheduler eip auf einen wert, der außerhalb vom code liegt. versucht theoretisch am ende der funktion weiterzumachen. Das wäre meine theorie, und daher kommt das.
Naja, falls das jetzt richtig sein sollte :-), ich habe die taskliste mal in eine richtige struktur gepackt mit pid usw. Jetzt hab ich den scheduler angepasst. aber jetzt kommt er garnicht zu den tasks erst hin, ich vermute das scheduler immer die selben werte (also die vor dem auftreten des timerinterupts) ausgibt. Naja mal schaun, da ich nich so erfahren bin im debugging wird das noch lustig. Ich würd mir ja gern die befehle die die CPU bekommt ausgeben lassen, aber dann sitzt ich noch bis morgen in bochs, bis ich an die stelle komme, wo das anfängt.
mfg Sebi
-
Hallo!
Ich hab gerade eine Struktur in einer Datei, muss aber über eine andere darauf zugreifen. Also habe ich sie als extern deklariert:
extern struct task_list tasks;
jetzt meckert der Linker immer wegen einer undefined refernce.
Woran kann das liegen, mach ich etwas falsch?
[EDIT] Ich weiß, das gehört eigentlich ins andere Thema, ist mir erst jetzt aufgefallen. Sorry
mfg Sebi2020
-
Das kann an vielem liegen. Entweder hast du irgendwie einen Rechtschreibfehler, in der anderen Datei ist die Variable als static deklariert oder du linkst die Dateien aus Versehen gar nicht zusammen.
-
Nur damit wir das richtig verstehen: Die Original-Deklaration ist noch dieselbe, nur in der anderen Datei, die drauf zugreifen willst, hast du das extern zusätzlich dabeistehen, ja? So sollte es jedenfalls sein. Im Zweifelsfall poste mal beide Deklarationen.
-
Naja, sie ist als static delkariert, ist das den ein Problem?
also in der task.c datei, sieht sie folgender maßen aus
static struct task_list tasks;
und in die Timer c habe ich dann
extern static struct task_list tasks;
geschrieben. Macht das Static jetzt probleme, also darf die variable nicht static sein?
mfg Sebi
-
Ja, sie darf nicht static sein. static bedeutet, dass die Variable nur innerhalb der Datei sichtbar ist, wo das "static struct x y" steht.
extern bedeutet hingegen, dass die Variable in einer anderen Datei definiert ist.
Wenn du eine Variable als extern deklarierst, versprichst du dem Compiler, dass der Linker sie irgendwo finden wird. Der Linker findet aber als static deklarierte Variablen nicht, weil das static sagt, dass er sich nicht für diese Variable zu interessieren hat. static und extern widersprechen sich also.
Das heißt in task.c:
struct task_list tasks;
und in timer.c:
extern struct task_list tasks;
-
Ja, das macht Probleme. Weil static genau aussagt, dass du es nicht außerhalb der Datei benutzen willst. Wofür hast du das static denn drin, wenn du nicht weißt, was es bedeutet?
-
Also ich dachte static wird dazu verwendet, dass variablen beständig bleiben. z.B. in funktionen damit sie nach ende der funkion noch den wert behalten den sie besitzen. bzw. noch existieren.
-
Ja, das auch, aber außerhalb von Funktionen ist das ja nicht so richtig sinnvoll, weil es für alle Variablen gilt. Bei static innerhalb von Funktionen könntest du dir das aber auch wieder mit dateiweite statt funktionsweite Gültigkeit erklären.
-
achso ok, änder das später mal... und hoffe dann auf erfolg :D