-
QUERVERWEIS AUF VERWANDTE
ANMELDUNG
-
Die
vorliegende Anmeldung beansprucht den Nutzen der gemeinsam übertragenen
vorläufigen US-Patentanmeldung
Nr. 60/373,120 mit dem Titel „APPARAUTS
AND METHOD FOR MODIFYING A KERNEL MODULE TO RUN ON MULTIPLE KERNEL
VERSIONS", eingereicht
am 17. April 2002,.
-
GEBIET DER ERFINDUNG
-
Die
vorliegende Anmeldung betrifft Computerbetriebssysteme. Insbesondere
betrifft die Anmeldung das Anpassen eines Kernelmoduls an einen
Betriebssystemkern (-kernel) eines Zielsystems.
-
BESCHREIBUNG DES STANDES DER
TECHNIK
-
Ein
Betriebssystem besteht aus einem oder mehreren Computerprogrammen
(zum Beispiel Sammlungen von Computerbefehlen, die einen Computer
anleiten, einen oder mehrere Aufgaben auszuführen), die Computerbetriebshardware
nutzbar macht. DOS, Windows, Mac, Unix und Palm sind Beispiele solcher
Betriebssystemfamilien.
-
Der
hauptsächliche
Aufgabenbereich von Betriebssystemen ist die Verwaltung der Computerressourcen.
Die Ressourcen können
zum Beispiel Prozessor(en), Speicher (wie etwa Datenspeicher, Festplatten usw.),
Eingabe-/Ausgabegeräte
(wie etwa Drucker, Monitore usw.) und Kommunikationsgeräte (wie
etwa Modems, Netzwerkschnittstellen usw.) umfassen. Ressourcenverwaltungsaufgaben
sind zum Beispiel das Bereitstellen des Zugriffs auf Daten und andere
Ressourcen durch mehrere Nutzer, das Handhaben des Handshakings
(Übergabequittierung)
und anderer Netzwerkkommunikationsaufgaben usw.
-
Aufgaben
des Betriebssystems wie die Ressourcenverwaltung werden üblicherweise
in einer Weise ausgeführt,
die für
den durchschnittlichen Computernutzer transparent sind. Zum Beispiel
dient ein Betriebssystem, obwohl die meisten Nutzer dies nicht wahrnehmen,
als eine Schnittstelle zwischen Computerressourcen einerseits und
Anwendungsprogrammen andererseits (wie etwa Textverarbeitungsprogrammen,
Tabellenkalkulationen, Web-Browsern usw.), die ein Nutzer möglicherweise
verwendet. Betriebssysteme haben außerdem weitere Aufgaben wie
das Bereitstellen einer Benutzerschnittstelle, das Beheben von Systemfehlern
usw.
-
Ein
Betriebssystemkernel ist der Nukleus oder die Kernkomponente eines
Betriebssystems. Die Aufgabenbereiche eines Kernels können die
Prozessverwaltung, die Interprozesskommunikation, die Interrupt-Verarbeitung,
die Unterstützung
der Speicherzuweisung/-freigabe, die Unterstützung von Eingabe- und Ausgabeaktivitäten, Systemsicherheitsmaßnahmen
usw. umfassen. Jeder dieser Aufgabenbereiche umfasst viele Aufgaben.
Zum Beispiel können
Sicherheitsaufgaben die Zugangssteuerung, die Protokollierung und Überwachung,
die Speicher- und Dateisystemverwaltung und die Überwachung der Netzwerk- und
Modemkommunikation usw. umfassen.
-
Linux
ist ein Mitglied der Familie der UNIX-Betriebssysteme und kann auf
einer Vielzahl von Computerplattformen einschließlich Personalcomputern mit
einem x86-Prozessor ausgeführt
werden. Linux ist eine freie, erweiterbare Implementierung von UNIX.
Insbesondere ist der Quellcode für
einen Linuxkernel für
die breite Öffentlichkeit
verfügbar
und wird kontinuierlich verbessert oder anderweitig verändert. Indem
Verbesserungen und/oder andere Änderungen
des Linuxkernels erstellt und allgemein von der Öffentlichkeit übernommen
werden, werden neue Linuxversionen herausgegeben. Eine öffentlich
herausgegebene Linuxkernelversion ist durch eine entsprechende zugeordnete
Kernelversionskennung erkennbar.
-
Ein
Linuxkernel besteht in ähnlicher
Weise wie einige andere Betriebssystemkernels aus mehreren Kernelmodulen.
Ein Kernelmodul ist ein Programm zur Ausführung einer oder mehrerer entsprechender
Kernelaufgaben. Eine Kernelversion kann eine Kombination von Kernelmodulen
sein, die dem konkreten System entsprechend ausgewählt werden,
auf dem die Kernelversion installiert werden soll. Zwei Kernelversionen können sich
dadurch unterscheiden, dass (a) einer Version zusätzliche
Module aufweist, die in der anderen Version nicht enthalten sind,
und/oder (b) zwei Module der jeweiligen Versionen die gleiche(n)
Aufgabe(n) ausführen,
allerdings in unterschiedlicher (aber vielleicht gleichermaßen zufriedenstellender)
Weise.
-
Wenn
einem Betriebssystemkernel ein neues Kernelmodul hinzugefügt wird
(oder ein vorhandenes Modul ersetzt), muss möglicherweise der Kernel mit
dem neuen Modul neu kompiliert werden. Das Kompilieren eines Kernels
ist eine zeitaufwendige Aufgabe. Bei Betriebssystemen wie Linux,
in denen mehrere Kernelversionen aktiv verwendet werden, kann ein
neues Kernelmodul (zum Beispiel eine Firewall) mehrere Kernelkompilierungen
durchlaufen, entsprechend den mehreren (kundenspezifischen oder öffentlich
herausgegebenen) Kernelversionen, denen das neue Modul hinzugefügt werden
kann.
-
Linux
ermöglicht
eine dynamische Verlinkung ladbarer Kernelmodule. Selbst wenn ein
Kernel dynamisch verlinkbare Kernelmodule verwendet, wird jedes
dynamisch verlinkbare Kernelmodul in ein ladbares Modul kompiliert.
Obwohl ein Kernel, in den ein neues dynamisch verlinkbares Kernelmodul
geladen werden kann, möglicherweise
nicht neu kompiliert werden muss, wird das neue dynamisch verlinkbare
Kernelmodul üblicherweise
mehrere (unter einigen Umständen
hunderte) Male kompiliert, wobei jede Kompilierung ein entsprechendes
ladbares Modul bereitstellt, auf das eine entsprechende (öffentliche
oder kundenspezifische) Kernelversion dynamisch verlinken kann.
Die mehrfachen Kompilierungen sind zeitaufwendig und können unnötige Speicherbelegung
verursachen.
-
KURZDARSTELLUNG DER ERFINDUNG
-
Die
vorliegende Erfindung stellt eine Kernelmodul-Modifikationsvorrichtung zur Anpassung
für einen Kernel
auf einem Zielsystem eines kompilierten Kernelmoduls bereit, das
einer anderen Kernelversion entspricht, die sich von dem Kernel
auf dem Zielsystem unterscheidet. In einer Ausführungsform enthält die Vorrichtung
einen Kernel-Analysator
und eine Modulanpassungskomponente. Der Kernel-Analysator extrahiert von dem Kernel
auf dem Zielsystem einen Fehlerprüfungsgrößenwert und eine Kernelversionskennung.
Die Modulanpassungskomponente fügt
in das kompilierte Kernmodul einen Fehlerprüfungsparameter ein, der dem Fehlerprüfungsgrößenwert
entspricht, der vom Kernel-Analysator
von dem Kernel auf dem Zielsystem extrahiert wurde und ersetzt eine
Versionskennung in dem kompilierten Kernelmodul durch die Kernelversionskennung,
die vom Kernel-Analysator von dem Kernel auf dem Zielsystem extrahiert
wurde.
-
Die
Anmeldung stellt außerdem
ein Verfahren zur Anpassung für
einen Kernel auf einem Zielsystem eines kompilierten Kernelmoduls
bereit, das einer anderen Kernelversion entspricht, die sich von
dem Kernel auf dem Zielsystem unterscheidet. Dieses Verfahren umfasst
gemäß einer
Ausführungsform
das Extrahieren eines Fehlerprüfungsgrößenwerts
und einer Kernelversionskennung aus dem Kernel auf dem Zielsystem,
das Einfügen
eines Fehlerprüfungsparameters,
der dem Fehlerprüfungsgrößenwert
entspricht, der vom Kernel auf dem Zielsystem extrahiert wurde,
in das kompilierte Kernmodul, und das Ersetzen einer Versionskennung
in dem kompilierten Kernelmodul durch die Kernelversionskennung,
die vom Kernel auf dem Zielsystem extrahiert wurde. Das kompilierte
Kernelmodul, in das der Fehlerprüfungsparameter
eingefügt
wird, kann ein ladbares Linuxkernelmodul und/oder binär sein.
Das geänderte
kompilierte Kernelmodul, in das der Fehlerprüfungsparameter eingefügt ist und
das die Kernelversionskennung umfasst, die vom Kernel auf dem Zielsystem
extrahiert wurde, kann in den Kernel auf dem Zielsystem geladen
werden.
-
Gemäß einer
weiteren Ausführungsform
kann der Fehlerprüfungsgrößenwert
eine oder mehrere Prüfsummen
enthalten, die vom Kernel auf dem Zielsystem extrahiert wurden.
Das Verfahren kann ferner die Ermittlung einer Symboltabelle im
kompilierten Kernelmodul und die Durchführung einer Analyse des Symbolnamens
für jeden
Symbolnamen in der Symboltabelle umfassen. Die Symbolnamenanalyse
kann das Vergleichen des Symbolnamens mit den Symbolen im Kernel
auf dem Zielsystem umfassen. Wenn der Symbolname mit einem Symbol
im Kernel auf dem Zielsystem übereinstimmt,
kann eine Prüfsumme,
die dem übereinstimmenden
Symbol zugeordnet ist, extrahiert und an den Symbolnamen in der
Symboltabelle des kompilierten Kernelmoduls angehängt werden.
Das Verfahren kann außerdem
das Anpassen eines oder mehrerer Versätze der Symboltabelle, nachdem
die Symbolnamen analysiert wurden, umfassen.
-
KURZBESCHREIBUNG DER ZEICHNUNGEN
-
Die
Merkmale der vorliegenden Erfindung werden aus der folgenden detaillierten
Beschreibung anhand der beigefügten
Zeichnungen leichter verständlich.
Es zeigen:
-
1 ein
Blockdiagramm einer Kernelmodul-Modifikationsvorrichtung
gemäß einer
Ausführungsform der
vorliegenden Anmeldung,
-
2 ein
Ablaufdiagramm eines Verfahrens gemäß einer Ausführungsform
der vorliegenden Anmeldung zur Anpassung für ein Kernel auf einem Zielsystem
eines kompilierten Kernelmoduls, das einer anderen Kernelversion
entspricht, die sich von dem Kernel auf dem Zielsystem unterscheidet,
-
3 ein
Ablaufdiagramm eines Verfahrens gemäß einer Ausführungsform
der vorliegenden Anmeldung zur Anpassung für einen Linuxkernel auf einem
Zielsystem eines kompilierten Linuxkernelmoduls, das einer anderen
Linuxkernelversion entspricht, und
-
4 ein
Ablaufdiagramm eines Verfahrens gemäß einer Ausführungsform
der vorliegenden Anmeldung zum Analysieren von Symbolnamen.
-
DETAILLIERTE BESCHREIBUNG
-
Die
vorliegende Anmeldung stellt Werkzeuge (in Form von Verfahren und
Vorrichtungen) zum Ändern eines
Kernelmoduls solcherart bereit, dass es auf mehreren Kernelversionen
ausgeführt
werden kann. Die Werkzeuge können
in einem Softwaredienstprogramm (zum Beispiel in einem oder mehreren
Computerprogrammen), die auf einem computerlesbaren Medium gespeichert
sind und/oder über
ein Computernetzwerk oder ein anderes Übertragungsmedium übertragen
werden, umgesetzt sein. Der Computer oder das Computersystem, auf
dem das Softwaredienstprogramm ausgeführt wird, kann das Zielsystem
sein.
-
Gemäß einer
in 1 gezeigten Ausführungsform passt eine Kernelmodul-Modifikationsvorrichtung 10 für ein Kernel
auf einem Zielsystem ein kompiliertes Kernelmodul an, das einer
anderen Kernelversion entspricht, die sich von dem Kernel auf dem
Zielsystem unterscheidet. Die Vorrichtung 10 umfasst einen
Kernel-Analysator 11 und eine Modulanpassungskomponente 12.
Der Kernel-Analysator und die Modulanpassungskomponente können Module
oder Codeabschnitte in einem Softwaredienstprogramm sein.
-
Ein
Verfahren gemäß einer
Ausführungsform
zur Anpassung für
einen Kernel auf einem Zielsystem eines kompilierten Kernelmoduls,
das einer anderen Kernelversion entspricht, die sich von dem Kernel
auf dem Zielsystem unterscheidet, wird anhand 1 und 2 beschrieben.
Die Kernel-Analysatorkomponente 11 extrahiert
vom Zielsystemkernel 5 einen Fehlerprüfungsgrößenwert 5a und eine
Kernelversionskennung 5b (Schritt S21). Die Modulanpassungskomponente 12 fügt in das
kompilierte Kernelmodul 20 einen Fehlerprüfungsparameter
ein, der dem vom Kernel-Analysator vom Kernel auf dem Zielsystem
extrahierten Fehlerprüfungsgrößenwert
entspricht (Schritt S22) und ersetzt eine Versionskennung in dem
kompilierten Kernelmodul 20 durch die Kernelversionskennung,
die vom Kernel-Analysator vom Kernel auf dem Zielsystem extrahiert wurde
(Schritt S23).
-
Das
kompilierte Kernmodul, in das der Fehlerprüfungsparameter eingefügt ist,
kann ein ladbares Linuxkernelmodul und/oder binär sein. Das geänderte kompilierte
Kernelmodul, in das der Fehlerprüfparameter eingefügt ist und
das die Kernelversionskennung umfasst, die vom Kernel auf dem Zielsystem
extrahiert wurde, kann in den Kernel auf dem Zielsystem geladen
werden.
-
Die
vom Zielsystemkernel extrahierte Versionskennung kann eine Versionsnummer
oder eine andere Versionskennung (wie etwa ein oder mehrere Symbole)
sein.
-
Der
aus dem Zielsystemkernel extrahierte Fehlerprüfungsgrößenwert kann eine oder mehrere
Prüfsummen
sein. Wenn der Fehlerprüfungsgrößenwert
eine Prüfsumme
ist, kann der Fehlerprüfungsparameter, der
in das kompilierte Kernelmodul eingefügt ist, identisch mit oder
komplementär zu
dem Fehlerprüfungsgrößenwert
oder anderweitig von ihm abgeleitet sein. Prüfsummentechniken sind auf dem
Fachgebiet bekannt. Zum besseren Verständnis verzichtet die vorliegende
Offenbarung auf eine ausführliche
Beschreibung dieser Techniken. Auf jeden Fall sollte das geänderte Kernelmodul
mit dem Fehlerprüfungsparameter,
der auf der Grundlage des Fehlerprüfungsgrößenwerts ermittelt wurde, welcher
vom Zielsystemkernel extrahiert wurde, die Fehlerprüfungskriterien
des Kernels erfüllen.
-
Im
Folgenden wird eine beispielhafte Ausführungsform für ein Linuxkernel
erläutert.
Es versteht sich jedoch, dass der Gegenstand der vorliegenden Offenbarung
auch auf andere Arten von Betriebssystemkerneln angewandt werden
kann.
-
Die
Kernelmodul-Modifikationsvorrichtung kann ein Softwaredienstprogramm
zur Anpassung eines kompilierten Linuskernelmoduls einer bestimmten
Kernelversion und zum Erzeugen eines geänderten Kernelmoduls sein,
das zum Laden in eine andere Kernelversion auf einem Zielsystem
angepasst ist. Die Änderungen
umfassen Veränderungen
in einer Symboltabelle in einem Symboltabellenkopf des Kernelmoduls
und in einer Versionskennung im Modulinformationsabschnitt des Kernelmoduls.
-
Linuxkernelmodule
können
in ein Format kompiliert werden, das „Executable and Linkable Format" (ELF) genannt wird.
Das ELF-Format weist viele Sektionen und Header (Dateiköpfe) auf,
die die richtigen Ausführungs-
und Verlinkungsinformationen für
das Modul/Executable beschreiben. Die Sektionen umfassen die Symboltabelle
und die Modulinformationssektionen.
-
Eine
Symboltabelle in einem kompilierten Kernelmodul ist eine Liste von
Kennungen (d. h. Symbole, zum Beispiel Namen, Kennsätze usw.),
die im Kernelmodul verwendet werden, von den Speicherorten der Kennungen
im Modul und von Attributen der Kennungen. In der Symboltabelle
eines Linuxkernelmoduls ist eine Prüfsumme an das Ende jedes Symbolnamens
angehängt.
Der Prüfsummenwert
kann verwendet werden, um zu überprüfen, dass
das Kernelmodul die gleichen Symbolprototypen, Prozessorbefehlscodes
usw. verwendet, wenn das Modul in ein Zielkernel eingefügt wird.
Unterscheiden sich diese Werte, stellt der Kernel fest, dass ungeklärte Symbole
vorhanden sind und bricht den Vorgang des Ladens des Kernelmoduls
ab. Um dieses Problem zu umgehen, können Prüfsummen aus den Symbolen im
Kernelmodul entfernt werden und durch Prüfsummen ersetzt werden, die
im Zielkernel gespeichert sind. Die Prüfsummenersetzung ermöglicht das
Laden des Moduls ohne Fehler durch ungeklärte Symbole.
-
Im
Folgenden wird anhand der 3 und 4 ein
Verfahren zur Anpassung für
einen Linuxkernel auf einem Zielsystem eines kompilierten Linuxkernelmoduls,
das einer anderen Linuskernelversionen entspricht, beschrieben.
-
Der
Sektionsheader des Kernelmoduls im ELF-Format wird vom Dienstprogramm
gelesen und geparst (Schritt S31). Basierend auf der Information
im Sektionsheader findet das Dienstprogramm einen Versatz der Symboltabelle
im Kernelmodul und der Versatz wird verwendet, um die Symboltabelle
im Kernelmodul zu lokalisieren (Schritt S32). Die Symboltabelle
wird dann vom Dienstprogramm gelesen und geparst (Schritt S33). Aus
der Symboltabelleninformation wird ein Versatz bestimmt, in den
Symbolnamen in dem Modul gespeichert sind und der als „String-Tabelle" (Zeichenfolge-Tabelle) bezeichnet
wird (Schritt S34). Die Symbolnamen werden dann einzeln und nacheinander
aus der String-Tabelle gelesen und analysiert (Schritt S35).
-
Die
Analyse der Symbolnamen in der String-Tabelle kann auf folgende
Weise durchgeführt
werden (4). Ein Symbolname in der String-Tabelle
wird ausgewählt
(Schritt S351). Der ausgewählte
Symbolname wird geprüft
um zu bestimmen, ob eine Prüfsumme
angehängt
ist (Schritt S352). Wenn keine Prüfsumme gefunden wird (Schritt
S352), wird der Symbolname übersprungen
und der nächste
Symbolname wird ausgewählt.
Wenn der Symbolname eine angehängte
Prüfsumme
enthält
(Schritt S352), so wird die Prüfsumme
abgestreift (Schritt S353) und der verbleibende Name wird dann mit
den Symbolen verglichen, die sich im Kernel des Zielsystems befinden
(Schritt S354). Wird eine Übereinstimmung
gefunden (Schritt S354), so wird eine Prüfsumme, die an das übereinstimmende
Symbol im Zielsystemkernel angehängt
ist, extrahiert und an den ausgewählten Symbolnamen in der String-Tabelle des Kernelmoduls
angehängt
(Schritt S355). Wenn keine Übereinstimmung
gefunden wurde (Schritt S354), wird eine Fehlernachricht erzeugt,
die anzeigt, dass ein ungeklärtes
Symbol vorliegt (Schritt S356) und der Vorgang der Symbolnamenanalyse
läuft nicht
weiter. Anderenfalls dauert der Vorgang an, bis alle Symbolnamen
geprüft
und geändert
wurden (Schritt S357). Wenn eine Änderung an der String-Tabelle
stattgefunden hat (Schritt S358), kann sich die Größe der String-Tabelle
verändert
haben. Deshalb müssen
möglicherweise
die Versätze
des ELF-Format-Headers angepasst werden, um die geänderte Größe in der
String-Tabelle wiederzugeben
(Schritt S359).
-
Der
folgende Pseudocode beschreibt diesen Vorgang:
-
Als
nächstes
wird die Modulinformationssektion geändert. Die Modulinformationssektion
enthält
Informationen, die die Kernelversion kennzeichnen, für die das
Kernelmodul kompiliert wurde. In die Modulinformation ist eine Versionskennung
eingebettet, die durch die Kernelversionskennung des Kernels auf
dem Zielsystem ersetzt wird. Die Änderung der Versionskennung
ermöglicht
das Laden des Kernelmoduls in den Kernel auf dem Zielsystem ohne
Fehlermeldungen wegen Nichtübereinstimmung
der Kernelversion.
-
Das
oben beschriebene Parsen des ELF-Formats (Schritt S31) liefert auch
einen Versatz der Modulinformationssektion des Moduls (Schritt S32).
Die Modulinformationssektion wird gelesen und geparst (Schritt S36),
um einen Versatz zu einer String-Tabelle (der sich von der Symbolnamen-String-Tabelle unterscheidet) zu
finden, die der Modulinformationssektion zugeordnet ist (Schritt
S37). Die Modulinformation-String-Tabelle wird gelesen und geparst
(Schritt S38). Die String-Tabelle wird dann auf die Versionskennung
durchsucht. Zum Beispiel folgt in einem kompilierten Linuxkernelmodul
die Versionskennung dem String „kernet version=" (Schritt S39). Wenn
dieser String gefunden wird, folgt die Versionskennung der Kernelversion,
für die
das Linuxkernelmodul kompiliert wurde, dem „="-Zeichen.
Danach wird die Versionskennung durch die Kernelversionskennung
des Zielsystems ersetzt, was zum Beispiel durch einen „uname"-Systemabruf auf
dem Zielsystem erreicht werden kann (Schritt S40). Die Versionskennungsänderung
kann die Größe der String-Tabelle verändern (Schritt
S41). Deshalb müssen
möglicherweise
die Größe der String-Tabelle
neu berechnet und die ELF-Headerversätze geändert werden,
um eine geänderte
Größe der String-Tabelle
wiederzugeben (Schritt S42).
-
Der
geänderte
Kernelversions-String wird als das neue Kernelmodul ausgegeben (Schritt
S43). Das geänderte
Kernelmodul kann in den Kernel auf dem Zielsystem geladen werden.
-
Der
folgende Quellcode ist für
ein beispielhaftes Softwaredienstprogramm.
-
-
-
Diese
Funktion benötigt
einen Datei-Deskriptor, einen Versatz und eine Größe als Argumente.
Sie weist im Grunde einen Zwischenspeicher der Größe „Größe" zu und geht dann
zu dem angegebenen „Versatz" des Datei-Deskriptors
und kopiert die Lesewerte in den Zwischenspeicher des Datei-Deskriptors.
-
Setzt
einen Pointer zum neu zugewiesenen Zwischenspeicher mit den Daten
zurück.
-
Obwohl
in der oben beschriebenen Ausführungsform
zum Beispiel die Versionskennungsänderung auf die Symboltabellenänderung
folgt, kann die Modulinformationsänderung der Fehlerprüfungsanpassung
vorausgehen. Obwohl als weiteres Beispiel das Softwaredienstprogramm
auf dem Zielsystem laufen kann, kann die Kernelmodul-Modifikationsvorrichtung
dafür angepasst
sein, auf einem System zu laufen (mit mindestens einem Prozessor
und einem Programmspeichergerät),
das nicht das Zielsystem ist, wenn die Kernelversionskennung des
Zielsystems bekannt ist und der Fehlerprüfungsgrößenwert des Kernels auf dem
Zielsystem ebenfalls verfügbar
ist.