Skip to main content

Moving Average Kernel


BEWEGENDE FORTH Teil 1: Designentscheidungen im Forth Kernel von Brad Rodriguez Dieser Artikel erschien zuerst im Computer Journal 59 (JanuarFebruar 1993). EINFÜHRUNG Jeder in der Forth-Community spricht darüber, wie einfach es ist, Port zu einer neuen CPU zu portieren. Aber wie viele quoteasyquot und quotobviousquot Aufgaben, ist nicht viel geschrieben, wie es zu tun ist So, als Bill Kibler dieses Thema für einen Artikel vorschlug, beschloss ich, mit der großen mündlichen Tradition von Forthwrights zu brechen und den Prozess in Schwarz und Weiß zu dokumentieren. Im Laufe dieser Artikel werde ich Forths für die 6809, 8051 und Z80 entwickeln. Ich mache das 6809, um ein einfaches und konventionelles Forth-Modell zu veranschaulichen, und Ive veröffentlichte bereits einen 6809 Assembler ROD91, ROD92 und Ill, der einen 6809 Forth für zukünftige TCJ-Projekte benötigt. Ich mache das 8051 Forth für ein Universitätsprojekt, aber es illustriert auch einige ziemlich unterschiedliche Designentscheidungen. Die Z80 Forth ist für alle CPM Leser von TCJ, und für einige Freunde mit TRS-80s sammeln Staub. DIE WESENTLICHE HARDWARE Sie müssen eine CPU wählen. Ich werde nicht in die Vorzüge einer CPU über eine andere für Forth, da eine CPU-Wahl ist in der Regel auf Sie durch andere Überlegungen gezwungen. Außerdem ist der Gegenstand dieses Artikels zu zeigen, wie man Forth zu jeder CPU verschieben kann. Sie können den üblichen 16-Bit-Forth-Kernel (siehe unten) erwarten, um etwa 8 KByte des Programmraums zu besetzen. Für einen vollständigen Kernel, der Forth Definitionen kompilieren kann, solltest du mindestens 1 KByte RAM speichern. Um das Block-Management-System von Forths für den Festplattenspeicher zu verwenden, sollten Sie 3 KByte oder mehr für Puffer hinzufügen. Für ein 32-Bit-Forth-Modell, doppelte diese Zahlen. Dies sind die Minima, um einen Forth Kernel zu bekommen und zu laufen. Um eine Anwendung auf Ihrer Hardware auszuführen, sollten Sie PROM - und RAM-Größen anpassen. 16 OR 32 BIT Die von Forth verwendete Wortgröße ist nicht unbedingt dieselbe wie die der CPU. Das kleinste praktische Forth ist ein 16-Bit-Modell, d. h. eins, das 16-Bit-Integer und 16-Bit-Adressen verwendet. Die Forth-Community nennt dies die quotcellquot-Größe, da quotwordquot auf eine Forth-Definition verweist. 8-Bit-CPUs unterstützen fast immer 16-Bit-Forths. Dies erfordert in der Regel eine explizite Codierung von Double-Byte-Arithmetik, obwohl einige 8-Bit-CPUs einige 16-Bit-Operationen haben. 16-Bit-CPUs laufen häufig 16-Bit-Forths, obwohl die gleichen Doppelpräzisionstechniken verwendet werden können, um ein 32-Bit-Forth auf einer 16-Bit-CPU zu schreiben. Mindestens ein 32-Bit-Forth wurde für den 80868088 geschrieben. 32-Bit-CPUs laufen normalerweise 32-Bit-Forths. Ein kleineres Forth-Modell spart selten Code-Länge oder Prozessor-Zeit. Allerdings kenne ich mindestens einen 16-Bit-Forth, der für die 68000 geschrieben wurde. Dies schrumpft die Anwendungscodegröße um einen Faktor von zwei, da High-Level-Forth-Definitionen eine Zeichenfolge von 16-Bit-Adressen werden, anstatt eine Zeichenfolge von 32- Bit-Adressen. (Das wird in Kürze deutlich.) Die meisten 68000s haben jedoch viel RAM. Alle in diesem Artikel beschriebenen Beispiele sind 16-Bit-Forths, die auf 8-Bit-CPUs laufen. DAS GEWINDESTECHNIK quotDhreaded codequot ist das Markenzeichen von Forth. A Forth quotthreadquot ist nur eine Liste von Adressen von Routinen, die ausgeführt werden sollen. Sie können dies als eine Liste der Unterprogramm-Anrufe denken, mit der CALL-Anweisungen entfernt. Im Laufe der Jahre wurden viele Threading-Variationen entworfen, und welche am besten hängt von der CPU und der Anwendung ab. Um eine Entscheidung zu treffen, musst du verstehen, wie sie arbeiten und ihre Kompromisse. Indirektes Threaded Code (ITC) Dies ist die klassische Forth-Threading-Technik, die in Abb. Forth und F83 verwendet wird und in den meisten Büchern auf Forth beschrieben ist. Alle anderen Threading-Schemata sind quotimprovementsquot auf diesem, also müssen Sie ITC verstehen, um die anderen zu schätzen. Lets Blick auf die Definition eines Forth Wortes SQUARE: In einem typischen ITC Forth Dies würde im Speicher erscheinen, wie in Abbildung 1 gezeigt. (Der Header wird in einem zukünftigen Artikel diskutiert es hält Haushalt Informationen für Compilation verwendet und ist nicht in Threading beteiligt .) Angenommen, SQUARE wird bei der Ausführung eines anderen Forth-Wortes angetroffen. Forths Interpreter Pointer (IP) wird auf eine Zelle im Speicher hinweisen - in diesem Quotenwort enthalten - das die Adresse des Wortes SQUARE enthält. (Um genau zu sein, enthält diese Zelle die Adresse von SQUAREs Code Field.) Der Interpreter holt diese Adresse und verwendet sie dann, um den Inhalt des SQUAREs Code Field zu holen. Diese Inhalte sind noch eine Adresse - die Adresse einer Maschinensprache Unterroutine, die das Wort SQUARE führt. In Pseudocode ist dies: Dies veranschaulicht ein wichtiges, aber selten aufgeklärtes Prinzip: Die Adresse des Forth Wortes, das gerade eingegeben wurde, wird in W gehalten. CODE Worte brauchen diese Information nicht, aber alle anderen Arten von Forth Worten. Wenn SQUARE in Maschinencode geschrieben wurde, wäre dies das Ende der Geschichte: das Bit des Maschinencodes würde ausgeführt werden, und dann springen Sie zurück zum Forth Interpreter - das, da IP inkrementiert wurde, zeigt auf das nächste Wort zu Hingerichtet werden Aus diesem Grund wird der Forth-Interpreter normalerweise NEXT genannt. Aber, SQUARE ist eine High-Level-Quollonquot-Definition - es hält ein quotthreadquot, eine Liste von Adressen. Um diese Definition durchzuführen, muss der Forth-Interpreter an einem neuen Ort neu gestartet werden: das Parameterfeld von SQUARE. Natürlich muss der alte Ort des Dolmetschers gespeichert werden, um das Quottwort weiterzuleiten, sobald SQUARE beendet ist. Das ist genau wie ein Unterprogramm-Aufruf Die Maschinensprache-Aktion von SQUARE ist einfach, die alte IP zu schieben, IP auf einen neuen Ort zu setzen, den Dolmetscher auszuführen, und wenn SQUARE fertig ist, (Wie Sie sehen können, ist die IP-Adresse das Zitat-Kontrapunkt von High-Level-Forth.) Dies wird DOCOLON oder ENTER in verschiedenen Forths genannt: Dieses identische Codefragment wird von allen hochrangigen (dh mit Gewinde versehenen) Forth-Definitionen verwendet. Das ist, warum ein Zeiger Zu diesem Code-Fragment, nicht das Fragment selbst, ist in der Forth-Definition enthalten. Über hunderte von Definitionen, die Einsparungen addieren Und das ist, warum seine genannt Indirekt Threading. Das Rückmeldung von subroutinequot ist das Wort EXIT, das kompiliert wird, wenn Forth sieht. (Einige Forths nennen es S anstelle von EXIT.) EXIT führt gerade eine Maschinensprache Routine, die die folgenden: Gehen Sie durch ein paar verschachtelte Forth Definitionen, nur um sicherzustellen, dass dies funktioniert. Beachten Sie die Eigenschaften von ITC: jedes Forth Wort hat ein einzelliges Codefeld. Colon-Definitionen kompilieren eine Zelle für jedes Wort, das in der Definition verwendet wird. Und der Forth-Interpreter muss eigentlich eine doppelte Indirektion ausführen, um die Adresse des nächsten Maschinencodes zu starten (zuerst über IP, dann durch W). ITC ist weder die kleinste noch die schnellste Threading-Technik. Es kann das einfachste sein, obwohl DTC (beschrieben als nächstes) wirklich nicht komplexer ist. Also warum sind so viele Forths indirekt-threaded Vor allem, weil früheren Forths, als Modelle verwendet wurden, wurden indirekt-threaded. In diesen Tagen wird DTC immer beliebter. Also wann sollte ITC verwendet werden Von den verschiedenen Techniken produziert ITC die saubersten und elegantesten Definitionen - nichts als Adressen. Wenn Sie auf solche Überlegungen abgestimmt sind, kann sich ITC an Sie wenden. Wenn Ihr Code mit dem Innere der Definitionen herumgeht, kann die Einfachheit und Einheitlichkeit der ITC-Darstellung die Portabilität verbessern. ITC ist das klassische Forth-Modell, also kann es für die Ausbildung bevorzugt sein. Schließlich, auf CPUs ohne Subroutine Anrufanweisung - wie die 1802 - ITC ist oft effizienter als DTC. Direct Threaded Code (DTC) Direct Threaded Code unterscheidet sich von ITC nur in einer Hinsicht: anstelle des Codefeldes, das die Adresse eines Maschinencodes enthält, enthält das Codefeld den aktuellen Maschinencode selbst. Ich sage nicht, dass der komplette Code für ENTER in jeder Dollon-Definition enthalten ist. In quothigh-levelquot Forth Worten enthält das Code-Feld einen Unterprogrammaufruf. Wie in Abbildung 2 dargestellt. Colon-Definitionen enthalten zum Beispiel einen Aufruf der ENTER-Routine. Der NEXT-Pseudocode für das direkte Threading ist einfach: Das gewinnt Geschwindigkeit: Der Dolmetscher führt nun nur eine einzige Indirektion durch. Auf der Z80 reduziert dies die NEXT-Routine - das meist genutzte Codefragment im Forth-Kernel - von elf Anleitungen bis zu sieben Das kostet Raum: Jede High-Level-Definition in einem Z80 Forth (zB) ist nun ein Byte länger, Da eine 2-Byte-Adresse durch einen 3-Byte-Aufruf ersetzt wurde. Aber das ist nicht allgemein wahr. Ein 32-Bit 68000 Forth kann eine 4-Byte-Adresse durch eine 4-Byte-BSR-Anweisung ersetzen, für keinen Nettoverlust. Und auf dem Zilog Super8, der Maschinenanweisungen für DTC Forth hat, wird die 2-Byte-Adresse durch eine 1-Byte-ENTER-Anweisung ersetzt, so dass ein DTC Forth kleiner auf dem Super8 ist. Natürlich sind die DTC-CODE-Definitionen zwei Bytes kürzer, da sie Ich brauche überhaupt keinen Zeiger mehr Ich dachte, dass High-Level-Definitionen in DTC Forths die Verwendung eines Unterprogrammaufrufs im Codefeld erforderten. Frank Sergeants Pygmy Forth SER90 zeigt, dass ein einfacher Sprung genauso einfach genutzt werden kann und in der Regel schneller ist. Guy Kelly hat eine hervorragende Überprüfung von Forth-Implementierungen für den IBM PC KEL92 zusammengestellt, den ich allen Forth-Kernel-Autoren sehr empfehlen kann. Von den 19 Forths, die er studierte, nutzten 10 DTC, 7 benutzte ITC und 2 benutzte Subroutine Threading (diskutiert als nächstes). Ich empfehle die Verwendung von Direct-Threaded Code über Indirect-Threaded Code für alle neuen Forth-Kernel. Springe zu NEXT, oder kodiere es in-line Der Forth innere Interpreter, NEXT, ist eine gemeinsame Routine zu allen CODE-Definitionen. Sie könnten nur eine Kopie dieser gemeinsamen Routine zu halten, und haben alle CODE Worte zu ihm springen. (Beachten Sie, dass Sie zu NEXT springen eine Unterroutine Aufruf ist nicht notwendig.) Allerdings ist die Geschwindigkeit von NEXT entscheidend für die Geschwindigkeit des gesamten Forth-Systems. Auch bei vielen CPUs ist die NEXT-Routine ziemlich oft oft nur zwei oder drei Anweisungen. So kann es vorzuziehen, NEXT in-line zu codieren, wo immer es benutzt wird. Dies geschieht häufig, indem man NEXT ein Assembler-Makro macht. Das ist eine einfache Geschwindigkeit vs. Raumentscheidung: Inline NEXT ist immer schneller, aber fast immer größer. Die Gesamtgrößenerhöhung ist die Anzahl der zusätzlichen Bytes, die für die Inline-Erweiterung erforderlich sind, mal die Anzahl der CODE-Wörter im System. Manchmal gibt es keine Kompromisse: In einem 6809 DTC Forth ist eine Inline-NEXT kürzer als ein Sprung-Befehl Subroutine Threaded Code (STC) Eine High-Level-Forth-Definition ist nichts als eine Liste von Subroutinen, die ausgeführt werden sollen. Sie brauchen nicht Dolmetscher, um dies zu erreichen, können Sie die gleiche Wirkung durch einfaches Anreißen einer Liste von Unterprogrammaufrufen zusammen: Siehe Abbildung 3. Diese Darstellung von Forth-Wörtern wurde als Ausgangspunkt verwendet, um Forth-Threading-Techniken für die Assembler-Programmierer KOG82 zu erklären. STC ist eine elegante Darstellung Colon Definitionen und CODE Worte sind jetzt identisch. DeDefined wordsquot (VARIABLEs, CONSTANTs und dergleichen) werden wie im DTC behandelt - das Codefeld beginnt mit einem Sprung oder einem Anruf zu irgendeinem Maschinencode an anderer Stelle. Der Hauptnachteil ist, dass Subroutine-Anrufe in der Regel größer als einfache Adressen sind. Auf der Z80 z. B. steigt die Größe der Doppelpunktdefinitionen um 50 - und die meisten deiner Anwendung sind Doppelpunktdefinitionen. Auf einer 32-Bit-68000 kann es überhaupt keine Größenerhöhung geben, wenn 4-Byte-Adressen ersetzt werden 4-Byte-BSRs. (Wenn aber Ihre Codegröße 64 KB überschreitet, müssen einige dieser Adressen durch 6-Byte-JSRs ersetzt werden.) Das Subroutine-Threading kann schneller sein als das direkte Threading. Sie sparen Zeit, indem Sie keinen Dolmetscher haben, aber Sie verlieren Zeit, weil jeder Hinweis auf ein Forth-Wort einen Push und Pop einer Rücksendeadresse beinhaltet. In einem DTC Forth verursachen nur hochrangige Wörter Aktivität auf dem Rücksprungstapel. Auf dem 6809 oder Zilog Super8 ist DTC schneller als STC. Es gibt einen weiteren Vorteil für STC: es verzichtet auf das IP-Register. Einige Prozessoren - wie die 8051 - sind verzweifelt an die Adressierung von Registern. Die Eliminierung der IP kann den Kernel wirklich vereinfachen und beschleunigen Der einzige Weg, um sicher zu wissen, ist, Beispielcode zu schreiben. Dies ist eng mit der Registerauswahl verbunden, im nächsten Abschnitt besprochen. STC mit Inline-Erweiterungsoptimierung Direktkompilierung Bei älteren und 8-Bit-CPUs beinhaltet fast jedes Forth-Primitiv mehrere Maschinenbefehle. Aber auf leistungsstärkeren CPUs, viele Forth Primitive sind in einer einzigen Anweisung geschrieben. Zum Beispiel, auf dem 32-Bit 68000, DROP ist einfach In einem Subroutine-Threaded Forth, mit DROP in einer Doppelpunkt-Definition würde in der Sequenz ADDQ ist eine Zwei-Byte-Anweisung führen. Warum einen 10-Byte-Unterprogramm-Aufruf zu einem Zwei-Byte-Befehl schreiben Egal wie oft DROP verwendet wird, theres keine Einsparungen Der Code ist kleiner und schneller, wenn der ADDQ direkt in den Strom von BSRs codiert wird. Einige Forth-Compiler machen diese Quinline-Erweiterung der CODE-Wörter CUR93a. Der Nachteil der Inline-Erweiterung ist, dass das Dekompilieren des ursprünglichen Quellcodes sehr schwierig wird. Solange Subroutine-Aufrufe verwendet werden, haben Sie immer noch Zeiger (die Unterroutinen-Adressen) zu den Forth-Wörtern, die den Thread enthalten. Mit Zeigern zu den Wörtern können Sie ihre Namen erhalten. Aber sobald ein Wort in Inline-Code erweitert wird, ist alles Wissen, woher dieser Code kam, verloren. Der Vorteil der Inline-Erweiterung - abgesehen von Geschwindigkeit und Größe - ist das Potenzial für Code-Optimierung. Zum Beispiel würde die Forth-Sequenz in 68000 STC kompiliert werden, aber könnte in-line als eine einzige Maschine Anweisung erweitert werden Optimierung Forth Compiler ist zu breit ein Thema für diesen Artikel. Dies ist ein aktiver Bereich der Forth Sprachforschung, zum Beispiel, SCO89 und CUR93b. Die endgültige Kulmination der optimierten STC ist ein Forth, die kompatibel zu quotpurequot Maschinencode, genau wie ein C oder Fortran Compiler. Token Threaded Code (TTC) DTC und STC zielen darauf ab, die Geschwindigkeit von Forth Programmen zu verbessern, um einige Kosten im Speicher. Jetzt können wir die andere Richtung von ITC bewegen, in Richtung etwas langsamer, aber kleiner. Der Zweck eines Forth-Threads ist es, eine Liste von Forth-Wörtern (Subroutinen) anzugeben, die ausgeführt werden sollen. Angenommen, ein 16-Bit-Forth-System hatte nur maximal 256 verschiedene Wörter. Dann könnte jedes Wort durch eine 8-Bit-Zahl eindeutig identifiziert werden. Statt einer Liste von 16-Bit-Adressen, hättest du eine Liste von 8-Bit-Bezeichnern oder Quottokens, und die Größe der Doppelpunktdefinitionen wäre halbiert. Ein Token-Threaded Forth hält eine Tabelle von Adressen aller Forth Wörter, wie Gezeigt in Fig. 4. Der Token-Wert wird dann verwendet, um in diese Tabelle zu indexieren, um das Forth-Wort zu finden, das einem gegebenen Token entspricht. Dies fügt eine Ebene der Indirektion für den Forth-Interpreter hinzu, also ist es langsamer als ein quotaddress-threadedquot Forth. Der Hauptvorteil von Token-Threaded Forths ist klein. TTC wird am häufigsten in Handheld-Computern und anderen stark beschränkten Anwendungen gesehen. Auch die Tabelle der Quotienten platziert in alle Forth Worte vereinfachen die Verknüpfung von separat kompilierten Modulen. Der Nachteil von TTC ist Geschwindigkeit: TTC macht die langsamsten Forths. Auch der TTC-Compiler ist etwas komplexer. Wenn du mehr als 256 Forth Worte brauchst, ist es notwendig, ein offenes Codierungsschema zu haben, um 8-Bit - und größere Token zu mischen. Ich kann mir vorstellen, dass ein 32-Bit-Forth mit 16-Bit-Token, aber wie viele 32-Bit-Systeme sind size-constrained Segment Threaded Code Da gibt es so viele 8086 Derivate in der Welt, Segment Threading verdient eine kurze Erwähnung. Anstelle der Verwendung von quotnormalquot-Byteadressen innerhalb eines 64K-Segments werden Absatzadressen verwendet. (Ein Quittungsquottel ist 16 Bytes im 8086.) Dann kann der Interpreter diese Adressen in Segmentregister laden, anstatt in die üblichen Adressregister. Dies ermöglicht ein 16-Bit-Forth-Modell, um effizient auf das volle Megabyte des 8086-Speichers zuzugreifen. Der Hauptnachteil des Segmentgewindeschneidens ist der 16-Byte-Quotenbildungsraum des Speicherplatzes. Jedes Wort muss auf eine 16-Byte-Grenze ausgerichtet sein. Wenn Forth-Wörter zufällige Längen haben, wird ein Durchschnitt von 8 Bytes pro Forth-Wort verschwendet. REGISTER ALLOCATION Neben der Threading-Technik ist die Verwendung der CPUs-Register die wichtigste Designentscheidung. Es ist wahrscheinlich das schwierigste. Die Verfügbarkeit von CPU-Registern kann bestimmen, welche Threading-Technik verwendet werden kann, und sogar, was die Speicherkarte sein wird Die klassischen Forth-Register Das klassische Forth-Modell hat fünf quadratische Register. Es handelt sich um abstrakte Entitäten, die in den primitiven Operationen von Forth verwendet werden. NEXT, ENTER und EXIT wurden früher in Bezug auf diese abstrakten Register definiert. Jeder von diesen ist eine Zelle breit - d. h. in einem 16-Bit-Forth, das sind 16-Bit-Register. (Es gibt Ausnahmen von dieser Regel, wie Sie später sehen werden.) Diese können nicht alle CPU-Register sein. Wenn Ihre CPU nicht genug Register hat, können einige von ihnen im Speicher gehalten werden. Ich beschreibe sie in der Reihenfolge ihrer Bedeutung, d. h. die Unterseite dieser Liste sind die besten Kandidaten, die im Gedächtnis gespeichert werden sollen. W ist das Arbeitsregister. Es wird für viele Dinge verwendet, einschließlich Speicherreferenz, also sollte es ein Adressregister sein, d. h. Sie müssen in der Lage sein, Speicher zu speichern und Speicher mit dem Inhalt von W als die Adresse zu speichern. Du musst auch in der Lage sein, Arithmetik auf W. (In DTC Forths, du musst auch in der Lage sein, indirekt mit W zu springen.) W wird von dem Dolmetscher in jedem Forth Wort verwendet. In einer CPU, die nur ein Register hat, würdest du es für W verwenden und alles andere im Gedächtnis halten (und das System wäre unglaublich langsam). IP ist der Interpreter Pointer. Dies wird von jedem Forth-Wort (über NEXT, ENTER oder EXIT) verwendet. IP muss ein Adressbuch sein. Du musst auch in der Lage sein, IP zu erhöhen. Subroutine threaded Forths brauchen nicht dieses Register. PSP ist der Parameter Stack (oder quotdata stackquot) Zeiger, manchmal auch einfach SP genannt. Ich bevorzuge PSP, weil SP häufig der Name eines CPU-Registers ist, und sie sollten nicht verwirrt werden. Die meisten CODE-Wörter verwenden das. PSP muss ein Stapelzeiger sein oder ein Adressregister, das inkrementiert und dekrementiert werden kann. Es ist auch ein Plus, wenn man indizierte Adressierung von PSP machen kann. RSP ist der Return Stack Pointer, der manchmal einfach RP genannt wird. Dies wird von Doppelpunktdefinitionen in ITC und DTC Forths und bei allen Wörtern in STC Forths verwendet. RSP muss ein Stapelzeiger oder ein Adressregister sein, das inkrementiert und dekrementiert werden kann. Wenn überhaupt möglich . Setzen W, IP, PSP und RSP in Registern. Die virtuellen Register, die folgen, können im Speicher gehalten werden, aber es gibt normalerweise einen Geschwindigkeitsvorteil, um sie in CPU-Registern zu halten. X ist ein Arbeitsregister, das nicht als eines der quotclassicalquot Forth Register betrachtet wird, obwohl das klassische ITC Forths es für die zweite Indirektion benötigt. In ITC müssen Sie in der Lage sein, indirekt mit X zu springen. X kann auch von einigen CODE-Wörtern verwendet werden, um Arithmetik und so zu tun. Dies ist besonders wichtig für Prozessoren, die kein Speicher als Operand verwenden können. Zum Beispiel könnte ADD auf einem Z80 sein (im Pseudocode) Manchmal ist auch ein anderes Arbeitsregister Y definiert. UP ist der User Pointer, der die Basisadresse des Task-User-Bereichs hält. UP wird in der Regel zu einem Offset hinzugefügt und wird von High-Level-Forth-Code verwendet, so dass es nur irgendwo gespeichert werden kann. Aber wenn die CPU indizierte Adressierung aus dem UP-Register ausführen kann, können CODE-Wörter einfacher und schneller auf Benutzervariablen zugreifen. Wenn Sie einen Überschuss von Adressregistern haben, verwenden Sie einen für UP. Single-Task Forths brauchen nicht UP. X - wenn nötig - ist wichtiger, sich zu registrieren als UP. UP ist die einfachste der virtuellen Register, um in den Speicher zu gelangen. Verwendung des Hardware-Stacks Die meisten CPUs haben einen Stack-Pointer als Teil ihrer Hardware, die von Interrupts und Unterprogrammaufrufen verwendet wird. Wie ist diese Karte in die Forth-Register Sollte es die PSP oder die RSP Die kurze Antwort ist, es hängt davon ab. Es wird gesagt, dass die PSP mehr als die RSP in ITC und DTC Forths verwendet wird. Wenn Ihre CPU nur wenige Adressregister hat und PUSH und POP schneller sind als explizite Referenz, verwenden Sie den Hardware-Stack als Parameter Stack. Auf der anderen Seite, wenn Ihre CPU ist reich an Adressierung Modi - und ermöglicht indizierte Adressierung - theres ein Plus in die PSP als Allzweck-Adresse registrieren. Verwenden Sie in diesem Fall den Hardware-Stack als Return Stack. Manchmal machst du weder den TMS320C25s Hardware Stack nur acht Zellen tief - alles aber nutzlos für Forth. So wird sein Hardware-Stack nur für Interrupts verwendet, und sowohl PSP als auch RSP sind Allzweck-Adressregister. (ANS Forth spezifiziert ein Minimum von 32 Zellen von Parameter Stack und 24 Zellen von Return Stack Ich bevorzuge 64 Zellen von jedem.) Sie werden gelegentlich begegnen das Dogma, dass die Hardware-Stack-Quotte bequot der Parameter Stack, oder quotmust bequot der Return Stack. Stattdessen Code einige Probe Forth Primitiven, wie und sehen, welche Ansatz ist kleiner oder schneller. (DUP und DROP, übrigens sind kein Test - sie sind in der Regel trivial.) Gelegentlich erreichen Sie seltsame Schlussfolgerungen Gary Bergstrom hat darauf hingewiesen, dass ein 6809 DTC Forth kann ein paar Zyklen schneller gemacht werden, indem Sie die 6809 Benutzer Stack Zeiger als die IP NEXT wird zum POP. Er verwendet ein Indexregister für einen der Forths-Stacks. Top-of-Stack in Register Forths Leistung kann erheblich verbessert werden, indem man das obere Element des Parameters Stack in einem Register Viele Forth Wörter (wie 0) dann nicht brauchen, um den Stack zu verwenden. Andere Worte machen immer noch die gleiche Anzahl von Pushs und Pops, nur an einem anderen Ort im Code. Nur wenige Forth-Wörter (DROP und 2DROP) werden komplizierter, da man den Stack-Pointer nicht mehr einfach einstellen kann - man muss auch das TOS-Register aktualisieren. Es gibt ein paar Regeln beim Schreiben von CODE-Wörtern: Ein Wort, das Elemente aus dem Stack entfernt, muss das Quell-TOS in sein Register platzieren. Ein Wort, das dem Stapel Gegenstände hinzufügt, muss das Quotto-TOS auf den Stapel schieben (es sei denn, es ist natürlich das verbraucht durch das Wort). Wenn Sie mindestens sechs Zellen-CPU-Register haben, empfehle ich, die TOS in einem Register zu halten. Ich betrachte TOS wichtiger als UP, um mich zu registrieren, aber weniger wichtig als W, IP, PSP und RSP. (TOS im Register führt viele der Funktionen des X-Registers aus.) Es ist nützlich, wenn dieses Register die Speicheradressierung durchführen kann. PDP-11s, Z8s und 68000s sind gute Kandidaten. Neun der 19 IBM PC Forths studiert von Guy Kelly KEL92 halten TOS in Register. Ich denke, diese Neuerung wurde wegen der falschen Überzeugungen widerstanden, dass a) sie Anweisungen hinzufügt und b) das obere Stapelelement als Speicher zugänglich sein muss. Es stellt sich heraus, dass auch solche Worte wie PICK, ROLL und DEPTH für TOS-in-Register trivial geändert werden. Was ist mit dem Puffern von zwei Stapelelementen in Registern Wenn Sie die Oberseite des Stapels in einem Register halten, bleibt die Gesamtzahl der Operationen im Wesentlichen gleich. Ein Push bleibt ein Push, egal ob es vor oder nach der Operation, die Sie durchführen. Auf der anderen Seite fügt das Puffern von zwei Stapelelementen in Registern eine große Anzahl von Befehlen hinzu - ein Push wird ein Push, gefolgt von einer Bewegung. Nur dedizierte Forth-Prozessoren wie der RTX2000 und fantastisch clever optimierende Compiler können von der Pufferung von zwei Stack-Elementen in Registern profitieren. Einige Beispiele Hier sind die Registerzuweisungen von Forths für eine Anzahl verschiedener CPUs. Versuchen Sie, die Designentscheidungen der Autoren aus dieser Liste abzuleiten. QuotSPquot bezieht sich auf den Hardware-Stack-Pointer. QuotZpagequot bezieht sich auf Werte, die in der 6502s-Speicherseite Null gehalten werden, die fast genauso nützlich sind wie - manchmal nützlicher als - Werte, die in Registern, z. B. Sie können für die Speicheradressierung verwendet werden. QuotFixedquot bedeutet, dass Paynes 8051 Forth einen einzigen, unbeweglichen Benutzerbereich hat und UP eine hartcodierte Konstante ist. Schmale Register Beachten Sie etwas Ungewöhnliches in der vorherigen Liste Das 6502 Forth - ein 16-Bit-Modell - verwendet 8-Bit-Stack-Zeiger Es ist möglich, PSP, RSP und UP kleiner als die Zellengröße des Forth zu machen. Dies liegt daran, dass die Stacks und der Benutzerbereich beide relativ kleine Speicherbereiche sind. Jeder Stapel kann so klein sein wie 64 Zellen in der Länge, und der Benutzerbereich übersteigt selten 128 Zellen. Sie müssen lediglich sicherstellen, dass entweder a) diese Datenbereiche auf einen kleinen Speicherbereich beschränkt sind, so dass eine kurze Adresse verwendet werden kann oder b) die hohen Adreßbits auf andere Weise bereitgestellt werden, z. B. Eine Speicherseite auswählen. Im 6502 ist der Hardware-Stack durch die Gestaltung der CPU auf Seite eins des RAM (Adressen 01xxh) beschränkt. Der 8-Bit-Stack-Pointer kann für den Return Stack verwendet werden. Der Parameter Stack wird auf der Seite Null des RAM gehalten, auf den indirekt durch das 8-Bit-Indexregister X zugegriffen werden kann. (Frage für den fortgeschrittenen Schüler: Warum das 6502s X verwenden und nicht Y Hinweis: Schau dir die verfügbaren Adressierungsmodi an. ) Im 8051 können Sie die 8-Bit-Register R0 und R1 verwenden, um das externe RAM zu adressieren, vorausgesetzt, dass Sie die hohen 8 Bits der Adresse explizit an Port 2 ausgeben. Dies ermöglicht eine Rückmeldung für zwei Stacks. UP unterscheidet sich von PSP und RSP: Es gibt einfach eine Basisadresse, die es niemals inkrementiert oder dekrementiert wird. So ist es praktisch, nur die hohen Bits dieses virtuellen Registers zu liefern. Die niedrigen Bits müssen dann von einer beliebigen indizierten Adressierungstechnik bereitgestellt werden. Zum Beispiel können Sie auf dem 6809 das DP-Register verwenden, um die hohen 8 Bits von UP zu halten und dann die Direct Page Adressierung zu verwenden, um auf eine der 256 Standorte auf dieser Seite zuzugreifen. Dies zwingt alle Benutzerbereiche, an einer Adresse xx00h zu beginnen, was keine große Härte ist und den Benutzerbereich auf 128 Zellen begrenzt. Auf dem 8086 können Sie ein Segmentregister vorstellen, um die Basisadresse des Benutzerbereichs anzugeben. REFERENZEN CUR93a Curley, Charles, quotLife in der FastForth Lane, die auf die Veröffentlichung in Forth Dimensions wartet. Beschreibung eines 68000 Subroutine-Threaded Forth. CUR93b Curley, Charles, quotOptimierung in einem BSRJSR Threaded Forth, in Erwartung der Veröffentlichung in Forth Dimensions. Single-Pass-Code-Optimierung für FastForth, in nur fünf Bildschirmen Code Inklusive Auflistung. KEL92 Kelly, Guy M. quotForth Systems Vergleiche, Forth Dimensionen XIII: 6 (MarApr 1992). Auch veröffentlicht in der 1991 FORML Conference Proceedings. Beide sind bei der Forth Interest Group, P. O. Box 2154, Oakland, CA 94621. Illustriert Design Kompromisse von vielen 8086 Forths mit Code-Fragmenten und Benchmarks - sehr empfehlenswert KOG82 Kogge, Peter M. quotAon Architectural Trail zu Threaded-Code-Systeme, IEEE Computer, vol. 15 nein 3 (März 1982). Bleibt die endgültige Beschreibung der verschiedenen Threading-Techniken. ROD91 Rodriguez, B. J.B. Y.O. Assembler, Teil 1, The Computer Journal 52 (SepOkt 1991). Allgemeine Grundsätze des Schreibens von Forth Assemblern. ROD92 Rodriguez, B. J.B. Y.O. Assembler, Teil 2, The Computer Journal 54 (JanFeb 1992). Ein 6809 Assembler in Forth. SCO89 Scott, Andrew, quotAn Extensible Optimizer für die Kompilierung von Forth, 1989 ForML Conference Proceedings. Forth Interest Group, P. O. Box 2154, Oakland, CA 94621. Gute Beschreibung eines 68000 Optimierers ohne Code. CUR86 Curley, Charles, real-Forth für die 68000. Privat verteilt (1986). JAM80 James, John S. fig-Forth für den PDP-11. Forth Interest Group (1980). KUN81 Kuntze, Robert E. MVP-Forth für den Apple II. Mountain View Press (1981). LAX84 Laxen, H. und Perry, M. F83 für den IBM PC. Version 2.1.0 (1984). Verteilt durch die Autoren, erhältlich von der Forth Interest Group oder GEnie. LOE81 Loeliger, R. G. Threaded Interpretive Sprachen. BYTE Publikationen (1981), ISBN 0-07-038360-X. Kann das einzige Buch sein, das jemals über das Thema der Schaffung eines Forth-artigen Kernels geschrieben wurde (das verwendete Beispiel ist der Z80). Es lohnt sich, wenn man eine Kopie finden kann. MPE92 MicroProcessor Engineering Ltd. MPE Z8Super8 PowerForth Target. MPE Ltd. 133 Hill Lane, Shirley, Southampton, S01 5AF, U. K. (Juni 1992). Ein kommerzielles Produkt. PAY90 Payne, William H. Embedded Controller FORTH für die 8051 Familie. Academic Press (1990), ISBN 0-12-547570-5. Dies ist ein komplettes quotkitquot für einen 8051 Forth, einschließlich eines metacompilers für den IBM PC. Hardcopy nur Dateien können von GEnie heruntergeladen werden. Nicht für den Anfänger SER90 Sergeant, Frank, Pygmy Forth für den IBM PC. Version 1.3 (1990). Verteilt durch den Autor, erhältlich von der Forth Interest Group. Version 1.4 ist jetzt auf GEnie verfügbar und lohnt sich die zusätzliche Anstrengung zu erhalten. TAL80 Talbot, R. J. Fig-Forth für die 6809. Forth Interest Group (1980). Autoren vermerken für Webpublikation: Die bisher im GEnie Online-Service verfügbaren Dateien sind ab sofort bei der Forth-Interessengruppe FTP-Server verfügbar, ftp: ftp. forth. orgpubForth. Updated: 14. Juni 2010 Dieser Artikel ist ein Teil meines Linux Kernel Crash Buch. Es steht zum kostenlosen Download im PDF-Format zur Verfügung. Schließlich ist der große Moment gekommen. Lesen Sie die Informationen, die von der Crash-Dienstprogramm angezeigt werden, zu verstehen, was diese neugierigen Linien bedeuten und hacken Sie Ihren Weg durch das Problem auf die andere Seite. Wir haben gelernt, unsere Systeme für Kernel-Crash-Dumping mit LKCD und Kdump zu konfigurieren. Sowohl lokal als auch quer über das Netzwerk. Wir haben gelernt, wie man den Crash-Dumping-Mechanismus sowohl auf CentOS als auch auf openSUSE einrichtet. Und wir haben die subtilen Unterschiede zwischen den beiden Betriebssystemen überprüft. Als nächstes beherrschten wir die grundlegende Verwendung des Crash-Dienstprogramms, indem wir ihn benutzen, um den Speicherplatz zu öffnen und die darin enthaltenen Informationen zu verarbeiten. Aber wir haben noch nicht gelernt, die Ausgabe zu interpretieren. Voreinführung Heute werden wir uns darauf konzentrieren. Lesen Sie die vmcore-Analyse, verstehen Sie, was die Einträge bedeuten, führen Sie grundlegende Untersuchung des Problems durch, untersuchen Sie den Quellcode und leiten Sie eine effiziente Methodik für die Behandlung von Kernel-Crash-Problemen in der Zukunft ab. Also, wenn Sie in einer Stimmung für eine super-ernste Hackologie sind, folgen Sie mir bitte. Inhaltsverzeichnis Notwendiges Lesen Sie müssen die anderen Artikel in anderen lesen, um zu verstehen, wie der Absturz funktioniert. Hier finden Sie die detaillierte Liste der Referenzen. Ohne die grundlegenden Konzepte zu beherrschen, einschließlich Kdump und Crash-Funktionalität, können Sie dieses Tutorial nicht effizient verfolgen. Analysieren des Crash-Berichts - Erste Schritte Sobald du einen Crash gestartet hast, erhältst du die anfänglichen Berichtsinformationen an die Konsole. Hier beginnt die Analyse des Crashs. Crash 4.0-8.9.1.el5.centos Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Red Hat, Inc. Copyright (C) 2004, 2005, 2006 IBM Corporation Copyright (C) 1999 -2006 Hewlett-Packard Co Copyright (C) 2005, 2006 Fujitsu Limited Copyright (C) 2006, 2007 VA Linux Systems Japan KK Copyright (C) 1999, 2000, 2001, 2002, Inc., 2002, 2002, 2002, Inc., 2002, 2002, 2002, Lizenz, und Sie sind herzlich eingeladen, es zu ändern und zu verteilen Kopien davon unter bestimmten Bedingungen. Geben Sie die Hilfe ein, um die Bedingungen zu sehen. Dieses Programm hat absolut keine Garantie. Geben Sie die Hilfegarantie für Details ein. HINWEIS: stdin: nicht ein tty GNU gdb 6.1 Copyright 2004 Free Software Foundation, Inc. GDB ist freie Software, die von der GNU General Public License abgedeckt ist, und Sie sind herzlich eingeladen, sie zu ändern und Kopien davon unter bestimmten Bedingungen zu verteilen. Geben Sie das Kopieren ein, um die Bedingungen zu sehen. Es gibt absolut keine Garantie für GDB. Typ anzeigen Garantie für Details. Dieser GDB wurde als x8664-unknown-linux-gnu konfiguriert. Bt: kann nicht von Exception-Stack zu aktuellen Prozess-Stack übergehen: Exception Stack Zeiger: ffff810107132f20 Prozess Stack Zeiger: ffff81010712bef0 currentstackbase: ffff8101b509c000 KERNEL: usrlibdebuglibmodules2.6.18-164.10.1.el5.centos. plusvmlinux DUMPFILE: vmcore CPUS: 2 DATE: Di Jan. 19 20:21:19 2010 UPTIME: 00:00:00 LOAD DURCHSCHNITT: 0.00, 0.04, 0.07 TASKS: 134 NODENAME: testhost2localdomain RELEASE: 2.6.18-164.10.1.el5 VERSION: 1 SMP Do Jan 7 19:54: 26 EST 2010 MASCHINE: x8664 (3000 Mhz) SPEICHER: 7,5 GB PANIC: SysRq. Auslösen einer Crashdump PID: 0 COMMAND: Swapper TASK: ffffffff80300ae0 (1 von 2) THREADINFO: ffffffff803f2000 CPU: 0 STATE: TASKRUNNING (ACTIVE) Lasst uns durch den Bericht gehen. Das erste, was du siehst, ist irgendwie ein Fehler: bt: kann nicht von Exception Stack zu aktuellen Prozess Stack übergehen: Exception Stack Zeiger: ffff810107132f20 Prozess Stack Zeiger: ffff81010712bef0 currentstackbase: ffff8101b509c000 Die technische Erklärung für diesen Fehler ist ein wenig heikel. Zitat aus dem Crash Utility Mailing List Thread über Änderungen in der Crash Utility 4.0-8.11 Release, lernen wir die folgenden Informationen: Wenn ein kdump NMI an eine nicht-crashing x8664 cpu ausgegeben wurde, während im Zeitplan (), nachdem Sie die Nächste Aufgabe als aktuell im cpus runqueue, aber vor dem Ändern des Kernel-Stacks zu dem der nächsten Task, dann würde ein Backtrace den Übergang vom NMI-Exception-Stack in den Prozessstapel nicht zurücksetzen, mit der Fehlermeldung bt: kann nicht Übergang vom Ausnahmestapel zum aktuellen Prozessstapel. Dieser Patch berichtet über Inkonsistenzen, die zwischen einer als aktueller Task als Cpus-Runqueue markierten Task und der im Per-cpu x8664pda-PX-Feld (2.6.29 und früheren) gefundenen Task oder der Percpu-Currenttask-Variable (2.6.30 und später). Wenn es sicher festgestellt werden kann, dass die Runqueue-Einstellung (standardmäßig verwendet) verfrüht ist, wird die interne pro-cpu-aktive Aufgabe des Crash-Dienstprogramms geändert, um die Aufgabe zu sein, die durch den entsprechenden architekturspezifischen Wert angezeigt wird. Was bedeutet das Sein eine Warnung, die Sie bei der Analyse des Crash-Berichts beachten sollten. Es wird uns helfen zu bestimmen, welche Aufgabenstruktur wir brauchen, um zu betrachten, um den Crash-Grund zu beheben. Jetzt ignoriere ich diesen Fehler. Es ist nicht wichtig zu verstehen, was der Crash-Bericht enthält. Sie können oder sehen es nicht. Nun können wir den Code unterhalb dieses Fehlers untersuchen. KERNEL: gibt den Kernel an, der zum Zeitpunkt des Absturzes läuft. DUMPFILE: ist der Name des Speicherplatzes. CPUS: ist die Anzahl der CPUs auf dem Rechner. DATE: gibt die Zeit des Crashs an. TASKS: Zeigt die Anzahl der Tasks im Speicher zum Zeitpunkt des Crashs an. Aufgabe ist ein Satz von Programmbefehlen, die in den Speicher geladen werden. NODENAME: ist der Name des abgestürzten Hosts. RELEASE: und VERSION: Geben Sie die Kernel-Version und Version an. MACHINE: gibt die Architektur der CPU an. MEMORY: ist die Größe des physischen Speichers auf der abgestürzten Maschine. Und nun komm die interessanten Bits: PANIC: gibt an, welche Art von Crash auf der Maschine aufgetreten ist. Es gibt mehrere Typen, die man sehen kann. SysRq (Systemanfrage) bezieht sich auf Magic Keys, mit denen Sie Anweisungen direkt an den Kernel senden können. Sie können mit einer Tastatursequenz aufgerufen werden oder indem Sie Buchstabenbefehle an procsysrq-trigger übergeben. Sofern die Funktionalität aktiviert ist. Wir haben das im Kdump-Tutorial besprochen. Oops ist eine Abweichung vom erwarteten, korrekten Verhalten des Kernels. In der Regel führt die Oops dazu, dass der beleidigende Prozess getötet wird. Das System kann sein normales Verhalten wieder aufnehmen. Wahrscheinlich wird das System in einen unvorhersehbaren, instabilen Zustand, der zu Kernel Panik führen könnte, wenn einige der Buggy, getötete Ressourcen werden später angefordert werden. Zum Beispiel, in meinem Ubuntu Karmic und Fedora Constantine Rezensionen, zeigten wir Beweise für Kernel-Crashs. Das System hat sich jedoch weiterentwickelt. Diese Stürze waren in der Tat Oopsen. Wir werden später den Fedora-Fall besprechen. Panik ist ein Zustand, in dem das System einen schwerwiegenden Fehler erlebt hat und sich nicht erholen kann. Panik kann verursacht werden, indem man versucht, auf nicht zugelassene Adressen zuzugreifen, das Laden oder Entladen von Kernelmodulen oder Hardwareproblemen zu erzwingen. In unserem ersten, gutartigsten Beispiel bezieht sich die PANIC: String auf die Verwendung von Magic Keys. Wir haben bewusst einen Crash ausgelöst. PANIC: SysRq. Trigger eine Crashdump PID: ist die Prozess-ID der. Prozess, der den Absturz verursacht hat. COMMAND: ist der Name des Prozesses, in diesem Fall Swapper. Swapper Oder PID 0 ist der Scheduler. Sein der Prozess, der die CPU-Zeit zwischen lauffähigen Prozessen delegiert und wenn es keine anderen Prozesse im Runqueue gibt, übernimmt es die Kontrolle. Vielleicht möchten Sie sich sozusagen auf Swapper als Leerlauf stellen. Theres ein Swapper pro CPU, die du bald sehen wirst, wenn wir den Crash in größerer Tiefe erforschen beginnen. Aber das ist nicht wirklich wichtig Wir werden viele Prozesse mit verschiedenen Namen begegnen. TASK: ist die Adresse im Speicher für den beleidigenden Prozess. Wir werden diese Informationen später nutzen. Theres ein Unterschied in der Speicheradressierung für 32-Bit - und 64-Bit-Architekturen. CPU: ist die Nummer der CPU (relevant, wenn mehr als eins), wo der beleidigende Prozess zum Zeitpunkt des Crashs ausgeführt wurde. CPU bezieht sich auf CPU-Kerne und nicht nur auf physikalische CPUs. Wenn du dein Linux mit hyperthreading aktiviert hast, dann wirst du auch einzelne Threads als CPUs zählen. Dies ist wichtig zu erinnern, da wiederkehrende Abstürze auf nur einer bestimmten CPU ein CPU-Problem anzeigen könnte. Wenn Sie Ihre Prozesse mit Affinität auf bestimmte CPUs (tasket) setzen, dann haben Sie möglicherweise Schwierigkeiten, CPU-Probleme bei der Analyse der Crash-Berichte zu ermitteln. Sie können die Anzahl Ihrer CPUs untersuchen, indem Sie cat proccpuinfo ausführen. STATE: Zeigt den Prozeßzustand zum Zeitpunkt des Crashs an. TASKRUNNING bezieht sich auf lauffähige Prozesse, d. h. Prozesse, die ihre Ausführung fortsetzen können. Auch hier werden wir später noch darüber sprechen. Wärmer geworden Weve gesehen ein gutartiges Beispiel so weit. Nur eine Einführung. Wir werden uns einige weitere Beispiele ansehen, darunter auch reale Fälle. Jetzt wissen wir wenig über den Absturz, außer dass der Prozess, der es verursacht hat. Wir werden nun noch einige Beispiele untersuchen und versuchen zu verstehen, was wir dort sehen. Fedora-Beispiel Lass uns zurück zu Fedora Fall gehen. Schauen Sie sich den Screenshot unten an. Während die Informationen etwas anders angeordnet sind als das, was wir früher gesehen haben, ist im Wesentlichen das Gleiche. Aber es gibt eine neue Information: Pid: 0, Komm: Swapper Nicht verdorben. Lasst uns auf die Not-Tainted-String für einen Moment konzentrieren. Was bedeutet das bedeutet, dass der Kernel kein Modul ausführt, das kraftvoll geladen wurde. Mit anderen Worten, wir sind wahrscheinlich vor einem Code-Bug irgendwo eher als eine Verletzung des Kernels. Sie können Ihren laufenden Kernel durch Ausführen untersuchen: Bisher haben wir gelernt, ein bisschen Informationen. Wir werden später darüber sprechen. Ein weiteres Beispiel aus dem White Paper Schau dir das an: MEMORY: 128MB PANIC: Oops: 0002 (check log für Details) PID: 1696 COMMAND: insmod Was haben wir hier Eine neue Information. Oops: 0002. Was bedeutet das Kernel-Seitenfehler Die vier Ziffern sind ein Dezimalcode des Kernel-Seitenfehlers. Wenn Sie das erste Bit klar (0) haben, wurde die Ausnahme durch einen Zugriff auf eine Seite verursacht, die auf die Seite verweist Ist nicht vorhanden, wenn das Bit gesetzt ist (1), das bedeutet ungültiges Zugriffsrecht. Wenn das zweite Bit klar (0) ist, wurde die Ausnahme durch Lese - oder Ausführungszugriff verursacht, wenn gesetzt (1), die Ausnahme wurde durch einen Schreibzugriff verursacht. Wenn das dritte Bit klar ist (0), wurde die Ausnahme verursacht, während sich der Prozessor im Kernel-Modus befand, sonst trat es im User-Modus auf. Das vierte Bit sagt uns, ob der Fehler ein Instruction Fetch war. Dies gilt nur für 64-Bit-Architektur. Da unsere Maschine 64-Bit ist, hat das Bit hier Sinn. Das ist sehr interessant Scheinbar unverständliche Informationen fühlen sich sehr logisch. Oh, ihr könnt auch die Kernel-Seitenfehler im folgenden Format sehen: Manchmal wird der ungültige Zugriff auch als Schutzfehler bezeichnet: Um also zu verstehen, was passiert ist, müssen wir den Dezimalcode in binär übersetzen und dann untersuchen Die vier Bits von rechts nach links. Sie finden diese Informationen unter archarchmmfault. c im Kernel-Quellbaum: Seitenfehler Fehlercode Bits definieren PFPROT (1ltlt0) oder keine Seite gefunden definieren PFWRITE (1ltlt1) definieren PFUSER (1ltlt2) definieren PFRSVD (1ltlt3) definieren PFINSTR (1ltlt4) In Unser Fall, dezimal 2 ist binär 10. Von rechts nach links blicken, Bit 1 ist null, Bit 2 leuchtet, Bit 3 und 4 sind Null. Beachten Sie die Binärzahl, beginnend bei Null. 0002 (dez) --gt 0010 (binär) --gt nicht Anweisung fetchKernel modeWriteInvalid-Zugriff Daher haben wir eine Seite nicht gefunden während einer Schreiboperation im Kernel-Modus der Fehler war kein Instruction Fetch. Natürlich ist es ein wenig komplizierter als das, aber immer noch eine sehr gute Vorstellung davon, was los ist. Nun, es fängt an, interessant zu werden, ist es nicht Betrachten Sie den beleidigenden Prozess, insmod. Das sagt uns ziemlich viel Wir haben versucht, ein Kernelmodul zu laden. Es versuchte, auf eine Seite zu schreiben, die es nicht finden konnte, was bedeutet, dass Schutzfehler, die unser System zum Absturz bringen. Das könnte ein schlecht geschriebenes Stück Code sein. Status-Check OK, so weit, weve gesehen ziemlich viele nützliche Informationen. Wir haben die Grundkennungsfelder im Crash-Report gelernt. Wir haben über die verschiedenen Panikarten gelernt. Wir haben gelernt, den beleidigenden Prozess zu identifizieren und zu entscheiden, ob der Kernel verdorben ist und welche Art von Problem zum Zeitpunkt des Absturzes aufgetreten ist. Aber wir haben gerade unsere Analyse begonnen. Lass uns das auf eine neue Stufe bringen. Getting Hot In den ersten Artikel über Crash, lernten wir über einige grundlegende Befehle. Seine Zeit, um sie gut zu nutzen. Der erste Befehl, den wir wollen, ist bt - backtrace. Wir wollen die Ausführungsgeschichte des beleidigenden Prozesses sehen, d. h. backtrace. PID: 0 AUFGABE: ffffffff80300ae0 CPU: 0 COMMAND: Swapper 0 ffffffff80440f20 crashnmicallback bei ffffffff8007a68e 1 ffffffff80440f40 donmi bei ffffffff8006585a 2 ffffffff80440f50 NMI bei ffffffff80064ebf Ausnahme RIP: defaultidle61 RIP: ffffffff8006b301 RSP: ffffffff803f3f90 RFLAGS: 00000246 RAX: 0000000000000000 RBX: ffffffff8006b2d8 RCX: 0000000000000000 RDX RDI 0000000000000001:: 0000000000000000 RSI ffffffff80302698 RBP: 0000000000090000 R8: ffffffff803f2000 R9: 000000000000003e R10: ffff810107154038 R11: 0000000000000246 R12: 0000000000000000 R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000 ORIGRAX: FFFFFFFFFFFFFFFF CS: 0010 SS: 0018 --- ltexception stackgt - - 3 ffffffff803f3f90 defaultidle bei ffffffff8006b301 4 ffffffff803f3f90 cpuidle bei ffffffff8004943c Wir haben viele Daten hier, lasst uns beginnen, es langsam zu verdauen. Anrufspur Die Reihenfolge der nummerierten Zeilen, beginnend mit dem Hash-Zeichen (), ist die Aufrufspur. Es ist eine Liste von Kernel-Funktionen, die kurz vor dem Crash ausgeführt werden. Das gibt uns einen guten Hinweis darauf, was passiert ist, bevor das System unterging. 0 ffffffff80440f20 crashnmicallback bei ffffffff8007a68e 1 ffffffff80440f40 donmi bei ffffffff8006585a 2 ffffffff80440f50 NMI bei ffffffff80064ebf Ausnahme RIP: defaultidle61 RIP: ffffffff8006b301 RSP: ffffffff803f3f90 RFLAGS: 00000246 RAX: 0000000000000000 RBX: ffffffff8006b2d8 RCX: 0000000000000000 RDX: 0000000000000000 RSI: 0000000000000001 RDI: ffffffff80302698 RBP: 0000000000090000 R8 ffffffff803f2000 R9: 000000000000003e R10: ffff810107154038 R11: 0000000000000246 R12: 0000000000000000 R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000 ORIGRAX: FFFFFFFFFFFFFFFF CS: 0010 SS: 0018 --- ltexception stackgt --- 3 ffffffff803f3f90 defaultidle bei ffffffff8006b301 4 ffffffff803f3f90 CpuIdle bei ffffffff8004943c Wir werden dies später noch erörtern. Befehlszeiger Die erste wirklich interessante Zeile ist diese: Ausnahme RIP: defaultidle61 Wir haben Ausnahme RIP: defaultidle61. Was bedeutet das zuerst, lass uns RIP besprechen. RIP ist der Befehlszeiger. Es zeigt auf eine Speicheradresse, die den Fortschritt der Programmausführung im Speicher anzeigt. In unserem Fall können Sie die genaue Adresse in der Zeile genau unterhalb der Klammern Ausnahme Zeile sehen: Ausnahme RIP: defaultidle61 RIP: ffffffff8006b301 RSP: ffffffff803f3f90. Denn jetzt ist die adresse selbst nicht wichtig Hinweis: Bei einer 32-Bit-Architektur wird der Befehlszeiger als EIP bezeichnet. Der zweite Teil der Information ist uns viel nützlicher. Defaultidle ist der Name der Kernel-Funktion, in der das RIP liegt. 61 ist der Offset, im Dezimalformat, innerhalb der Funktion, wo die Ausnahme aufgetreten ist. Dies ist das wirklich wichtige Bit, das wir später in unserer Analyse verwenden werden. Code-Segment (CS) - Register Der Code zwischen dem eingeklammerten String bis hin zu --- ltexception stackgt --- ist das Dumping von Registern. Die meisten sind uns nicht sinnvoll, außer dem CS (Code Segment) registrieren. Wieder begegnen wir einer vierstelligen Kombination. Um dieses Konzept zu erklären, muss ich ein wenig abweichen und über Privilegien sprechen. Privileg-Ebene ist das Konzept des Schutzes von Ressourcen auf einer CPU. Verschiedene Ausführungsfäden können unterschiedliche Berechtigungsstufen haben, die Zugriff auf Systemressourcen wie Speicherbereiche, IO-Ports usw. gewähren. Es gibt vier Ebenen von 0 bis 3. Level 0 ist der privilegierteste, der als Kernel-Modus bekannt ist. Level 3 ist der am wenigsten privilegierte, als User-Modus bekannt. Die meisten modernen Betriebssysteme, einschließlich Linux, ignorieren die Zwischenstufe zwei Ebenen, mit nur 0 und 3. Die Ebenen sind auch als Ringe bekannt. Eine bemerkenswerte Ausnahme von der Verwendung von Ebenen war IBM OS2-System. Das aktuelle Privileg Level (CPL) Code Segment (CS) Register ist dasjenige, das auf ein Segment zeigt, in dem Programmbefehle gesetzt sind. Die beiden niederwertigsten Bits dieses Registers geben den aktuellen Privileg Level (CPL) der CPU an. Zwei Bits, dh Zahlen zwischen 0 und 3. Descriptor Privilege Level (DPL) amp Requested Privilege Level (RPL) Descriptor Privilege Level (DPL) ist die höchste Berechtigung, die auf die Ressource zugreifen kann und definiert ist. Dieser Wert wird im Segmentdeskriptor definiert. Die angeforderte Berechtigungsstufe (RPL) ist in der Segmentauswahl, den letzten beiden Bits, definiert. Mathematisch darf CPL nicht überschreiten MAX (RPL, DPL), und wenn dies der Fall ist, wird dies zu einem allgemeinen Schutzfehler führen. Nun, warum ist alles so wichtig, du fragst gut, zum Beispiel, wenn du auf einen Fall stößt, bei dem das System abgestürzt ist, während das CPL 3 war, dann könnte dies auf fehlerhafte Hardware hindeuten, da das System wegen eines Problems im User-Modus nicht abstürzen sollte . Alternativ könnte es ein Problem mit einem Buggy-Systemaufruf geben. Nur einige grobe Beispiele. Für weitere Informationen wenden Sie sich bitte an OReillys Understanding Linux Kernel, Kapitel 2: Speicheradressierung, Seite 36-39. Hier finden Sie nützliche Informationen über Segmentselektoren, Segmentdeskriptoren, Tabellenindex, globale und lokale Deskriptortabellen und natürlich die aktuelle Berechtigungsstufe (CPL). Zurück zu unserem Crash-Log: Wie wir wissen, geben die beiden niederwertigsten Bits die CPL an. Zwei Bits bedeuten vier Ebenen, jedoch werden die Level 1 und 2 ignoriert. Dies verlässt uns mit 0 und 3, dem Kernel-Modus und dem User-Modus. Übersetzt in binäres Format, haben wir 00 und 11. Das Format, das verwendet wird, um die Deskriptor-Daten zu präsentieren, kann verwirrend sein, aber es ist sehr einfach. Wenn die richtige Figur gerade ist, dann waren sie im Kernel-Modus, wenn die letzte Figur ungerade ist, dann waren sie im User-Modus. Daher sehen wir, dass CPL 0 ist, die beleidigende Aufgabe, die zum Crash führte, wurde im Kernel-Modus ausgeführt. Das ist wichtig zu wissen. Es kann uns helfen, die Natur unseres Problems zu verstehen. Nur als Referenz, heres ein Beispiel, wo der Absturz im User-Modus aufgetreten ist, gesammelt auf einer SUSE-Maschine: Aber das ist nur geeky sprechen. Zurück zu unserem Beispiel haben wir viele nützliche, wichtige Details gelernt. Wir kennen die genaue Speicheradresse, wo der Befehlszeiger zum Zeitpunkt des Absturzes war. Wir kennen das Privileg. Noch wichtiger ist, dass wir den Namen der Kernel-Funktion und den Offset kennen, wo der RIP zum Zeitpunkt des Crashs zeigte. Für alle praktischen Zwecke müssen wir nur die Quelldatei finden und den Code untersuchen. Natürlich kann das aus verschiedenen Gründen nicht immer möglich sein, aber das machen wir doch als Übung. Also, wir wissen, dass crashnmicallback () Funktion von donmi () aufgerufen wurde, wurde donmi () von nmi () aufgerufen, nmi () wurde von defaultidle () aufgerufen, was den Crash verursacht hat. Wir können diese Funktionen untersuchen und versuchen, tiefer zu verstehen, was sie tun. Das machen wir bald. Jetzt können wir unser Fedora-Beispiel noch einmal wieder besuchen. Fedora-Beispiel, wieder Nun, da wir verstehen, was falsch ist, können wir uns das Fedora-Beispiel noch einmal anschauen und versuchen, das Problem zu verstehen. Wir haben einen Absturz in einem nicht verdorbenen Kernel, verursacht durch den Swapper-Prozess. Der Crash-Bericht weist auf nativeapicwritedummy-Funktion hin. Dann gibt es auch eine sehr lange Aufrufspur. Ein bisschen nützliche Informationen, die uns helfen, das Problem zu lösen. Wir werden sehen, wie wir die Crash-Berichte verwenden können, um Entwicklern zu helfen, Fehler zu beheben und bessere, stabilere Software zu produzieren. Jetzt können wir noch mehr auf Crash und die grundlegenden Befehle konzentrieren. Backtrace für alle Tasks Der Crash zeigt standardmäßig Backtrace für die aktive Task an. Aber du möchtest auch die Rückverfolgung aller Aufgaben sehen. In diesem Fall wirst du vorausfahren. Dump-System Meldungspuffer Log-Dump System Message Puffer Dieser Befehl entleert den Kernel-Logbuf-Inhalt in chronologischer Reihenfolge. Der Kernel-Log-Bugger (logbuf) kann nützliche Hinweise vor dem Crash enthalten, die uns helfen könnten, das Problem leichter zu erkennen und zu verstehen, warum unser System unterging. Der Log-Befehl kann nicht wirklich nützlich sein, wenn Sie intermittierende Hardware-Probleme oder rein Software-Bugs haben, aber es ist definitiv den Versuch wert. Heres unsere Crash-Log, die letzten paar Zeilen: ide: fehlgeschlagen opcode war: 0xec mtrr: Typ mismatch für f8000000400000 alt: uncachable neu: write-combining ISO 9660 Erweiterungen: Microsoft Joliet Level 3 ISO 9660 Erweiterungen: RRIP1991A SysRq. Trigger eine Crashdump Und theres die SysRq Nachricht. Nützlich zu wissen. In realen Fällen kann es etwas interessanteres sein. Anzeige Prozessstatusinformationen ps - Anzeige Prozessstatusinformationen Dieser Befehl zeigt den Prozessstatus für ausgewählte oder alle Prozesse im System an. Wenn keine Argumente eingegeben werden, werden die Prozessdaten für alle Prozesse angezeigt. Schauen Sie sich das folgende Beispiel an. Wir haben zwei Swapper-Prozesse Wie ich schon früher gesagt habe, hat jede CPU ihren eigenen Scheduler. Die aktive Aufgabe ist mit gt markiert. Das Crash-Dienstprogramm kann auf eine Aufgabe hinweisen, die die Panik nicht verursacht hat oder möglicherweise nicht in der Lage ist, die Panikaufgabe zu finden. Es gibt keine Garantien. Wenn Sie virtuelle Maschinen, einschließlich VMware oder Xen, verwenden, dann könnten die Dinge noch komplizierter werden. In diesem Fall markiert der Zeiger in der ps-Ausgabe den falschen Prozess: Mit Backtrace für alle Prozesse (mit foreach) und dem Ausführen des Befehls ps solltest du den beanstandeten Prozess finden und seine Aufgabe untersuchen können. Andere nützliche Informationen, die Sie benötigen können: Klammerte Elemente sind Kernel-Threads zum Beispiel, init und udevd sind nicht. Dann, theres Speicherverbrauchsinformation, VSZ und RSS, Prozesszustand und mehr. Super geeky stuff Hinweis: Dieser Abschnitt ist unmöglich schwer Zu hart für die meisten Leute. Sehr wenige Leute sind geschickt genug, um in Kernel-Code zu taumeln und wirklich wissen, was los ist in dort. Der Versuch, mutig zu sein und die möglichen Bugs, die in Crash-Kerzen versteckt sind, zu bekämpfen, ist ein edler Versuch, aber du solltest das nicht leicht nehmen. Ich muss zugeben, dass ich, obwohl ich Crash-Berichte und begleitende Quellen aussagen kann, noch ein großes Angebot habe, über die kleinen Dinge und Bits zu lernen. Erwarten Sie keine Wunder. Theres keine Silber-bullet-Lösung zum Crash-Analyse Zeit, um extrem ernst zu bekommen. Lasst uns sagen, du möchtest sogar den C-Code für die beleidigende Funktion analysieren. Unnötig zu sagen, du solltest die C-Quellen zur Verfügung haben und sie lesen können. Dies ist nicht etwas, was jeder tun sollte, aber es ist eine interessante mentale Übung. Quellcode Alles klar, du willst den Code untersuchen. Zuerst müssen Sie die Quellen erhalten. Einige Verteilungen machen die Quellen leicht verfügbar. Zum Beispiel, in openSUSE, müssen Sie nur das Kernel-Source-Paket herunterladen. Mit CentOS ist es ein wenig schwieriger, aber machbar. Sie können auch das Linux-Kernel-Archiv besuchen und den Kernel herunterladen, der mit Ihren eigenen übereinstimmt, obwohl einige Quellen sich von denen unterscheiden können, die auf Ihrem System verwendet werden, da einige Anbieter ihre eigenen benutzerdefinierten Änderungen vornehmen. Sobald Sie die Quellen haben, ist es Zeit, sie zu untersuchen. Beispiel, auf openSUSE: Du könntest die Quellen mit den Standardwerkzeugen durchsuchen wie zu finden und zu greifen, aber das kann ziemlich langweilig sein. Stattdessen, warum lass das System nicht all die harte Arbeit für dich machen. Ein sehr ordentliches Dienstprogramm zum Durchsuchen von C-Code heißt cscope. Das Tool läuft von der Kommandozeile und verwendet eine vi-ähnliche Schnittstelle. Standardmäßig sucht es nach Quellen im aktuellen Verzeichnis, aber du kannst es beliebig konfigurieren. Cscope ist in den repositories verfügbar: Nun, im Verzeichnis mit Quellen (standardmäßig usrsrclinux), laufe cscope: Dies wird rekursiv alle Unterverzeichnisse durchsuchen, die Quellen indexieren und die Hauptschnittstelle anzeigen. Es gibt andere Verwendungen als auch versuchen die Mann-Seite oder - Help-Flag. Jetzt ist es an der Zeit, das Werkzeug gut zu nutzen und nach gewünschten Funktionen zu suchen. Wir werden mit diesem C-Symbol beginnen. Verwenden Sie die Cursortasten, um zu dieser Zeile zu gelangen, geben Sie dann den gewünschten Funktionsnamen ein und drücken Sie die Eingabetaste. Die Ergebnisse werden angezeigt: Je nachdem, was passiert ist, können Sie viele Ergebnisse oder keine. Es ist durchaus möglich, dass es keinen Quellcode gibt, der die Funktion enthält, die im Crash-Report gesehen wird. Wenn es zu viele Ergebnisse gibt, dann möchten Sie vielleicht nach der nächsten Funktion im Aufruftrace suchen, indem Sie die Suchfunktionen verwenden, die von dieser Funktionsoption aufgerufen werden. Verwenden Sie die Registerkarte, um zwischen dem Eingabe - und Ausgabeabschnitt zu springen. Wenn Sie offizielle Verkäufer Unterstützung haben, ist dies ein guter Moment, um den Befehl über und lassen Sie sie fahren. Wenn Sie mit der Untersuchung aufhören, suchen Sie nach anderen Funktionen, die in der Call-Trace aufgeführt sind, können Ihnen helfen, die C-Datei zu verkleinern, die Sie benötigen. Aber theres keine Garantie und das kann ein langer, langwieriger Prozess sein. Darüber hinaus, wenn Sie Hilfe benötigen, drücken Sie einfach. Und Sie erhalten einen grundlegenden Gebrauchsführer: Im Kernel-Quellverzeichnis können Sie auch die cscope-Indizes erstellen, um schnellere Suchvorgänge in der Zukunft durchzuführen, indem Sie make cscope ausführen. Zerlegen Sie das Objekt Angenommen, Sie haben die Quelle gefunden, ihre Zeit, das aus dieser Quelle zusammengestellte Objekt zu zerlegen. Zuerst, wenn du einen Debug-Kernel betreibst, wurden alle Objekte mit den Debug-Symbolen kompiliert. Du hast Glück. Du musst nur das Objekt entleeren und in den gemischten Montage-C-Code graben. Wenn nicht, müssen Sie die Quelle mit Debug-Symbolen neu kompilieren und dann reverse-engineer es. Das ist keine einfache oder eine triviale Aufgabe. Zuerst, wenn Sie einen Compiler verwenden, der anders ist als der, der verwendet wurde, um das Original zu kompilieren, wird Ihr Objekt anders als das im Crash-Bericht sein, was Ihre Bemühungen schwierig macht, wenn nicht unmöglich. Triviales Beispiel nenne ich dieses Beispiel trivial, weil es nichts mit dem Kernel zu tun hat. Es zeigt nur, wie man Objekte kompiliert und sie dann zerlegt. Jede Quelle wird tun. In unserem Fall, verwenden Sie einfach MPlayer, ein beliebter Open-Source-Media-Player als Sündenbock. Laden Sie den MPlayer Quellcode herunter, führen Sie. configure, make. Nachdem die Objekte erstellt wurden, löschen Sie eine von ihnen, dann kompilieren Sie es. Führen Sie ltobject namegt aus. Zum Beispiel: Bitte beachten Sie, dass make keine Bedeutung ohne Makefile hat, was festlegt, was getan werden muss. Aber wir haben ein Makefile. Es wurde erstellt, nachdem wir lief. configure. Ansonsten würde das alles nicht wirklich funktionieren. Makefile ist sehr wichtig. Wir werden bald ein wenig triviales Beispiel sehen. Wenn du das bestehende Objekt nicht entfernt hast, dann kannst du es wahrscheinlich nicht machen. Verglichen Zeitstempel auf Quellen und das Objekt, so dass, wenn Sie die Quellen ändern, wird die Neukompilierung des Objekts fehlschlagen. Nun, Heres ein weiteres einfaches Beispiel, und beachten Sie den Unterschied in der Größe des erstellten Objekts, einmal mit den Debug-Symbolen und einmal ohne: Wenn Sie nicht ein Makefile haben, können Sie gcc manuell mit allen möglichen Flags aufrufen. Sie benötigen Kernel-Header, die mit der Architektur und der Kernel-Version übereinstimmen, mit der der Kernel erstellt wurde, in dem der Crash aufgetreten ist. Andernfalls werden sich Ihre neu kompilierten Objekte ganz anders als die, die Sie analysieren möchten, einschließlich Funktionen und Offsets. Ein Dienstprogramm, das Sie für die Demontage verwenden möchten, ist objdump. Sie werden wahrscheinlich das Dienstprogramm mit - S-Flag verwenden, was bedeutet, dass der Quellcode mit den Montageanweisungen gemischt ist. Sie können auch - s-Flag, die Inhalt aller Abschnitte, einschließlich leere anzeigen wird. - S impliziert - d. Die die Assembler-Mnemonik für die Maschinenbefehle von objfile anzeigt, zerlegt diese Option nur die Abschnitte, von denen erwartet wird, dass sie Anweisungen enthalten. Alternativ verwenden Sie - D für alle Abschnitte. So wäre das allumfassendste objdump: objdump - DS ltcompiled objekt mit debug symbolsgt gt ltoutput filegt Es wird so etwas aussehen: Und ein noch besseres Beispiel, das Memhog Dump: Umzug auf Kernel Quellen Aufwärmen. Sobald Sie sicher zu üben mit trivialem Code, Zeit, um zu Kernel zu bewegen. Vergewissern Sie sich, dass Sie nicht nur eine wichtige Datei löschen. Um der Übung willen, bewegen oder umbenennen Sie alle vorhandenen Kernel-Objekte, die Sie finden können. Dann neu kompilieren sie Sie benötigen die. config-Datei, die zum Kompilieren des Kernels verwendet wird. Es sollte in die Quellen aufgenommen werden. Alternativ können Sie es von procconfig. gz ablegen. Zcat procconfig. gz gt. config Auf RedHat-Rechnern finden Sie die Konfigurationsdateien auch unter Boot. Vergewissern Sie sich, dass Sie denjenigen verwenden, der mit dem abgestürzten Kernel übereinstimmt und ihn in das Quellverzeichnis kopiert. Wenn nötig, bearbeiten Sie einige der Optionen, wie zB CONFIGDEBUGINFO. Mehr darüber später Ohne die. config-Datei können Sie keine Kernel-Quellen kompilieren: Sie können auch einen Fehler finden, bei dem das Makefile vermisst wird, aber da ist es da. In diesem Fall können Sie ein relativ einfaches Problem, mit der falschen ARCH Umgebungsvariable gesetzt. Zum Beispiel, i585 versus i686 und x86-64 versus x8664. Achten Sie auf den Fehler und vergleichen Sie die Architektur mit der ARCH-Variablen. Im schlimmsten Fall müssen Sie es eventuell korrekt exportieren. Zum Beispiel: Als langfristige Lösung können Sie auch symbolische Links unter usrsrclinux aus der Möchtegern-schlechte Architektur auf die richtige. Dies ist nicht strikt mit der Analyse von Kernel-Crashs verknüpft, aber wenn und wenn Sie Kernel-Quellen kompilieren, können Sie dieses Problem auftreten. Nun, bezüglich der Variable CONFIGDEBUGINFO. Es sollte auf 1 in Ihrer. config-Datei gesetzt werden. Wenn Sie sich an das Kdump-Tutorial erinnern, war dies eine Voraussetzung, die wir gefragt haben, um die Kernel-Abstürze erfolgreich beheben zu können. Dies sagt dem Compiler, Objekte mit Debug-Symbolen zu erstellen. Alternativ exportieren Sie die Variable in die Shell, als CONFIGDEBUGINFO1. Dann werfen Sie einen Blick auf das Makefile. Sie sollten sehen, dass, wenn diese Variable gesetzt ist, das Objekt mit Debug-Symbolen (-g) kompiliert wird. Das ist was wir brauchen Danach werden wir nochmal den objdump benutzen. Nun könnte Makefile wirklich fehlen. In diesem Fall erhalten Sie eine ganze Reihe von Fehlern im Zusammenhang mit dem Compilation-Prozess. Aber mit dem Makefile an Ort und Stelle sollte es alles reibungslos funktionieren. Und dann gibt es das Objekt wieder zum Beispiel. Wenn du kein existierendes entfernt hast, kannst du kein neues kompilieren, besonders wenn du Debug-Symbole für eine spätere Demontage benötigst. Endlich das zerlegte Objekt: Was machen wir jetzt Nun, du suchst nach der in der Ausnahme RIP aufgelisteten Funktion und kennst die Startadresse. Fügen Sie dann den Versatz zu dieser Nummer hinzu, übersetzt in hexadezimales Format. Dann gehen Sie zu der angegebenen Zeile. Alles, was übrig bleibt, ist zu versuchen zu verstehen, was wirklich passiert ist. Youll haben eine Montageanleitung aufgelistet und evtl. ein C-Code, der uns sagt, was falsch gelaufen wäre. Es ist nicht einfach. In fact, its very difficult. But its exciting and you may yet succeed, finding bugs in the operating system. Whats more fun than that Above, we learned about the compilation and disassembly procedures, without really doing anything specific. Now that we know how to go about compiling kernel objects and dissecting them into little bits, lets do some real work. Intermediate example We will now try something more serious. Grab a proof-of-concept code that crashes the kernel, compile it, examine the crash report, then look for the right sources, do the whole process we mentioned above, and try to read the alien intermixed assembly and C code. Of course, we will be cheating, cause we will know what were looking for, but still, its a good exercise. The most basic non-trivial example is to create a kernel module that causes panic. Before we panic our kernel, lets do a brief overview of the kernel module programming basics. Create problematic kernel module This exercise forces us to deviate from the crash analysis flow and take a brief look at the C programming language from the kernel perspective. We want to crash our kernel, so we need kernel code. While were going to use C, its a little different from everyday stuff. Kernel has its own rules. We will have a sampling of kernel module programing. Well write our own module and Makefile, compile the module and then insert it into the kernel. Since our module is going to be written badly, it will crash the kernel. Then, we will analyze the crash report. Using the information obtained in the report, we will try to figure out whats wrong with our sources. Step 1: Kernel module We first need to write some C code. Lets begin with hello. c. Without getting too technical, heres the most basic of modules, with the init and cleanup functions. The module does not nothing special except print messages to the kernel logging facility. hello. c - The simplest kernel module. include ltlinuxmodule. hgt Needed by all modules include ltlinuxkernel. hgt Needed for KERNINFO int initmodule(void) printk(KERNINFO Hello world. n) A non 0 return means initmodule failed module cant be loaded. return 0 void cleanupmodule(void) printk(KERNINFO Goodbye world. n) We need to compile this module, so we need a Makefile: all: make - C libmodules(shell uname - r)build M(PWD) modules clean: make - C libmodules(shell uname - r)build M(PWD) clean Now, we need to make the module. In the directory containing your hello. c program and the Makefile, just run make. You will see something like this: Our module has been compiled. Lets insert it into the kernel. This is done using the insmod command. However, a second before we do that, we can examine our module and see what it does. Maybe the module advertises certain bits of information that we might find of value. Use the modinfo command for that. In this case, nothing special. Now, insert it: If the module loads properly into the kernel, you will be able to see it with the lsmod command: sbinlsmod grep hello Notice that the use count for our module is 0. This means that we can unload it from the kernel without causing a problem. Normally, kernel modules are used for various purposes, like communicating with system devices. Finally, to remove the module, use the rmmod command: If you take at a look at varlogmessages, you will notice the Hello and Goodbye messages, belonging to the initmodule and cleanupmodule functions: That was our most trivial example. No crash yet. But we have a mechanism of inserting code into the kernel. If the code is bad, we will have an oops or a panic. Step 2: Kernel panic Well now create a new C program that uses the panic system call on initialization. Not very useful, but good enough for demonstrating the power of crash analysis. Heres the code, we call it kill-kernel. c. kill-kernel. c - The simplest kernel module to crash kernel. include ltlinuxmodule. hgt Needed by all modules include ltlinuxkernel. hgt Needed for KERNINFO int initmodule(void) printk(KERNINFO Hello world. Now we crash. n) panic(Down we go, panic called) void cleanupmodule(void) printk(KERNINFO Goodbye world. n) When inserted, this module will write a message to varlogmessages and then panic. Indeed, this is what happens. Once you execute the insmod command, the machine will freeze, reboot, dump the kernel memory and then reboot back into the production kernel. Step 3: Analysis Lets take a look at the vmcore. And the backtrace: What do we have here First, the interesting bit, the PANIC string: Kernel panic - not syncing: Down we go, panic called That bit looks familiar. Indeed, this is our own message we used on panic. Very informative, as we know what happened. We might use something like this if we encountered an error in the code, to let know the user what the problem is. Another interesting piece is the dumping of the CS register - CS: 0033. Seemingly, we crashed the kernel in user mode. As Ive mentioned before, this can happen if you have hardware problems or if theres a problem with a system call. In our case, its the latter. Well, that was easy - and self-explanatory. So, lets try a more difficult example. For more information about writing kernel modules, including benevolent purposes, please consult the Linux Kernel Module Programming Guide. Difficult example Now another, a more difficult example. We panicked our kernel with. panic. Now, lets try some coding malpractice and create a NULL pointer testcase. Weve seen earlier how to create a kernel module. Now, lets spice up our code. We will now create a classic NULL pointer example, the most typical problem with programs. NULL pointers can lead to all kinds of unexpected behavior, including kernel crashes. Our program, called null-pointer. c. now looks like this: null-pointer. c - A not so simple kernel module to crash kernel. include ltlinuxmodule. hgt Needed by all modules include ltlinuxkernel. hgt Needed for KERNINFO int initmodule(void) printk(KERNINFO We is gonna KABOOM nown) void cleanupmodule(void) printk(KERNINFO Goodbye world. n) We declare a NULL pointer and then dereference it. Not a healthy practice. I guess programmers can explain this more eloquently than I, but you cant have something pointing to nothing get a valid address of a sudden. In kernel, this leads to panic. Indeed, after making this module and trying to insert it, we get panic. Now, the sweet part. Step 1: Analysis Looking at the crash report, we see a goldmine of information: Lets digest the stuff: PANIC: Oops: 0002 1 SMP (check log for details) We have an Oops on CPU 1. 0002 translates to 0010 in binary, meaning no page was found during a write operation in kernel mode. Exactly what were trying to achieve. Were also referred to the log. More about that soon. WARNING: panic task not found There was no task, because we were just trying to load the module, so it died before it could run. In this case, we will need to refer to the log for details. This is done by running log in the crash utility, just as weve learned. The log provides us with what we need: The RIP says nullpointer:initmodule0x190x22. Were making progress here. We know there was a problem with NULL pointer in the initmodule function. Time to disassemble the object and see what went wrong. Theres more useful information, including the fact the kernel was Tainted by our module, the dumping of the CS register and more. Well use this later. First, lets objdump our module. objdump - d - S null-pointer. ko gt tmpwhatever Looking at the file, we see the Rain Man code: The first part, the cleanup is not really interesting. We want the initmodule. The problematic line is even marked for us with a comment: 27 ltinitmodule0x19gt. 27: c6 00 01 movb 0x1,(rax) What do we have here Were trying to load (assembly movb ) value 1 ( 0x1 ) into the RAX register ( rax ). Now, why does it cause such a fuss Lets go back to our log and see the memory address of the RAX register: RAX register is: 0000000000000000. In other words, zero. Were trying to write to memory address 0. This causes the page fault, resulting in kernel panic. Problem solved Of course, in real life, nothing is going to be THAT easy, but its a start. In real life, you will face tons of difficulties, including missing sources, wrong versions of GCC and all kinds of problems that will make crash analysis very, very difficult. Remember that For more information, please take a look at the case study shown in the crash White Paper. Again, its easier when you know what youre looking for. Any example you encounter online will be several orders of magnitude simpler than your real crashes, but it is really difficult demonstrating an all-inclusive, abstract case. Still, I hope my two examples are thorough enough to get you started. Alternative solution (debug kernel) If you have time and space, you may want to download and install a debug kernel for your kernel release. Not for everyday use, of course, but it could come handy when youre analyzing kernel crashes. While it is big and bloated, it may offer additional, useful information that cant be derived from standard kernels. Plus, the objects with debug symbols might be there, so you wont need to recompile them, just dump them and examine the code. Next steps So the big question is, what do crash reports tell us Well, using the available information, we can try to understand what is happening on our troubled systems. First and foremost, we can compare different crashes and try to understand if theres any common element. Then, we can try to look for correlations between separate events, environment changes and system changes, trying to isolate possible culprits to our crashes. Combined with submitting crash reports to vendors and developers, plus the ample use of Google and additional resources, like mailing lists and forums, we might be able to narrow down our search and greatly simply the resolution of problems. Kernel crash bug reporting When your kernel crashes, you may want to take the initiative and submit the report to the vendor, so that they may examine it and possibly fix a bug. This is a very important thing. You will not only be helping yourself but possibly everyone using Linux anywhere. What more, kernel crashes are valuable. If theres a bug somewhere, the developers will find it and fix it. Kerneloops. org is a website dedicated to collecting and listing kernel crashes across the various kernel releases and crash reasons, allowing kernel developers to work on identifying most critical bugs and solving them, as well as providing system administrators, engineers and enthusiasts with a rich database of crucial information. Remember the Fedora 12 kernel crash report We had that nativeapicwritedummy Well, lets see what kerneloops. org has to say about it. As you can see, quite a lot. Not only do you have all sorts of useful statistics, you can actually click on the exception link and go directly to source, to the problematic bit of code and see what gives. This is truly priceless information As we mentioned earlier, some modern Linux distributions have an automated mechanism for kernel crash submission, both anonymously and using a Bugzilla account. For example, Fedora 12 uses the Automatic Bug Reporting Tool (ABRT), which collects crash data, runs a report and then sends it for analysis with the developers. For more details, you may want to read the Wiki. Beforehand, Fedora 11 used kerneloops utility, which sent reports to, yes, you guessed it right, kerneloops. org. Some screenshots. Heres an example of live submission in Fedora 11. And more recently in Fedora 12. Hopefully, all these submissions help make next releases of Linux kernel and the specific distributions smarter, faster, safer, and more stable. Google for information Sounds trivial, but it is not. If youre having a kernel crash, theres a fair chance someone else saw it too. While environments differ from one another, there still might be some commonality for them all. Then again, there might not. A site with 10 database machines and local logins will probably experience different kinds of problems than a 10,000-machine site with heavy use of autofs and NFS. Similarly, companies working with this or that hardware vendor are more likely to undergo platform-specific issues that cant easily be find elsewhere. The simplest way to search for data is to paste the exception RIP into the search box and look for mailing list threads and forum posts discussing same or similar items. Once again, using the Fedora case an an example: Crash analysis results And after you have exhausted all the available channels, its time to go through the information and data collected and try to reach a decisionresolution about the problem at hand. We started with the situation where our kernel is experiencing instability and is crashing. To solve the problem, we setup a robust infrastructure that includes a mechanism for kernel crash collection and tools for the analysis of dumped memory cores. We now understand what the seemingly cryptic reports mean. The combination of all the lessons learned during our long journey allows us to reach a decision what should be done next. How do we treat our crashing machines Are they in for a hardware inspection, reinstallation, something else Maybe theres a bug in the kernel internals Whatever the reason, we have the tools to handle the problems quickly and efficiently. Finally, some last-minute tips, very generic, very generalized, about what to do next: Single crash A single crash may seem as too little information to work with. Dont be discouraged. If you can, analyze the core yourself or send the core to your vendor support. Theres a fair chance you will find something wrong, either with software at hand, the kernel or the hardware underneath. Hardware inspection Speaking of hardware, kernel crashes can be caused by faulty hardware. Such crashes usually seem sporadic and random in reason. If you encounter a host that is experiencing many crashes, all of which have different panic tasks, you may want to considering scheduling some downtime and running a hardware check on the host, including memtest, CPU stress, disk checks, and more. Beyond the scope of this article, Im afraid. The exact definition of what is considered many crashes, how critical the machine is, how much downtime you can afford, and what you intend to do with the situation at hand is individual and will vary from one admin to another. Reinstallation amp software changes Did the software setup change in any way that correlates with the kernel crashes If so, do you know what the change is Can you reproduce the change and the subsequent crashes on other hosts Sometimes, it can be very simple sometimes, you may not be able to easily separate software from the kernel or the underlying hardware. If you can, try to isolate the changes and see how the system responds with or without them. If theres a software bug, then you might be just lucky enough and have to deal with a reproducible error. Kernel crashes due to a certain bug in software should look pretty much the same. But theres no guarantee youll have it that easy. Now, if your system is a generic machine that does not keep any critical data on local disks, you may want to consider wiping the slate clean - start over, with a fresh installation that you know is stable. Its worth a try. Submit to developervendor Regardless of what you discovered or you think the problem is, you should send the kernel crash report to the relevant developer andor vendor. Even if youre absolutely sure you know what the problem is and youve found the cure, you should still leave the official fix in the hands of people who do this kind of work for a living. I have emphasized this several times throughout the article, because I truly believe this is important, valuable and effective. You can easily contribute to the quality of Linux kernel code by submitting a few short text reports. Its as simple and powerful as that. And that would be all for now, I think. Im spent. I still owe you some information, but I cant possibly include everything in a single article. We will revisit some of the stuff when we discuss gdb. Official documentation Heres a selection of highly useful articles and tutorials:PECAN WEEVIL Where it is found in Texas, the pecan weevil is the most damaging late-season pecan pest. Infestations are often localized and vary greatly within orchards. In August, adult weevils begin to emerge from the soil and feed on nuts in the water stage, causing them to drop. After the kernel has entered the gel stage, the nut is susceptible to egg laying and attack by pecan weevil larvae. Infested nuts remain on the tree while the developing larvae consume the kernel. Full-grown larvae emerge from the nut in late fall or early winter through a round hole chewed through the shell. The life cycle of the pecan weevil egg, larva, pupa and adult usually is completed in 2 years but can require 3. Adult weevils begin emerging from the soil in August their numbers peak from late August through early September. Rainfall, soil moisture and soil type influence the ability of the weevils to emerge from the soil. Drought can delay adult emergence until rain or irrigation loosens the soil. Adult weevils feed on nuts and live for several weeks. Once nuts reach the gel stage, they are suitable for egg laying. For this reason, early-maturing varieties are infested first. The female weevil drills a hole through the shell and deposits one or more eggs within the developing kernel. A single female lays eggs in about 30 nuts. Larvae hatch from the eggs and feed inside the nut, destroying the kernel. Larvae emerge from the nuts about 42 days after the eggs are deposited. Emergence of full-grown larvae from nuts begins in late September and continues as late as December. Larvae burrow 4 to 12 inches into the soil and build a cell, where they remain for 8 to 10 months. Most of the larvae then pupate and transform to the adult stage within a few weeks. However, the adults remain in the underground cell for an additional (second) year before emerging from the soil the following summer. Those larvae (about 10 percent) not pupating after the first year remain as larvae for 2 years and then emerge from the soil as adults the third year. PECAN NUT CASEBEARER - Adult Pecan nut casebearer adults have been collected in pheromone traps in Texas as far north as College Station, TX as of April 19. During this time of year pecan bud moth adults occasionally are collected in PNC pheromone traps. Proper identification of PNC adults is important for determining scouting time. PNC adults have a ridge of scales that sticks up that appears as a band across the forewings approximately 13 the distance from where the wings attach to the body. This is a key identification character for PNC. The picture shows a PNC adult on the left and a pecan bud moth adult on the right. Pecan Nut Casebearer - Egg Female casebearer adults will deposit singular eggs on the stigma end of small nutlets. Oviposition or egg lay will begin 7 and 10 days after the initia l catch of adults in pheromone traps. New eggs are a pearly white color but as eggs mature, red spots will form and the egg will take on a pink or red color prior to hatch. Time from egg lay to larval hatch is 3 to 5 days. STINK BUGS AND LEAFFOOTED BUGS Several species of stink bugs and leaffooted bugs feed on pecan nuts. Infestations often develop on field crops or weeds and then move into pecans. Stink bugs and leaffooted bugs suck sap from developing nuts. Nuts injured before the shells harden fall from the tree. Feeding after shell hardening causes brown or black spots on the kernel. Affected areas taste bitter. As adults, these bugs overwinter under fallen leaves and in other sheltered places on the ground. Adults lay eggs on many crops and weeds, where populations increase in summer. Fields of soybeans, other legumes and sorghum may be sources of adults that fly to pecans. Infestations are usually greatest from September through shuck split. Weed control in and near the orchard helps suppress stink bugs and lower the possibility of their moving into pecans. Cypermethrin (Ammo reg. Cymbush reg ), esfenvalerate (Asana reg. azinphosmethyl (Guthion reg ) or carbaryl (Sevin reg ) applied for other pests may also control stink bugs and leaffooted bugs. These kernel-feeding insects can also be managed by planting certain host or trap crops, which lure adult stink bugs and leaffooted bugs away from pecans in September, October and November. Planting plots or single rows of peas (blackeye, purple hull, crowder, etc.) along the edge of the pecan orchard in the last week of July through the first week of August produces an attractive trap crop for these pests. The trap crop does not have to be continuous around the entire orchard. Small plantings in several selected locations can be enough. To help ensure having an attractive trap crop longer into the fall, stagger the plantings by a couple of weeks. Monitor the peas for adult leaffooted and stink bugs when the plants begin to bloom and set pods. Apply an insecticide to the trap crop to kill stink bugs and leaffooted bugs once the crop stops blooming and setting pods. This treatment is necessary to kill the bugs before they have a chance to leave and fly into the pecans. Before planting a trap crop, consider these factors: having available water to obtain a stand planting a variety of pea suited to the soil type and soil pH of the orchard weed control and grazing of plots by wildlife and livestock. High populations on nut clusters can result in nut loss. Currently there are no well defined guidelines for treatment thresholds. Provado reg is a selective insecticide for sucking insects and could be used to treat spittle bugs and not disrupt beneficial insects. HICKORY SHUCKWORM . Hickory shuckworm is an important mid - and late-season pest of pecans throughout much of Texas. Shuckworm larvae tunnel in the shuck, interrupting the flow of nutrients and water needed for normal kernel development. Infested nuts are scarred, late in maturing and of poor quality. Damaged shucks stick to the nuts and fail to open, creating sticktights that reduce harvesting efficiency. Infestations occurring before shell hardening may cause nuts to fall. Adult shuckworms are dark brown to grayish-black moths about 38 inch long. They are active in spring before pecan nuts are available. Adults deposit eggs on hickory nuts and pecan buds. Larvae on pecan feed in phylloxera galls in spring. Later in the season when pecan nuts are present, moths deposit eggs singly on the nuts. The egg is attached to the shuck with a creamy white substance visible on the shuck surface. The tiny larva hatches in a few days and burrows into the shuck to feed for about 15 to 20 days. Mature larvae are about 12 inch long, and cream colored with light brown heads. Pupation occurs in the shuck and the moth soon emerges. Several generations are completed each year. Shuckworms overwinter as full-grown larvae in old pecan shucks on the tree or the orchard floor. Pecans are most susceptible to hickory shuck-worm damage during the water through gel stages. If the orchard has a history of shuckworm damage, treat with insecticide when pecans reach the half-shell hardening stage. Asecond application 10 to 14 days later may be needed. Cultivars such as Pawnee and other early-maturing varieties that reach half-shell hardening earlier than other varieties must be treated earlier for hickory shuckworm. Removing and destroying old shucks and dropped nuts, where shuckworms overwinter, can reduce shuckworm infestations. Pheromone traps are available that attract and capture hickory shuckworm moths. Guidelines for using trap catches to determine the need for treatment have not been validated in Texas. RED IMPORTED FIRE ANT Fire ants can lower pecan production when they interfere with such operations as grafting, mowing and harvesting. They also may damage drip or sprinkler irrigation systems. Chlorpyrifos (Lorsban reg ) is registered for use in pecan orchards as an orchard floor spray for fire ants. Logic Fire Ant Bait reg is registered for use only in nonbearing pecan orchards. BLACK PECAN APHID The black pecan aphid is much more destructive than the two species of yellow aphid. Three black pecan aphids per compound leaf can cause severe leaf damage and defoliation. Like yellow aphids, the black pecan aphid feeds on the undersides of leaves and occurs throughout the pecan growing region of Texas. While feeding, black pecan aphids inject a toxin that turns the leaf tissue between major veins bright yellow. These damaged areas, up to 14 inch across, turn brown and die. Infested leaves soon fall. Premature defoliation reduces nut fill and the next yearOtildes production. The black pecan aphid is pear-shaped. Nymphs are dark olive-green while adults, which may be winged, are black. Like yellow aphids, all summer forms are females that reproduce without mating. Male and female forms appear in fall and females lay eggs that overwinter on branches. Densities often are very low until August or September, when infestations often increase rapidly. Monitor the orchard frequently for black pecan aphids and their characteristic leaf injury. Because these aphids feed singly and can be damaging in low numbers, examine leaves closely. Examine the interior of the canopy, where infestation often begins. In general, treat when black pecan aphids average two to three per compound leaf. In most cases, black pecan aphids are easier than yellow aphids to control with insecticides. Natural enemies are important in maintaining low numbers of black pecan aphids. YELLOW APHIDS Aphids are small, soft-bodied insects that suck sap from pecan leaves. There are two species of yellow or honeydew aphids, the blackmargined aphid, Monellia caryella. and the yellow pecan aphid, Monelliopsis pecanis. The blackmargined aphid has a black stripe along the outside margin of its wings, which are held flat over the body. The yellow pecan aphid holds its wings roof-like over its body and lacks the black stripe along the wing margin. Immature aphids are difficult to identify because they lack wings. Infestations may contain both species. Blackmargined aphid infestations typically increase to large numbers during June to August and then decline after about 3 weeks. Outbreaks on most cultivars (except possibly Cheyenne) usually decline without causing measurable damage to foliage or yield. The yellow pecan aphid occurs later in the season. Outbreaks of this species can cause defoliation and reduce yield and quality on most cultivars. Both species of yellow aphids have piercingsucking mouthparts for removing water and plant nutrients from leaf veins. As they feed, aphids excrete large amounts of excess sugars. This sticky material, called honeydew, collects on leaves. Honeydew serves as a food source for sooty mold, which can cover leaves when humidity is high. The shading effect of sooty mold can reduce photosynthesis. Studies have also shown that aphid feeding can reduce leaf efficiency large, persistent infestations of the yellow pecan aphid, M. pecanis, can defoliate trees. This leaf injury and loss can reduce current and subsequent yields and quality because of lower carbohydrate production. Yellow aphid eggs survive the winter hidden in bark crevices on twigs and tree trunks. Immature aphids, called nymphs, hatch from eggs in spring and begin to feed on newly expanded leaves. Nymphs mature in about a week and give birth to live young. All individuals are females that reproduce without males during spring and summer. In late September and October, males and females develop, and females deposit overwintering eggs. Control. Aphids have a short life cycle and high reproductive capacity, so infestations can increase quickly under favorable conditions. Natural enemies, including lacewings, lady beetles, spiders and other insects, can suppress aphid infestations if there are enough of them. Insecticides applied for aphids or other pests can sometimes destroy these natural enemies, allowing aphids to increase to even greater densities than before treatment. Inspect leaves frequently to monitor yellow aphid densities. Treatment of either species of yellow aphid may be justified on Cheyenne when aphid densities are high and persist for several weeks. Pawnee is the least susceptible cultivar to yellow aphids and normally needs no protection with insecticides. Consider treatment when infestations of yellow pecan aphid exceed 25 per compound leaf, indicating the onset of an outbreak. Scouting the orchard on a 4- to 5-day schedule will determine if yellow pecan aphid numbers are increasing or decreasing and indicate the need for insecticide treatment. Do not base the need for treatment on the amount of honeydew alone, as infestations often decline rapidly (crash) because of weather or physiological effects. Insecticides do not consistently control either species of yellow aphids. Aphids may become tolerant to an insecticide used frequently in an orchard. An insecticide that is effective in one orchard may be ineffective in a nearby orchard. Studies have shown that in some cases, applications of pyrethroid insecticides (Asana reg. Ammo reg. Cymbush reg ) to control casebearers or aphids may be followed by large increases in yellow aphids. PECAN PHYLLOXERA : Feeding by the immature stages of the pecan phylloxera, Phylloxera devastatrix causes galls or knots to form on the woody portion of the new growth. This includes stems, leaf petioles and midribs, nutlets and catkins. Heavy infestations of this insect can cause nut loss and defoliation. The immature stage hatches from eggs in the spring that have overwintered on the tree. The immatures, also known as stem mothers migrate to the new growth where they settle and begin to feed. As the phylloxera feed, gall formation is initiated with tissue forming around the insect. If an insecticide is needed, it should be applied before the immatures become embedded in the new tissue. Insecticides only need to be applied to a tree if a tree had galls the previous season. The time of treatments should be when the foliage is at the stage shown in the picture. Recommended insecticides can be found in the Texas Agricultural Extension Service publication Managing Insect and Mite Pests of Commercial Pecans in Texas B-1238. Since the last printing of the pecan insect control guide, the insecticide imidacloprid, (Provado 1.6F or Admire 2F) has received a label for pecans. Provado 1.6F, the formulation for foliar application has provided good control of phylloxera. In addition, this product does not have a grazing restriction. SAWFLY Adult sawflies are small, bee-like in appearance and are about 14 to 13 inch long. Larvae feed on foliage and leave holes in the leaves or consume the whole leaf. Sawfly larvae resemble caterpillars but are actually larvae of a wasp. Larvae of moths and butterflies have 1 to 4 sets of abdominal prolegs, whereas sawfly larvae have 6 sets. Once larvae finish feeding, they drop to the ground and burrow into the soil to overwinter. There is only one generation per year. FALL WEBWORM . Fall webworm caterpillars build large silken webs in pecan trees. A hundred or more caterpillars may be found inside the web, where they feed on pecan leaves. Large infestations may cover the tree with webs, causing severe defoliation. Mature larvae are about 1 inch long, pale yellow or green, and covered with tufts of long, white hairs. The adult is a white moth with dark spots on the wings. Female moths emerge in spring and deposit eggs in masses of several hundred on the undersides of pecan and other tree leaves. The greenish-white eggs are covered by gray hairs left by the female. There are two to four generations each year, depending on location in the state. The last or fall generation is usually the most damaging. Many insect parasites and predators feed on and reduce the number of fall webworm larvae. Also, insecticides applied for other pecan pests help reduce webworm densities. If webs are common and the potential defoliation appears unacceptable, spot spraying of infested trees may be practical. The insecticide spray must penetrate the web to be effective. WALNUT CATERPILLAR . Walnut caterpillars feed together in large numbers on pecan leaves, but do not build silken webs like fall webworms. Larvae eat leaves, leaving only the mid-ribs and leaf stems. Large infestations can defoliate entire trees. This insect is found throughout Texas east of the Pecos River. Although economic infestations are uncommon, severe and widespread outbreaks of walnut caterpillar have occasionally occurred in Texas. Walnut caterpillar moths emerge in spring, de-positing eggs in masses of 500 or more on the undersides of leaves. The egg masses are round, about the size of a half-dollar and are not covered with hairs or scales. Eggs hatch in about 10 days larvae feed for about 25 days. Young larvae are reddish-brown with yellow lines running the length of the body. Full-grown larvae are about 2 inches long, black with grayish lines and are covered with long, soft, gray hairs. Larvae congregate in large masses on the trunk and scaffold branches to shed their skins before crawling back to complete feeding on leaves. These final-stage larvae consume most of the foliage, and defoliation can occur very quickly. Mature larvae crawl to the soil to pupate. A generation is completed in about 6 to 8 weeks. There are two to three generations each year. Because walnut caterpillars do not build tents or webs, infestations often go unnoticed until leaf damage becomes obvious. To detect infestations early, look for egg masses or leaf feeding. Egg masses can be detected at night by shining a flashlight on the undersides of leaves and looking for white spots about the size of a half dollar. SPIDER MITES . The pecan leaf scorch mite is the most important spider mite attacking pecans. Large numbers of these tiny mites feed on the undersides of pecan leaves. Mites suck plant sap, causing irregular brown spots on infested leaves. Infestations often develop first along the leaf midrib. Damaged leaves appear russeted or scorched. Large infestations can result in leaf loss, especially if trees are under moisture stress. Scorch mites overwinter as adults in the rough bark of limbs. Adult females begin laying eggs in spring. Mites can complete a generation in 5 to 15 days and are more numerous during hot, dry weather. Natural enemies of scorch mites, including predatory mite species, are important in controlling these pests. Because scorch mites prefer the shady, interior portion of the tree, significant damage can occur before infestations are detected. Check water sprouts and shady, lower branches to detect early mite infestations. Mites may increase after some insecticides (e. g. Sevin reg ) are applied for hickory shuckworm, aphids or other pests. Monitor the orchard for mites when the weather is hot and dry and after insecticides are used. Spray when mites are present and damaging leaves. Mark infested trees or areas to determine if spot treatment is practical. ASIAN AMBROSIA BEETLE Infestations of the Asian ambrosia beetle can be identified by the toothpick-like projections from the trunk or the main scaffold limbs. Infested trees should be removed and surrounding trees should be treated with lindane or chlorpyrifos (Lorsban reg). This is an early season pest with most infestations observed in April or May. Infested trees should be burned or shredded to prevent the adults from from emerging from the wood.

Comments

Popular posts from this blog

Online Trading Akademie Profi Trader Kurs Review

Online Trading Academy Review PROS Es gibt Hunderte von Kursen zu lesen, zu hören oder zu besuchen. CONS Sie can8217t verwenden Sie Online Trading Academy wie eine Trading Broker8217s Website. VERDICT Die Online Trading Academy wäre einer unserer ersten Stationen beim Lernen, um Aktien online zu handeln. Redakteure Hinweis: Diese Bewertung wurde von unserem Side-by-Side-Vergleich entfernt, weil sie nicht mehr als Top 10 Produkt zählt. Die Original-Bewertung ist unten, aber schauen Sie sich unsere aktuellen Top 10 über Online Stock Trading für Anfänger hier. Online Trading Academy Die Online Trading Academy ist eine der einzigen Börsenplattformen, die Live Training anbieten. Sie bieten Fünf-Tage-Kurse mit eingehenden Curriculum für die Grundlagen der Börse für Anfänger. Für diejenigen, die lernen wollen, wie man Aktien online handeln kann, haben die Schüler die Möglichkeit, Inhalte praktisch auch über Online-Webinare mit Themen von Aktien zu Forex zu Optionen zu Futures zugreifen. Wenn ...