7.e.Q
09-11-2004, 08:29
Hallo,
sorry für den Roman, aber bitte trotzdem lesen! Danke!
wir haben hier einen Treiber, wie viele von euch bestimmt schon mitbekommen haben. Wir bauen ihn aus alten Sourcen wieder zusammen, damit er auf 'nem 2.6er Kernel funktioniert. Teilweise Funktionalität ist auch bereits implementiert und funktioniert. Aber mir fällt immer wieder auf, daß in dem Source globale funktionen als 'static' deklariert wurden. Ist das überhaupt noch notwendig? Ich hab weniger Schwierigkeiten, den Code zu verstehen (und der Kompiler offenbar auch), wenn die Funktionen und Variablen zwar global aber NICHT static sind. Wozu wurden die damals static deklariert? Was hat sich der Entwickler wohl dabei gedacht? Und weiter, kann man den Funktionen einfach das static (sowohl im Prototyp als auch im Funktionsheader) klauen? Viele der Funktionen werden als Funktionszeiger an Strukturen übergeben (logisch, Treiberentwicklung halt). Geht das auch noch, wenn die Funktionen nicht static sind?
Was static bewirkt, weiß ich wohl, zumindest im Bezug auf Variablen - nämlich, daß sie eine statische Adresse im Speicher erhalten. Aber wieso wird das auch bei globalen Variablen gemacht, die eh Modul-übergreifend die selbe Adresse haben?
Gestern hatten wir nämlich das Problem, daß eine Variable mit dem gleichen Namen in zwei Modulen auftauchte (sollte auch die selbe Variable sein). Sie war static deklariert und erhielt eigenartigerweise aus dem Modul, das sie initialisieren sollte, einen anderen Wert, als später in dem Modul, das auf sie zugriff. Die Initialisierungsfunktion des einen Moduls alloziierte einen Speicherbereich für die Variable, im anderen Modul zeigte der Zeiger dieser Variablen nach der Initialisierung aber immernoch auf 0x000000. Das änderte sich erst, nachdem ich die Variable als nicht mehr static deklariert habe. Danach funktionierte die Initialisierung wunderbar wie sie sollte.
Viele Fragen, die ihr hoffentlich alle reichhaltig beantworten könnt.
Danke!
Gruß,
Hendrik
sorry für den Roman, aber bitte trotzdem lesen! Danke!
wir haben hier einen Treiber, wie viele von euch bestimmt schon mitbekommen haben. Wir bauen ihn aus alten Sourcen wieder zusammen, damit er auf 'nem 2.6er Kernel funktioniert. Teilweise Funktionalität ist auch bereits implementiert und funktioniert. Aber mir fällt immer wieder auf, daß in dem Source globale funktionen als 'static' deklariert wurden. Ist das überhaupt noch notwendig? Ich hab weniger Schwierigkeiten, den Code zu verstehen (und der Kompiler offenbar auch), wenn die Funktionen und Variablen zwar global aber NICHT static sind. Wozu wurden die damals static deklariert? Was hat sich der Entwickler wohl dabei gedacht? Und weiter, kann man den Funktionen einfach das static (sowohl im Prototyp als auch im Funktionsheader) klauen? Viele der Funktionen werden als Funktionszeiger an Strukturen übergeben (logisch, Treiberentwicklung halt). Geht das auch noch, wenn die Funktionen nicht static sind?
Was static bewirkt, weiß ich wohl, zumindest im Bezug auf Variablen - nämlich, daß sie eine statische Adresse im Speicher erhalten. Aber wieso wird das auch bei globalen Variablen gemacht, die eh Modul-übergreifend die selbe Adresse haben?
Gestern hatten wir nämlich das Problem, daß eine Variable mit dem gleichen Namen in zwei Modulen auftauchte (sollte auch die selbe Variable sein). Sie war static deklariert und erhielt eigenartigerweise aus dem Modul, das sie initialisieren sollte, einen anderen Wert, als später in dem Modul, das auf sie zugriff. Die Initialisierungsfunktion des einen Moduls alloziierte einen Speicherbereich für die Variable, im anderen Modul zeigte der Zeiger dieser Variablen nach der Initialisierung aber immernoch auf 0x000000. Das änderte sich erst, nachdem ich die Variable als nicht mehr static deklariert habe. Danach funktionierte die Initialisierung wunderbar wie sie sollte.
Viele Fragen, die ihr hoffentlich alle reichhaltig beantworten könnt.
Danke!
Gruß,
Hendrik