MOVING FORTH Bagian 1: Merancang Keputusan di Kernel Keempat oleh Brad Rodriguez Artikel ini pertama kali dimuat di The Computer Journal 59 (JanuariFebruari 1993). PENDAHULUAN Semua orang di komunitas Forth berbicara tentang betapa mudahnya untuk memasuki Forth ke CPU baru. Tapi seperti banyak kutipan dan pertanyaan kuotomatis, tidak banyak yang tertulis tentang bagaimana melakukannya. Jadi, ketika Bill Kibler menyarankan topik ini untuk sebuah artikel, saya memutuskan untuk memutuskan tradisi lisan Forthwrights yang hebat, dan mendokumentasikan prosesnya dalam warna hitam dan putih. Selama artikel ini saya akan mengembangkan Forths untuk 6809, 8051, dan Z80. Im melakukan 6809 untuk mengilustrasikan model Forth yang mudah dan konvensional plus, saya telah mempublikasikan 6809 assembler ROD91, ROD92, dan Ill membutuhkan 6809 Forth untuk proyek TCJ di masa depan. Saya melakukan Proyek 8.051 untuk sebuah proyek di Universitas, namun juga menggambarkan beberapa keputusan desain yang agak berbeda. Z80 Forth adalah untuk semua pembaca CPM TCJ, dan untuk beberapa teman dengan mengumpulkan sampah TRS-80an. PERANGKAT KERAS PENTING Anda harus memilih CPU. Saya tidak akan menyelidiki kelebihan satu CPU di atas yang lain untuk Forth, karena pilihan CPU biasanya dipaksakan pada Anda oleh pertimbangan lain. Selain itu, objek dari artikel ini adalah untuk menunjukkan bagaimana cara memindahkan Forth ke CPU manapun. Anda bisa mengharapkan kernel 16-bit Forth yang biasa (lihat di bawah) untuk menempati sekitar 8K byte ruang program. Untuk kernel lengkap yang bisa mengkompilasi definisi Forth, Anda harus mengizinkan RAM 1K byte minimum. Untuk menggunakan sistem pengelolaan blok Forths untuk penyimpanan disk, Anda harus menambahkan 3 Kbytes atau lebih untuk buffer. Untuk model Forth 32-bit, dua kali lipat angka ini. Ini adalah minimum untuk mendapatkan kernel dan kernel Forth. Untuk menjalankan aplikasi pada perangkat keras Anda, Anda harus meningkatkan ukuran PROM dan RAM yang sesuai. 16 ATAU 32 BIT Ukuran kata yang digunakan oleh Forth tidak harus sama dengan CPU. Forth praktis terkecil adalah model 16-bit yaitu satu yang menggunakan bilangan bulat 16 bit dan alamat 16 bit. Komunitas Forth menyebut ini ukuran quotcellquot, karena kata kunci mengacu pada definisi Forth. CPU 8-bit hampir selalu mendukung 16-bit Forths. Ini biasanya membutuhkan pengkodean eksplisit dari aritmatika double-byte, walaupun beberapa CPU 8-bit memang memiliki beberapa operasi 16 bit. 16-bit CPU biasanya menjalankan 16-bit Forths, meskipun teknik presisi ganda yang sama dapat digunakan untuk menulis 32-bit Forth pada CPU 16 bit. Setidaknya satu 32-bit Forth telah ditulis untuk 80868088. CPU 32-bit biasanya menjalankan 32-bit Forths. Model Forth yang lebih kecil jarang menghemat panjang kode atau waktu prosesor. Namun, saya tahu setidaknya ada 16 bit Forth yang ditulis untuk 68000. Ini mengurangi ukuran kode aplikasi dengan faktor dua, karena definisi Forth tingkat tinggi menjadi rangkaian alamat 16 bit daripada string 32- Alamat bit (Ini akan menjadi jelas segera.) Kebanyakan 68.000, meskipun, memiliki banyak RAM. Semua contoh yang dijelaskan dalam artikel ini adalah 16-bit Forths yang berjalan pada CPU 8-bit. TEKNIK PENCIPTAANKodeTotot yang dicentang adalah ciri khas Forth. Sebuah kutipan kuantum hanya daftar alamat rutin yang akan dieksekusi. Anda bisa menganggap ini sebagai daftar panggilan subrutin, dengan petunjuk CALL dihapus. Selama bertahun-tahun banyak variasi threading telah dirancang, dan mana yang terbaik tergantung pada CPU dan aplikasi. Untuk membuat keputusan, Anda perlu memahami bagaimana mereka bekerja, dan pengorbanan mereka. Tidak Langsung Threaded Code (ITC) Ini adalah teknik pengarsipan Forth klasik, yang digunakan pada fig-Forth dan F83, dan dijelaskan dalam kebanyakan buku di Forth. Semua skema threading lainnya adalah quotimprovementsquot pada hal ini, jadi Anda perlu memahami ITC untuk menghargai yang lain. Mari kita lihat definisi kata depan SQUARE: Dalam ITC Forth yang khas, ini akan muncul di memori seperti yang ditunjukkan pada Gambar 1. (Header akan dibahas di artikel masa depan yang berisi informasi rumah tangga yang digunakan untuk kompilasi, dan tidak terlibat dalam threading .) Asumsikan SQUARE ditemui saat mengeksekusi kata Forth lainnya. Forths Interpreter Pointer (IP) akan menunjuk ke sel dalam memori - terdapat dalam kata quototherquot tersebut - yang berisi alamat kata SQUARE. (Tepatnya, sel itu berisi alamat Lapangan Kode SQUAREs.) Penafsir mengambil alamat itu, dan kemudian menggunakannya untuk mengambil isi Lapangan Kode SQUAREs. Isi ini adalah alamat lain - alamat subroutine bahasa mesin yang melakukan kata SQUARE. Dalam pseudo-code, ini adalah: Ini menggambarkan sebuah prinsip penting namun jarang dijelaskan: alamat kata Forth yang baru dimasukkan disimpan dalam W. KODE kata-kata tidak memerlukan informasi ini, tapi semua jenis kata-kata Forth lainnya. Jika SQUARE ditulis dalam kode mesin, ini akan menjadi akhir dari cerita: sedikit kode mesin akan dieksekusi, dan kemudian beralih kembali ke interpreter Forth - yang, sejak IP bertambah, mengarah ke kata berikutnya ke dihukum mati. Inilah sebabnya mengapa juru bahasa Forth biasanya disebut NEXT. Tapi, SQUARE adalah definisi quotcolonquot tingkat tinggi - ini berisi quotthreadquot, daftar alamat. Untuk melakukan definisi ini, juru bahasa Forth harus dimulai kembali di lokasi baru: Bidang Parameter SQUARE. Tentu saja, lokasi penerjemah lama harus diselamatkan, untuk melanjutkan kata Quotquot Forth dulu setelah SQUARE selesai. Ini sama seperti panggilan subrutin Tindakan bahasa mesin SQUARE hanyalah untuk mendorong IP lama, mengatur IP ke lokasi baru, menjalankan penerjemah, dan saat SQUARE dilakukan, pop IP. (Seperti yang Anda lihat, IP adalah kuartalan counterquot dari tingkat tinggi Forth.) Ini disebut DOCOLON atau ENTER di berbagai Forths: Fragmen kode yang identik ini digunakan oleh semua definisi Forth tingkat tinggi (yaitu threaded) Thats why a pointer Untuk fragmen kode ini, bukan fragmen itu sendiri, termasuk dalam definisi Forth. Lebih dari ratusan definisi, penghematan bertambah dan inilah mengapa disebut threading tidak langsung. The quotreturn dari subroutinequot adalah kata EXIT, yang dikompilasi saat Forth melihat. (Beberapa orang menyebutnya S bukan EXIT.) EXIT hanya menjalankan rutinitas bahasa mesin yang melakukan hal berikut: Berjalanlah melalui beberapa definisi Forth bersarang, hanya untuk meyakinkan diri Anda bahwa ini berhasil. Perhatikan karakteristik ITC: setiap kata Forth memiliki Field Code satu sel. Definisi usus mengkompilasi satu sel untuk setiap kata yang digunakan dalam definisi. Dan juru bahasa Forth harus benar-benar melakukan tipuan ganda untuk mendapatkan alamat kode mesin berikutnya untuk dijalankan (pertama melalui IP, lalu melalui W). ITC bukanlah teknik threading terkecil maupun tercepat. Ini mungkin yang paling sederhana meski DTC (dijelaskan selanjutnya) sama sekali tidak lebih kompleks. Jadi mengapa begitu banyak Forths tidak langsung threaded Terutama karena sebelumnya Forths, digunakan sebagai model, tidak langsung. Hari-hari ini, DTC menjadi lebih populer. Jadi, kapan sebaiknya ITC digunakan Dari berbagai teknik, ITC menghasilkan definisi terbersih dan paling elegan - tidak lain kecuali alamat. Jika Anda menyesuaikan diri dengan pertimbangan tersebut, ITC dapat mengajukan banding kepada Anda. Jika kode Anda berkutat dengan bagian dalam definisi, kesederhanaan dan keseragaman representasi ITC dapat meningkatkan portabilitas. ITC adalah model Forth klasik, jadi mungkin lebih disukai untuk pendidikan. Akhirnya, pada CPU yang kekurangan instruksi panggilan subrutin - seperti 1802 - ITC seringkali lebih efisien daripada DTC. Kode Berurutan Langsung (DTC) Direct Threaded Code berbeda dari ITC hanya dalam satu hal: alih-alih Kode Bidang yang berisi alamat beberapa kode mesin, Kode Bidang berisi kode mesin sebenarnya. Saya tidak mengatakan bahwa kode lengkap untuk ENTER terdapat dalam masing-masing dan setiap definisi kolon. Dalam kata-kata kuotri tingkat tinggi, Field Kode akan berisi panggilan subrutin. Seperti yang ditunjukkan pada Gambar 2. Definisi usus, misalnya, akan berisi panggilan ke rutinitas ENTER. Kode pseudo-NEXT untuk threading langsung adalah sederhana: Kecepatan keuntungan ini: penafsir sekarang hanya melakukan tipuan tunggal. Pada Z80 ini akan mengurangi rutinitas BERIKUTNYA - fragmen kode yang paling banyak digunakan di kernel Forth - dari sebelas instruksi ke tujuh Ruang biaya ini: setiap definisi tingkat tinggi di Z80 Forth (misalnya) sekarang satu byte lebih lama, Karena alamat 2 byte telah diganti dengan panggilan 3 byte. Tapi ini tidak benar secara universal. 32-bit 68000 Forth dapat mengganti alamat 4 byte dengan instruksi BSR 4-byte, tanpa rugi bersih. Dan pada Zilog Super8, yang memiliki instruksi mesin untuk DTC Forth, alamat 2 byte diganti dengan instruksi ENTER 1 byte, membuat DTC Forth lebih kecil pada Super8 Tentu saja, definisi DTC CODE dua byte lebih pendek, karena mereka Tidak lagi membutuhkan pointer sama sekali Saya biasa berpikir bahwa definisi tingkat tinggi di DTC Forths mengharuskan penggunaan panggilan subrutin di Bidang Kode. Frank Sergeant Pygmy Forth SER90 menunjukkan bahwa lompatan sederhana dapat digunakan dengan mudah, dan biasanya akan lebih cepat. Guy Kelly telah menyusun ulasan hebat tentang implementasi Forth untuk IBM PC KEL92, yang sangat saya rekomendasikan untuk semua penulis kernel Forth. Dari 19 jurusan yang ia pelajari, 10 menggunakan DTC, 7 menggunakan ITC, dan 2 menggunakan thread subrutin (dibahas selanjutnya). Saya merekomendasikan penggunaan Direct-Threaded Code over-Direct Threaded Code untuk semua kernel Forth yang baru. Langsung ke NEXT, atau kode itu in-line The Forth inner interpreter, NEXT, adalah rutinitas umum untuk semua definisi KODE. Anda mungkin hanya menyimpan satu salinan rutinitas umum ini, dan meminta semua kata KODE melompat ke sana. (Perhatikan bahwa Anda Langsung ke NEXT a subroutine Call tidak diperlukan). Namun, kecepatan NEXT sangat penting bagi kecepatan keseluruhan sistem Forth. Selain itu, pada banyak CPU, rutinitas BERIKUTNYA cukup singkat sering hanya dua atau tiga instruksi. Jadi mungkin lebih baik kode NEXT in-line, dimanapun itu digunakan. Hal ini sering dilakukan dengan membuat NEXT sebuah assembler macro. Ini adalah kecepatan sederhana vs keputusan ruang: in-line NEXT selalu lebih cepat, tapi hampir selalu lebih besar. Peningkatan ukuran total adalah jumlah byte tambahan yang diperlukan untuk ekspansi in-line, kali jumlah kata-kata KODE dalam sistem. Kadang-kadang tidak ada tradeoff sama sekali: dalam DTC Forth 6809, in-line NEXT lebih pendek daripada instruksi Jump Subroutine Threaded Code (STC) Definisi Forth tingkat tinggi tidak lain adalah daftar subrutin yang akan dieksekusi. Anda tidak memerlukan juru bahasa untuk melakukannya, Anda bisa mendapatkan efek yang sama dengan hanya merangkai daftar panggilan subrutin bersama-sama: Lihat Gambar 3. Representasi kata-kata Forth ini telah digunakan sebagai titik awal untuk menjelaskan teknik threading ke bahasa assembly programmer KOG82. STC adalah representasi elegan definisi kolon dan kata-kata KODE sekarang identik. QuotDefined wordsquot (VARIABLE, CONSTANTs, dan sejenisnya) ditangani sama seperti di DTC - Field Code dimulai dengan lompatan atau panggilan ke beberapa kode mesin di tempat lain. Kelemahan utama adalah bahwa panggilan subrutin biasanya lebih besar daripada alamat sederhana. Pada Z80, misalnya, ukuran definisi usus besar meningkat sebesar 50 - dan sebagian besar aplikasi Anda adalah definisi usus buntu. Sebaliknya, pada 68000 32-bit mungkin tidak ada peningkatan ukuran sama sekali, ketika alamat 4 byte diganti dengan BSR 4 byte. (Tapi jika ukuran kode Anda melebihi 64K, beberapa alamat tersebut harus diganti dengan JSR 6-byte.) Antrian subroutine mungkin lebih cepat daripada threading langsung. Anda menghemat waktu dengan tidak memiliki juru bahasa, tapi Anda kehilangan waktu karena setiap referensi ke kata Forth melibatkan push and pop dari alamat pengirim. Dalam DTC Forth, hanya kata-kata tingkat tinggi yang menyebabkan aktivitas di tumpukan kembali. Pada 6809 atau Zilog Super8, DTC lebih cepat dari STC. Ada keuntungan lain untuk STC: ini membagi-bagikan dengan register IP. Beberapa prosesor - seperti 8.051 - sangat kekurangan register pengalamatan. Menghilangkan IP benar-benar dapat menyederhanakan dan mempercepat kernel. Satu-satunya cara untuk mengetahui dengan pasti adalah dengan menulis kode contoh. Hal ini terkait erat dengan seleksi register, yang dibahas pada bagian selanjutnya. STC dengan in-line expansion optimization direct compilation Pada CPU lama dan 8-bit, hampir setiap primitif Forth melibatkan beberapa instruksi mesin. Tetapi pada CPU yang lebih kuat, kebanyakan primitif Forth ditulis dalam satu instruksi. Sebagai contoh, pada 32-bit 68000, DROP hanya Dalam subwutine-threaded Forth, menggunakan DROP dalam definisi kolon akan menghasilkan urutan ADDQ adalah instruksi dua byte. Mengapa menulis panggilan subrutin empat byte ke instruksi dua byte Tidak peduli berapa kali DROP digunakan, tidak ada penghematan Kode lebih kecil dan lebih cepat jika ADDQ dikodekan langsung ke arus BSR. Beberapa kompiler Forth melakukan ekspansi kuototometer ini dari kata-kata KODE CUR93a. Kerugian dari ekspansi in-line adalah dekompilasi kembali ke kode sumber asli menjadi sangat sulit. Selama panggilan subrutin digunakan, Anda masih memiliki petunjuk (alamat subrutin) ke kata-kata Forth yang terdiri dari benang. Dengan petunjuk pada kata-kata itu, Anda bisa mendapatkan namanya. Tapi begitu sebuah kata diperluas menjadi kode in-line, semua pengetahuan tentang asal kode itu hilang. Keuntungan dari ekspansi in-line - selain dari kecepatan dan ukuran - adalah potensi pengoptimalan kode. Sebagai contoh, urutan Forth akan disusun dalam 68000 STC karena namun dapat diperluas secara in-line sebagai instruksi mesin tunggal Mengoptimalkan kompiler Forth terlalu luas menjadi topik untuk artikel ini. Ini adalah area aktif penelitian bahasa Forth yang melihat, misalnya, SCO89 dan CUR93b. Puncak terakhir dari STC yang dioptimalkan adalah Forth yang mengkompilasi kode mesin quotpurequot, seperti kompiler C atau Fortran. Token Threaded Code (TTC) DTC dan STC bertujuan untuk meningkatkan kecepatan program Forth, dengan beberapa biaya dalam memori. Sekarang mari kita bergerak arah lain dari ITC, menuju sesuatu yang lebih lambat tapi lebih kecil. Tujuan thread Forth adalah untuk menentukan daftar kata-kata Forth (subrutin) yang akan dilakukan. Misalkan sistem 16-bit Forth hanya memiliki 256 kata yang berbeda. Kemudian setiap kata bisa dikenali secara unik oleh nomor 8-bit. Alih-alih daftar alamat 16 bit, Anda akan memiliki daftar pengenal 8 bit atau quottokens, quot dan ukuran definisi kolon akan dibelah dua. Forth menyimpan sebuah tabel alamat dari semua kata-kata Forth, seperti Ditunjukkan pada Gambar 4. Nilai token kemudian digunakan untuk mengindeks ke dalam tabel ini, untuk menemukan kata Forth yang sesuai dengan tanda yang diberikan. Ini menambahkan satu tingkat tipuan pada juru bahasa Forth, jadi lebih lambat dari pada kuadrat-threadedquot Forth. Keuntungan utama dari token-threaded Forths adalah ukuran kecil. TTC paling sering terlihat pada komputer genggam dan aplikasi dengan ukuran terbatas lainnya. Juga, tabel tanda kutip masuk ke dalam semua kata-kata Forth dapat mempermudah keterkaitan modul yang disusun secara terpisah. Kerugian dari TTC adalah kecepatan: TTC membuat Forths paling lambat. Juga, kompiler TTC sedikit lebih kompleks. Jika Anda memerlukan lebih dari 256 kata terakhir, diperlukan beberapa skema pengkodean terbuka untuk menggabungkan token 8 bit dan lebih besar. Saya dapat membayangkan 32-bit Forth menggunakan token 16 bit, tapi berapa banyak sistem 32-bit yang dibatasi oleh ukuran Segmen Threaded Code Karena ada begitu banyak turunan 8086 di dunia, threading segmen pantas untuk disebutkan secara singkat. Alih-alih menggunakan alamat byte quotnormalquot dalam segmen 64K, alamat paragraf digunakan. (A quotparagraphquot adalah 16 byte di 8086.) Kemudian, penafsir dapat memuat alamat ini ke dalam register segmen, bukan ke register alamat biasa. Ini memungkinkan model Forth 16 bit untuk mengakses memori megabyte 8086 secara efisien. Kelemahan utama dari threading segmen adalah kuotimasi frekuensi 16 byte pada ruang memori. Setiap kata Forth harus disesuaikan dengan batas 16 byte. Jika kata-kata Forth memiliki panjang acak, rata-rata 8 byte akan terbuang per kata Forth. ALOKASI PENDAFTARAN Di samping teknik threading, penggunaan register CPU adalah keputusan desain yang paling penting. Mungkin yang paling sulit. Ketersediaan register CPU dapat menentukan teknik threading apa yang dapat digunakan, dan bahkan peta memori apa yang akan menjadi The Classical Forth Register Model klasik Forth memiliki lima register bilangan bulat. Ini adalah entitas abstrak yang digunakan dalam operasi primitif Forth. NEXT, ENTER, dan EXIT didefinisikan sebelumnya dalam hal register abstrak ini. Masing-masing adalah satu sel lebar - yaitu di Forth 16 bit, ini adalah register 16 bit. (Ada pengecualian untuk aturan ini, seperti yang akan Anda lihat nanti.) Ini mungkin tidak semua register CPU. Jika CPU Anda tidak memiliki cukup register, beberapa di antaranya dapat disimpan di memori. Saya menggambarkannya sesuai urutan kepentingannya, yaitu bagian bawah daftar ini adalah kandidat terbaik untuk disimpan di memori. W adalah register kerja. Ini digunakan untuk banyak hal, termasuk referensi memori, jadi seharusnya register alamat misalnya Anda harus bisa mengambil dan menyimpan memori dengan menggunakan isi W sebagai alamatnya. Anda juga harus bisa melakukan aritmatika pada W. (Dalam DTC Forths, Anda juga harus bisa melompat secara tidak langsung menggunakan W.) W digunakan oleh penafsir dalam setiap kata di Forth. Dalam sebuah CPU yang hanya memiliki satu register, Anda akan menggunakannya untuk W dan menyimpan memori lainnya (dan sistemnya akan sangat lambat). IP adalah Interpreter Pointer. Ini digunakan oleh setiap kata Forth (melalui NEXT, ENTER, atau EXIT). IP harus berupa register alamat. Anda juga perlu untuk bisa kenaikan IP. Subroutine threaded Forths tidak memerlukan register ini. PSP adalah Parameter Stack (atau quotdata stackquot) Pointer, terkadang disebut hanya SP. Saya lebih suka PSP karena SP sering nama register CPU, dan mereka tidak boleh bingung. Sebagian besar kata KODE menggunakan ini. PSP harus berupa stack pointer, atau register alamat yang bisa bertambah dan decremented. Its juga plus jika Anda bisa melakukan pengalamatan terindeks dari PSP. RSP adalah Return Stack Pointer, terkadang disebut hanya RP. Ini digunakan oleh definisi kolon di ITC dan DTC Forths, dan dengan semua kata dalam STC Forths. RSP harus berupa stack pointer, atau register alamat yang bisa bertambah dan decremented. Jika memungkinkan. Letakkan W, IP, PSP, dan RSP di register. Register virtual yang mengikuti dapat disimpan dalam memori, namun biasanya ada keuntungan kecepatan untuk menyimpannya dalam register CPU. X adalah daftar kerja, bukan dianggap sebagai salah satu register Quantum kuotomatis, meskipun ITC Forth klasik membutuhkannya untuk tipuan kedua. Dalam ITC Anda harus bisa melompat secara tidak langsung menggunakan X. X juga bisa digunakan oleh beberapa kata KODE untuk melakukan aritmatika dan semacamnya. Hal ini sangat penting pada prosesor yang tidak dapat menggunakan memori sebagai operan. Misalnya, ADD on a Z80 mungkin (dalam pseudo-code) Kadang-kadang register kerja lain, Y, juga didefinisikan. UP adalah User Pointer, memegang alamat dasar area pengguna tugas. UP biasanya ditambahkan ke offset, dan digunakan oleh kode Forth tingkat tinggi, sehingga bisa disimpan di suatu tempat. Tetapi jika CPU bisa melakukan pengalamatan terindeks dari register UP, kata-kata KODE dapat lebih mudah dan cepat mengakses variabel pengguna. Jika Anda memiliki surplus register alamat, gunakan satu untuk UP. Tugas tunggal untuk tidak membutuhkan UP. X - jika diperlukan - lebih penting untuk tetap mendaftar daripada UP. UP adalah termudah dari register virtual Forth untuk pindah ke memori. Penggunaan Hardware Stack Sebagian besar CPU memiliki stack pointer sebagai bagian dari perangkat keras mereka, yang digunakan oleh interrupt dan subroutine calls. Bagaimana peta ini masuk ke register Forth Jika itu adalah PSP atau RSP Jawaban singkatnya adalah, itu tergantung. Dikatakan bahwa PSP digunakan lebih banyak daripada RSP di ITC dan DTC Forths. Jika CPU Anda memiliki beberapa register alamat, dan PUSH dan POP lebih cepat daripada referensi eksplisit, gunakan tumpukan perangkat keras sebagai Parameter Stack. Di sisi lain, jika CPU Anda kaya dalam mode pengalamatan - dan memungkinkan pengalamatan terindeks - ada nilai tambah dalam memiliki PSP sebagai register alamat tujuan umum. Dalam kasus ini, gunakan tumpukan perangkat keras sebagai Return Stack. Terkadang Anda tidak menggunakan tumpukan perangkat keras TMS320C25 hanya delapan sel dalam - semuanya tapi tidak berguna untuk Forth. Jadi tumpukan perangkat kerasnya hanya digunakan untuk interrupts, dan kedua PSP dan RSP adalah register alamat tujuan umum. (ANS Forth menentukan minimal 32 sel Parameter Stack dan 24 sel dari Return Stack I lebih memilih 64 sel dari masing-masing.) Anda kadang-kadang akan menemukan dogma yang ada di markas Parameter Stack hardware, atau quothust bequot the Return Stack. Sebagai gantinya, catat beberapa contoh primitif Forth, seperti dan lihat pendekatan mana yang lebih kecil atau lebih cepat. (DUP dan DROP, tidak ada ujian - biasanya sangat sepele.) Kadang-kadang Anda mencapai kesimpulan aneh Gary Bergstrom telah menunjukkan bahwa sebuah DTC Forth 6809 dapat dibuat beberapa siklus lebih cepat dengan menggunakan pointer stack pengguna 6809 sebagai IP NEXT menjadi POP. Dia menggunakan daftar indeks untuk salah satu tumpukan Forths. Top-Of-Stack in Register Kinerja lebih jauh dapat ditingkatkan dengan tetap menjaga elemen teratas Parameter Stack dalam daftar Banyak kata-kata Forth (seperti 0) maka jangan perlu menggunakan stack. Kata lain masih melakukan jumlah push dan pops yang sama, hanya di tempat yang berbeda dalam kode. Hanya beberapa kata-kata Forth (DROP dan 2DROP) menjadi lebih rumit, karena Anda tidak bisa lagi mengatur stack stack - Anda harus memperbarui daftar TOS juga. Ada beberapa peraturan saat menulis kata-kata KODE: Kata yang menghilangkan barang dari tumpukan harus memasukkan TOS kuotomatis ke dalam registernya. Sebuah kata yang menambahkan item pada stack harus mendorong TOS quotoldquot ke stack (kecuali, tentu saja, dikonsumsi oleh kata). Jika Anda memiliki setidaknya enam register CPU ukuran sel, saya sarankan untuk menyimpan TOS dalam daftar. Saya menganggap TOS lebih penting daripada UP untuk mendaftar, tapi kurang penting dibanding W, IP, PSP, dan RSP. (KL di register melakukan banyak fungsi register X). Berguna jika register ini bisa melakukan pengalamatan memori. PDP-11, Z8, dan 68000 adalah kandidat yang baik. Sembilan dari 19 PC IBM Forth yang dipelajari oleh Guy Kelly KEL92 tetap melakukan TOS dalam daftar. Saya pikir inovasi ini telah dilawan karena kepercayaan salah bahwa a) ia menambahkan instruksi, dan b) elemen tumpukan teratas harus dapat diakses sebagai memori. Ternyata bahkan kata-kata seperti PICK, ROLL, dan DEPTH sepele dimodifikasi untuk TOS-in-register. Bagaimana dengan menyangga dua elemen tumpukan di register Bila Anda menyimpan tumpukan teratas dalam daftar, jumlah total operasi yang dilakukan tetap pada dasarnya sama. Dorongan tetap mendorong, terlepas dari apakah sebelum atau sesudah operasi yang Anda lakukan. Di sisi lain, menyangga dua elemen tumpukan di register menambahkan sejumlah besar instruksi - dorongan menjadi dorongan diikuti dengan gerakan. Hanya prosesor Forth yang berdedikasi seperti RTX2000 dan kompiler pengoptimalan yang sangat pintar bisa mendapatkan keuntungan dari penyangga dua elemen tumpukan di register. Beberapa contoh Berikut adalah daftar tugas yang dibuat oleh Forths untuk sejumlah CPU yang berbeda. Cobalah untuk menyimpulkan keputusan desain penulis dari daftar ini. QuotSPquot mengacu pada stack stack perangkat keras. QuotZpagequot mengacu pada nilai yang tersimpan di halaman memori 6502, nol, yang hampir sama bergunanya - terkadang lebih berguna daripada - nilai yang disimpan dalam register mis. Mereka bisa digunakan untuk pengalamatan memori. QuotFixedquot berarti bahwa Paynes 8051 Forth memiliki area pengguna tunggal yang tak tergoyahkan, dan UP adalah konstanta dengan kode keras. Register Sempit Perhatikan sesuatu yang aneh dalam daftar sebelumnya The 6502 Forth - model 16-bit - menggunakan pointer 8-bit stack Hal ini dimungkinkan untuk membuat PSP, RSP, dan UP lebih kecil dari ukuran sel Forth. Ini karena tumpukan dan area pengguna keduanya merupakan bidang memori yang relatif kecil. Setiap tumpukan mungkin berukuran sekecil 64 sel, dan area pengguna jarang melebihi 128 sel. Anda hanya perlu memastikan bahwa a) area data ini terbatas pada area memori kecil, jadi alamat pendek dapat digunakan, atau b) bit alamat yang tinggi disediakan dengan cara lain, mis. Halaman memori pilih. Pada 6502, tumpukan perangkat keras terbatas pada halaman satu RAM (alamat 01xxh) oleh perancangan CPU. Penunjuk stack 8-bit dapat digunakan untuk Return Stack. Parameter Stack disimpan di halaman nol dari RAM, yang secara tidak langsung dapat diakses oleh register indeks 8-bit X. (Pertanyaan untuk siswa tingkat lanjut: mengapa menggunakan X 6502, dan bukan Y Petunjuk: lihat mode pengalamatan yang tersedia. ) Pada 8051, Anda dapat menggunakan register 8 bit R0 dan R1 untuk menangani RAM eksternal, asalkan Anda secara eksplisit mengeluarkan 8 bit alamat yang tinggi ke port 2. Ini memungkinkan sebuah quotpage selectquot untuk dua tumpukan. UP berbeda dengan PSP dan RSP: ini hanya menyediakan alamat dasar tidak pernah bertambah atau berkurang. Jadi praktis untuk memasok hanya bit tinggi dari register virtual ini. Bit yang rendah kemudian harus disediakan teknik pengindeksan apapun yang diindeks. Sebagai contoh, pada 6809, Anda dapat menggunakan register DP untuk menahan 8 bit UP tinggi, dan kemudian menggunakan pengalamatan Direct Page untuk mengakses salah satu dari 256 lokasi di halaman ini. Ini memaksa semua area pengguna untuk memulai pada alamat xx00h, yang tidak memiliki kesulitan besar, dan membatasi area pengguna menjadi 128 sel. Pada 8086, Anda dapat menggunakan daftar segmen untuk menentukan alamat dasar area pengguna. DAFTAR PUSTAKA CUR93a Curley, Charles, quotLife di FastForth Lane, menunggu publikasi di Forth Dimensions. Deskripsi dari 68000 subroutine-threaded Forth. CUR93b Curley, Charles, mengutip secara proporsional dalam BSRJSR Threaded Forth, menunggu publikasi di Forth Dimensions. Pengoptimalan kode single pass untuk FastForth, hanya dalam lima layar kode Termasuk daftar. KEL92 Kelly, Guy M. quotForth Systems Comparisons, quot Forth Dimensions XIII: 6 (MarApr 1992). Juga diterbitkan dalam Prosiding Konferensi FORTO 1991. Keduanya tersedia dari Forth Interest Group, P. O. Kotak 2154, Oakland, CA 94621. Menggambarkan rancangan pengorbanan banyak 8086 Forth dengan fragmen kode dan tolok ukur - KOG82 Kogge yang sangat dianjurkan, Peter M. quotAn Trail Arsitektur untuk Sistem Threaded - Code, quot IEEE Computer, vol. 15 tidak 3 (Mar 1982). Tetap deskripsi definitif berbagai teknik threading. ROD91 Rodriguez, B. J. quotB. Y.O. Assembler, quot Bagian 1, Jurnal Komputer 52 (SepOct 1991). Prinsip umum penulisan perwira Forth. ROD92 Rodriguez, B. J. quotB. Y.O. Assembler, quot Bagian 2, Jurnal Komputer 54 (JanFeb 1992). Perakit 6809 di Forth. SCO89 Scott, Andrew, quotAn Pengoptimal Ekstensi untuk Kompilasi Forth, 1989 Prosiding FORML Prosiding. Forth Interest Group, P. O. Kotak 2154, Oakland, CA 94621. Deskripsi bagus tentang pengoptimasi 68000 tidak ada kode yang tersedia. CUR86 Curley, Charles, real-Forth untuk 68.000. Didistribusikan secara pribadi (1986). JAM80 James, John S. fig-Forth untuk PDP-11. Forth Interest Group (1980). KUN81 Kuntze, Robert E. MVP-Forth untuk Apple II. Mountain View Press (1981). LAX84 Laxen, H. dan Perry, M. F83 untuk PC IBM. Versi 2.1.0 (1984). Didistribusikan oleh penulis, tersedia dari Forth Interest Group atau GEnie. LOE81 Loeliger, R. G. Threaded Interpretive Languages. Publikasi BYTE (1981), ISBN 0-07-038360-X. Mungkin satu-satunya buku yang pernah ditulis tentang pembuatan kernel seperti Forth (contoh yang digunakan adalah Z80). Patutlah jika Anda bisa menemukan salinannya. MPE92 MicroProcessor Engineering Ltd MPE Z8Super8 PowerForth Target. MPE Ltd 133 Hill Lane, Shirley, Southampton, S01 5AF, Inggris (Juni 1992). Produk komersial PAY90 Payne, William H. Embedded Controller FORTH untuk keluarga 8.051. Academic Press (1990), ISBN 0-12-547570-5. Ini adalah kuotot yang lengkap untuk Forth 8051, termasuk metacompiler untuk PC IBM. File hardcopy saja bisa diunduh dari GEnie. Bukan untuk Sersan SER90 pemula, Frank, Pygmy Forth untuk PC IBM. Versi 1.3 (1990). Didistribusikan oleh penulis, tersedia dari Forth Interest Group. Versi 1.4 sekarang tersedia di GEnie, dan sepadan dengan usaha ekstra untuk mendapatkan. TAL80 Talbot, R. J. fig-Forth untuk tahun 6809. Forth Interest Group (1980). Catatan penulis untuk publikasi web: file yang sebelumnya tersedia di layanan online GEnie sekarang tersedia dari server FTP Kelompok Minat Minoritas, ftp: ftp. forth. orgpubForth. Dibulan: 14 Juni 2010 Artikel ini adalah bagian dari Kernel Crash Linux saya. Book. Ini tersedia untuk download gratis dalam format PDF Akhirnya, momen besar telah tiba. Membaca informasi yang ditampilkan oleh utilitas tabrakan, memahami apa arti garis penasaran itu dan meretas jalan Anda melalui masalah ke sisi lain. Kami telah mempelajari cara mengkonfigurasi sistem kami untuk dump dump kernel, menggunakan LKCD dan Kdump. Baik lokal maupun lintas jaringan. Kami telah belajar bagaimana men-setup mekanisme dump dumping pada CentOS dan openSUSE. Dan kami meninjau perbedaan halus antara dua sistem operasi. Selanjutnya, kita menguasai penggunaan dasar utilitas kecelakaan, menggunakannya untuk membuka inti memori yang dibuang dan memproses informasi yang terkandung di dalamnya. Tapi kita belum belajar menafsirkan hasilnya. Pra-Pendahuluan Hari ini, kita akan fokus hanya pada hal itu. Baca analisis vmcore, pahami apa arti entri tersebut, lakukan penyelidikan dasar terhadap masalah, periksa kode sumbernya, dan dapatkan metodologi yang efisien untuk menangani masalah kerusakan kernel di masa depan. Jadi jika Anda dalam mood untuk beberapa hackologi yang sangat serius, tolong ikuti saya. Daftar Isi Diperlukan membaca Anda HARUS membaca artikel lain di lain untuk memahami bagaimana kecelakaan bekerja. Anda dapat menemukan daftar referensi rinci di bawah ini. Tanpa menguasai konsep dasar, termasuk fungsi Kdump dan crash, Anda tidak akan bisa mengikuti tutorial ini secara efisien. Menganalisis laporan kerusakan - Langkah pertama Begitu Anda memulai crash, Anda akan mendapatkan informasi laporan awal yang dicetak ke konsol. Di sinilah analisis kecelakaan dimulai. Crash 4.0-8.9.1.el5.centos Hak Cipta (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Red Hat, Inc. Hak Cipta (C) 2004, 2005, 2006 IBM Corporation Hak Cipta (C) 1999 -2006 Hewlett-Packard Co Hak Cipta (C) 2005, 2006 Fujitsu Limited Hak Cipta (C) 2006, 2007 VA Linux Systems Japan KK Mission Critical Linux, Inc. Program ini adalah perangkat lunak bebas, yang dicakup oleh GNU General Public (CU), 1999, 2002, 2007. Lisensi, dan Anda dipersilahkan untuk mengubahnya dan kemudian mendistribusikan salinannya dalam kondisi tertentu. Masukkan bantuan penyalinan untuk melihat kondisinya. Program ini sama sekali tidak memiliki garansi. Masukkan garansi bantuan untuk rinciannya. CATATAN: stdin: not a tty GNU gdb 6.1 Copyright 2004 Free Software Foundation, Inc. GDB adalah perangkat lunak gratis, dilindungi oleh GNU General Public License, dan Anda dipersilakan untuk mengubahnya dan kemudian mendistribusikan salinannya dalam kondisi tertentu. Jenis tampilkan penyalinan untuk melihat kondisinya. Sama sekali tidak ada garansi untuk GDB. Jenis tampilkan garansi untuk rinciannya. GDB ini dikonfigurasi sebagai x8664-unknown-linux-gnu. Bt: tidak dapat beralih dari exception stack ke stack proses saat ini: exception stack pointer: ffff810107132f20 stack stack: ffff81010712bef0 currentstackbase: ffff8101b509c000 KERNEL: usrlibdebuglibmodules2.6.18-164.10.1.el5.centos. plusvmlinux DUMPFILE: vmcore CPUS: 2 DATE: Tue Jan 19 20:21:19 2010 UPTIME: 00:00:00 LOAD RATA-RATA: 0.00, 0.04, 0.07 TUGAS: 134 NODENAME: testhost2localdomain RELEASE: 2.6.18-164.10.1.el5 VERSION: 1 SMP Thu Jan 7 19:54: 26 EST 2010 MACHINE: x8664 (3000 Mhz) MEMORY: PANIC 7,5 GB: SysRq. Trigger sebuah crashdump PID: 0 COMMAND: swapper TUGAS: ffffffff80300ae0 (1 dari 2) THREADINFO: ffffffff803f2000 CPU: 0 NEGARA: TUGAS (ACTIVE) Mari berjalan melalui laporan. Hal pertama yang Anda lihat adalah semacam kesalahan: bt: tidak dapat beralih dari exception stack ke stack proses saat ini: exception stack pointer: ffff810107132f20 stack stack: ffff81010712bef0 currentstackbase: ffff8101b509c000 Penjelasan teknis untuk kesalahan ini sedikit rumit. Dikutip dari milis utilitas tabrakan tentang perubahan dalam rilis utilitas kecelakaan 4.0-8.11, kami mempelajari informasi berikut: Jika kdump NMI dikeluarkan untuk CPU x8664 non-crashing diterima saat berjalan sesuai jadwal (), setelah mengatur Tugas berikutnya seperti saat ini dalam runeue cpus, tapi sebelum mengganti tumpukan kernel dengan tugas selanjutnya, maka backtrace akan gagal membuat transisi dari tumpukan pengecualian NMI kembali ke tumpukan proses, dengan pesan kesalahan bt: tidak dapat Transisi dari exception stack ke current process stack. Patch ini akan melaporkan ketidakkonsistenan yang ditemukan di antara tugas yang ditandai sebagai tugas saat ini dalam runeue cpus, dan tugas yang ditemukan di bidang per cm CPU x8664pda (2.6.29 dan yang lebih baru) atau variabel arus per CPU cpu (2.6.30 dan kemudian). Jika dapat ditentukan dengan aman bahwa pengaturan runqueue (digunakan secara default) terlalu dini, maka utilitas kecelakaan internal per CPU akan dinyalakan menjadi tugas yang ditunjukkan oleh nilai spesifik arsitektur yang sesuai. Apa artinya ini sebuah peringatan yang harus Anda perhatikan saat menganalisis laporan kecelakaan. Ini akan membantu kita menentukan struktur tugas mana yang perlu kita perhatikan untuk memecahkan alasan kecelakaan. Untuk saat ini, abaikan kesalahan ini. Tidak penting untuk memahami apa yang berisi laporan kerusakan. Anda mungkin atau mungkin tidak melihatnya. Sekarang, mari kita periksa kode di bawah kesalahan ini. KERNEL: menentukan kernel yang berjalan pada saat terjadi benturan. DUMPFILE: adalah nama inti memori yang dibuang. CPUS: adalah jumlah CPU pada mesin anda. DATE: menentukan waktu tabrakan. TUGAS: menunjukkan jumlah tugas dalam memori pada saat terjadi benturan. Tugas adalah satu set instruksi program yang dimuat ke memori. NODENAME: adalah nama host yang jatuh. RELEASE: dan VERSION: tentukan versi rilis dan kernel MESIN: menentukan arsitektur CPU. MEMORY: adalah ukuran memori fisik pada mesin yang jatuh. Dan sekarang datanglah potongan-potongan yang menarik: PANIC: menentukan jenis kecelakaan yang terjadi pada mesin. Ada beberapa tipe yang bisa Anda lihat. SysRq (System Request) mengacu pada Magic Keys, yang memungkinkan Anda mengirim instruksi langsung ke kernel. Mereka dapat dipanggil menggunakan urutan keyboard atau dengan menggulirkan perintah huruf ke pemicu procsysrq. Asalkan fungsinya diaktifkan Kami telah membahas hal ini di tutorial Kdump. Ups adalah penyimpangan dari perilaku kernel yang diharapkan dan benar. Biasanya, hasil oops dalam proses menyinggung terbunuh. Sistem mungkin atau mungkin tidak melanjutkan perilaku normalnya. Kemungkinan besar, sistem akan memasuki keadaan yang tidak dapat diprediksi dan tidak stabil, yang dapat menyebabkan kepanikan kernel jika beberapa buggy, sumber daya terbunuh diminta di kemudian hari. Sebagai contoh, dalam review Ubuntu Karmic dan Fedora Constantine saya, saya melihat bukti kerusakan kernel. Namun, sistem terus bekerja. Kecelakaan ini sebenarnya adalah oopses. Kita akan membahas kasus Fedora nanti. Panik adalah keadaan dimana sistem mengalami kesalahan fatal dan tidak dapat pulih. Panik dapat disebabkan oleh mencoba mengakses alamat yang tidak diizinkan, pemuatan bongkar muat modul kernel, atau masalah perangkat keras. Dalam contoh pertama kami yang paling jinak, PANIC: string mengacu pada penggunaan Magic Keys. Kami sengaja memicu kecelakaan. PANIC: SysRq. Memicu PID crashdown: adalah ID proses dari. Proses yang menyebabkan crash. COMMAND: adalah nama prosesnya, dalam hal ini swapper. Swapper. Atau PID 0 adalah penjadwal. Prosesnya yang mendelegasikan waktu CPU antara proses runnable dan jika tidak ada proses lain dalam runqueue, dibutuhkan kontrol. Anda mungkin ingin merujuk pada swapper sebagai tugas menganggur, jadi untuk berbicara. Ada satu swapper per CPU, yang akan segera Anda lihat saat kita mulai menjelajahi jatuhnya lebih dalam. Tapi ini tidak terlalu penting. Kita akan menemukan banyak proses dengan nama yang berbeda. TUGAS: adalah alamat di memori untuk proses pelanggaran. Kami akan menggunakan informasi ini nanti. Ada perbedaan dalam pengalamatan memori untuk arsitektur 32-bit dan 64-bit. CPU: adalah jumlah CPU (relevan jika lebih dari satu) di mana proses pelanggaran sedang berjalan pada saat terjadi kecelakaan. CPU mengacu pada inti CPU dan bukan hanya CPU fisik. Jika Anda menjalankan Linux Anda dengan hyperthreading diaktifkan, Anda juga akan menghitung benang terpisah sebagai CPU. Hal ini penting untuk diingat, karena crash yang berulang pada satu CPU tertentu mungkin mengindikasikan masalah CPU. Jika Anda menjalankan proses Anda dengan afinitas yang diatur ke CPU tertentu (taskset), Anda mungkin memiliki lebih banyak kesulitan untuk menentukan masalah CPU terkait saat menganalisis laporan kerusakan. Anda bisa memeriksa jumlah CPU Anda dengan menjalankan proccpuinfo kucing. NEGARA: menunjukkan status proses pada saat terjadi kecelakaan. TASKRUNNING mengacu pada proses runnable, yaitu proses yang dapat melanjutkan eksekusi mereka. Sekali lagi, kita akan membicarakan hal ini nanti. Semakin hangat terlihat satu contoh jinak sejauh ini. Hanya pendahuluan Kita akan melihat beberapa contoh lagi, termasuk kasus nyata. Untuk saat ini, kita hanya tahu sedikit tentang kecelakaan itu, kecuali proses yang menyebabkannya. Sekarang kita akan memeriksa beberapa contoh lagi dan mencoba memahami apa yang kita lihat di sana. Contoh Fedora Mari kita kembali ke Fedora case. Lihatlah gambar di bawah ini. Sementara informasinya disusun agak berbeda dari apa yang telah kita lihat sebelumnya, intinya hal yang sama. Tapi ada informasi baru: Pid: 0, comm: swapper Tidak tercemar. Mari fokus pada string Tidak tercemar sebentar. Apa artinya Ini berarti kernel tidak menjalankan modul yang telah dimuat dengan paksa. Dengan kata lain, kita mungkin menghadapi bug kode di suatu tempat daripada pelanggaran terhadap kernel. Anda bisa memeriksa kernel yang sedang Anda jalankan dengan mengeksekusi: Sejauh ini, saya telah mempelajari sedikit informasi lagi. Kita akan membicarakan hal ini nanti. Contoh lain, dari White Paper Lihatlah ini: MEMORY: 128MB PANIC: Ups: 0002 (periksa log untuk rinciannya) PID: 1696 PERINTAH: insmod Apa yang kita miliki di sini Sepotong informasi baru. Ups: 0002. Apa artinya ini Kernel Page Error Empat digit adalah kode desimal dari Kernel Page Error. Membaca OReillys Memahami Kernel Linux, Bab 9: Ruang Alamat Proses, Halaman Fault Exception Handler, halaman 376-382, kita belajar informasi berikut: Jika bit pertama jelas (0), pengecualian disebabkan oleh akses ke halaman yang Tidak ada jika bit disetel (1), ini berarti hak akses tidak benar. Jika bit kedua jelas (0), pengecualian disebabkan oleh membaca atau mengeksekusi akses jika diset (1), pengecualian disebabkan oleh akses tulis. Jika bit ketiga jelas (0), pengecualian disebabkan saat prosesor berada dalam mode Kernel jika tidak, itu terjadi pada mode User. Bit keempat memberitahu kita apakah kesalahan itu adalah Instruction Fetch. Ini hanya berlaku untuk arsitektur 64-bit. Karena mesin kita adalah 64-bit, sedikit artinya di sini. Ini cukup menarik. Informasi yang tampaknya tidak bisa dipahami mulai terasa sangat logis. Oh, Anda mungkin juga melihat Kernel Page Errors dalam format berikut, sebagai tabel: Terkadang, akses yang tidak valid juga disebut sebagai Protection fault: Oleh karena itu, untuk memahami apa yang terjadi, kita perlu menerjemahkan kode desimal ke dalam biner dan kemudian memeriksa Empat bit, dari kanan ke kiri. Anda dapat menemukan informasi ini di bawah archarchmmfault. c di pohon sumber kernel: Halaman kesalahan kesalahan kode bit define PFPROT (1ltlt0) atau tidak ada halaman yang ditemukan define PFWRITE (1ltlt1) define PFUSER (1ltlt2) define PFRSVD (1ltlt3) define PFINSTR (1ltlt4) In Kasus kita, desimal 2 adalah biner 10. Melihat dari kanan ke kiri, bit 1 adalah nol, bit 2 dinyalakan, bit 3 dan 4 adalah nol. Perhatikan hitungan biner, mulai dari nol. 0002 (dec) --gt 0010 (biner) --gt Bukan instruksi fetchKernel modeWriteInvalid access Oleh karena itu, kita memiliki halaman yang tidak ditemukan selama operasi tulis dalam mode Kernel, kesalahannya bukan Instruction Fetch. Tentu saja, ini sedikit lebih rumit dari itu, tapi masih mendapatkan gagasan bagus tentang apa yang sedang terjadi. Nah, mulai menarik, bukankah itu Melihat proses yang menyinggung, insmod. Ini memberitahu kita cukup sedikit Kami mencoba memuat modul kernel. Ia mencoba menulis ke halaman yang tidak dapat ditemukannya, yang berarti kesalahan proteksi, yang menyebabkan sistem kita mengalami kecelakaan. Ini mungkin sepotong kode yang ditulis dengan buruk. Cek status OK, sejauh ini, saya hanya melihat sedikit informasi bermanfaat. Kami mempelajari bidang pengenal dasar dalam laporan kerusakan. Kami belajar tentang berbagai jenis Panik. Kami belajar tentang mengidentifikasi proses yang menyinggung, memutuskan apakah kernel telah tercemar dan masalah apa yang terjadi pada saat terjadi kecelakaan. Tapi kami baru memulai analisis kami. Mari kita bawa ini ke tingkat yang baru. Semakin panas Pada artikel pertama yang macet, kami belajar tentang beberapa perintah dasar. Waktunya untuk menggunakannya dengan baik. Perintah pertama yang kita inginkan adalah bt - backtrace. Kami ingin melihat riwayat eksekusi dari proses yang menyinggung, yaitu backtrace. PID: 0 TUGAS: CPU ffffffff80300ae0: 0 COMMAND: swapper 0 ffffffff80440f20 crashnmicallback di ffffffff8007a68e 1 ffffffff80440f40 donmi di ffffffff8006585a 2 ffffffff80440f50 nmi di ffffffff80064ebf pengecualian RIP: defaultidle61 RIP: ffffffff8006b301 RSP: RFLAGS ffffffff803f3f90: 00.000.246 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: ffffffffffffffffff CS: 0010 SS: 0018 --- ltexception stackgt - - 3 ffffffff803f3f90 defaultidle pada ffffffff8006b301 4 ffffffff803f3f90 cpuidle pada ffffffff8004943c Kami memiliki banyak data di sini, mari kita mulai mencernanya perlahan-lahan. Call trace Urutan nomor baris, dimulai dengan tanda hash () adalah jejak panggilan. Its daftar fungsi kernel dijalankan tepat sebelum kecelakaan. Ini memberi kita indikasi bagus tentang apa yang terjadi sebelum sistem turun. 0 ffffffff80440f20 crashnmicallback di ffffffff8007a68e 1 ffffffff80440f40 donmi di ffffffff8006585a 2 ffffffff80440f50 nmi di ffffffff80064ebf pengecualian RIP: defaultidle61 RIP: ffffffff8006b301 RSP: RFLAGS ffffffff803f3f90: 00.000.246 Rax: 0000000000000000 RBX: RCX ffffffff8006b2d8: 0000000000000000 RDX: 0000000000000000 RSI: 0000000000000001 RDI: RBP ffffffff80302698: 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 di ffffffff8006b301 4 ffffffff803f3f90 cpuidle di ffffffff8004943c Kita akan membahasnya nanti. Instruksi pointer Baris pertama yang benar-benar menarik adalah yang satu ini: exception RIP: defaultidle61 Kami memiliki pengecualian RIP: defaultidle61. Apa artinya ini Pertama, mari kita bahas RIP. RIP adalah pointer instruksi. Ini menunjuk ke alamat memori, menunjukkan kemajuan eksekusi program di memori. Dalam kasus kami, Anda dapat melihat alamat yang tepat di garis di bawah garis pengecualian kurung: pengecualian RIP: defaultidle61 RIP: ffffffff8006b301 RSP: ffffffff803f3f90. Untuk saat ini, alamat itu sendiri tidak penting. Catatan: Pada arsitektur 32-bit, pointer instruksi disebut EIP. Bagian kedua dari informasi jauh lebih bermanfaat bagi kita. Defaultidle adalah nama fungsi kernel dimana RIP berada. 61 adalah offset, dalam format desimal, di dalam fungsi kata dimana pengecualian terjadi. Ini adalah hal yang sangat penting yang akan kita gunakan nanti dalam analisis kita. Kode Segmen (CS) mendaftar Kode antara string tanda kurung ke - ltexception stackgt --- adalah pembuangan register. Sebagian besar tidak berguna bagi kita, kecuali register CS (Kode Segmen). Sekali lagi, kita menemukan kombinasi empat digit. Untuk menjelaskan konsep ini, saya perlu sedikit menyimpang dan berbicara tentang tingkat Privilege. Privilege level adalah konsep melindungi sumber daya pada CPU. String eksekusi yang berbeda dapat memiliki tingkat hak istimewa yang berbeda, yang memberikan akses ke sumber daya sistem, seperti area memori, port IO, dll. Ada empat tingkat, mulai dari 0 sampai 3. Level 0 adalah yang paling istimewa, yang dikenal dengan mode Kernel. Level 3 adalah yang paling tidak istimewa, dikenal dengan User mode. Sebagian besar sistem operasi modern, termasuk Linux, mengabaikan dua tingkat menengah, hanya menggunakan 0 dan 3. Tingkat juga dikenal sebagai Rings. Sebuah pengecualian yang menonjol dari penggunaan level adalah sistem IBM OS2. Daftar Kode Kode Tingkat Privilege (CPL) sekarang adalah segmen yang menunjuk ke segmen tempat instruksi program ditetapkan. Dua bit paling penting dari register ini menentukan Current Privilege Level (CPL) CPU. Dua bit, yang berarti angka antara 0 dan 3. Level Privilege Privilege Level (DPL) adalah tingkat tertinggi hak istimewa yang dapat mengakses sumber daya dan didefinisikan. Nilai ini didefinisikan dalam Deskriptor Segmen. Requested Privilege Level (RPL) didefinisikan dalam Segmen Selector, dua bit terakhir. Secara matematis, CPL tidak boleh melebihi MAX (RPL, DPL), dan jika ya, ini akan menyebabkan kesalahan perlindungan umum. Sekarang, mengapa semua ini penting, Anda bertanya Nah, misalnya, jika Anda menemukan kasus di mana sistem mogok saat CPL berada 3, maka ini bisa menunjukkan perangkat keras yang salah, karena sistem tidak boleh macet karena masalah pada mode Pengguna. . Sebagai alternatif, mungkin ada masalah dengan panggilan sistem buggy. Hanya beberapa contoh kasar. Untuk informasi lebih lanjut, mohon pertimbangkan untuk mengacu pada OReillys Understanding Linux Kernel, Bab 2: Memory Addressing, Page 36-39. Anda akan menemukan informasi yang berguna tentang Pemilih Segmen, Deskriptor Segmen, Tabel Indeks, Tabel Deskriptor Lokal dan Lokal, dan tentu saja, Tingkat Keistimewaan Saat Ini (CPL). Kembali ke log kecelakaan kami: Seperti yang kita ketahui, dua bit paling signifikan menentukan CPL. Dua bit berarti empat tingkat, bagaimanapun, tingkat 1 dan 2 diabaikan. Ini meninggalkan kita dengan 0 dan 3, mode Kernel dan mode User. Diterjemahkan ke dalam format biner, kita memiliki format 00 dan 11. Format yang digunakan untuk menyajikan data deskriptor bisa membingungkan, namun sangat sederhana. Jika angka paling kanan genap, maka berada dalam mode Kernel jika gambar terakhir aneh, lalu berada dalam mode User. Oleh karena itu, kita melihat bahwa CPL adalah 0, tugas yang menyinggung yang menyebabkan kecelakaan berjalan dalam mode Kernel. Hal ini penting untuk diketahui. Ini bisa membantu kita memahami sifat dari masalah kita. Hanya untuk referensi, Heres contoh di mana kecelakaan itu terjadi di User mode, dikumpulkan pada mesin SUSE: Tapi itu hanya omong kosong. Kembali ke contoh kita, kita telah mempelajari banyak hal penting dan penting. Kami tahu persis alamat memori dimana pointer instruksi berada pada saat terjadi kecelakaan. Kami tahu tingkat hak istimewa. Lebih penting lagi, kita tahu nama fungsi kernel dan offset dimana RIP menunjuk pada saat terjadi kecelakaan. Untuk semua tujuan praktis, kita hanya perlu mencari file sumber dan memeriksa kodenya. Tentu saja, ini mungkin tidak selalu mungkin, karena berbagai alasan, tapi bagaimanapun, kita akan melakukannya, sebagai latihan. Jadi, kita tahu bahwa fungsi crashnmicallback () dipanggil oleh donmi (), donmi () dipanggil oleh nmi (), nmi () dipanggil secara defaultidle (), yang menyebabkan kecelakaan itu. Kita dapat memeriksa fungsi-fungsi ini dan mencoba memahami lebih dalam apa yang mereka lakukan. Kami akan segera melakukannya. Sekarang, mari kita kembali lagi contoh Fedora kita sekali lagi. Contoh Fedora, lagi Sekarang kita mengerti apa yang salah, kita bisa melihat contoh Fedora lagi dan mencoba untuk mengerti masalahnya. Kami mengalami crash di kernel yang tidak tercemar, yang disebabkan oleh proses swapper. Laporan kecelakaan menunjuk pada fungsi nativeapicwritedummy. Lalu, ada juga jejak panggilan yang sangat panjang. Cukup banyak informasi bermanfaat yang bisa membantu kita memecahkan masalah. Kami akan melihat bagaimana kami dapat menggunakan laporan kerusakan untuk membantu pengembang memperbaiki bug dan menghasilkan perangkat lunak yang lebih baik dan lebih stabil. Sekarang, mari kita fokus lagi pada crash dan perintah dasar. Backtrace untuk semua tugas Secara default, crash akan menampilkan backtrace untuk tugas aktif. Tapi Anda mungkin juga ingin melihat backtrace dari semua tugas. Dalam hal ini, Anda akan ingin menjalankan foreach. Dump system message buffer log - dump system message buffer Perintah ini membuang isi kernel logbuf secara kronologis. Bugger log kernel (logbuf) mungkin berisi petunjuk berguna sebelum kecelakaan itu, yang mungkin bisa membantu kita menentukan masalahnya dengan lebih mudah dan mengerti mengapa sistem kita turun. Perintah log mungkin tidak terlalu berguna jika Anda memiliki masalah perangkat keras intermiten atau bug perangkat lunak murni, tapi pasti patut dicoba. Ini adalah log kecelakaan kami, beberapa baris terakhir: ide: opcode yang gagal adalah: 0xec mtrr: jenis ketidakcocokan untuk f8000000,400000 tua: tidak dapat diucapkan baru: kombinasi penulisan ISO 9660 Ekstensi: Microsoft Joliet Level 3 ISO 9660 Extensions: RRIP1991A SysRq. Memicu crashdump Dan ada pesan SysRq. Berguna untuk mengetahui. Dalam kasus nyata, mungkin ada sesuatu yang jauh lebih menarik. Informasi status proses tampilan ps - display process status information Perintah ini menampilkan status proses untuk proses yang dipilih, atau semua, dalam sistem. Jika tidak ada argumen yang dimasukkan, data proses akan ditampilkan untuk semua proses. Lihatlah contoh di bawah ini. Kami memiliki dua proses swapper Seperti yang saya katakan sebelumnya, masing-masing CPU memiliki penjadwal sendiri. Tugas aktif ditandai dengan gt. Utilitas kecelakaan dapat memuat menunjuk ke tugas yang tidak menyebabkan kepanikan atau mungkin tidak dapat menemukan tugas panik. Tidak ada jaminan. Jika Anda menggunakan mesin virtual, termasuk VMware atau Xen, mungkin semuanya akan menjadi lebih rumit. Dalam kasus ini, pointer dalam output ps menandai proses yang salah: Menggunakan backtrace untuk semua proses (dengan foreach) dan menjalankan perintah ps, Anda harus dapat menemukan proses yang menyinggung dan memeriksa tugasnya. Informasi berguna lainnya yang mungkin Anda perlukan: Item kurus adalah benang kernel misalnya, init dan udevd tidak. Kemudian, ada informasi penggunaan memori, VSZ dan RSS, proses negara, dan banyak lagi. Barang culun super Catatan: Bagian ini sangat sulit. Terlalu sulit bagi kebanyakan orang. Sangat sedikit orang yang cukup terampil untuk mencoba-coba kode kernel dan benar-benar tahu apa yang terjadi di sana. Berusaha bersikap berani dan mengatasi kemungkinan bug yang tersembunyi di inti kecelakaan adalah usaha yang mulia, tapi sebaiknya jangan menganggap enteng ini. Saya harus mengakui bahwa walaupun saya dapat membaca ulang laporan kerusakan dan sumber yang menyertainya, saya masih memiliki banyak masalah untuk belajar tentang hal-hal kecil dan hal-hal kecil. Jangan mengharapkan keajaiban. Tidak ada solusi peluru perak untuk analisis kecelakaan Waktu untuk mendapatkan ultra-serius. Katakanlah Anda mungkin ingin menganalisis kode C untuk fungsi yang menyinggung. Tak perlu dikatakan, Anda harus memiliki sumber C yang tersedia dan bisa membacanya. Ini bukan sesuatu yang harus dilakukan setiap orang, tapi ini merupakan latihan mental yang menarik. Kode sumber Baiklah, Anda ingin memeriksa kode. Pertama, Anda harus mendapatkan sumbernya. Beberapa distribusi membuat sumber tersedia. Misalnya, di openSUSE, Anda hanya perlu mendownload paket source kernel. Dengan CentOS, ini sedikit lebih sulit, tapi bisa dilakukan. Anda juga dapat mengunjungi Arsip Kernel Linux dan mendownload kernel yang sesuai dengan keinginan Anda, walaupun beberapa sumber mungkin berbeda dari yang digunakan pada sistem Anda, karena beberapa vendor membuat perubahan khusus mereka sendiri. Begitu Anda memiliki sumber, waktunya untuk memeriksanya. Contoh, pada openSUSE: Anda bisa melihat-lihat sumber menggunakan alat standar seperti find and grep, tapi ini bisa agak membosankan. Sebaliknya, mengapa tidak membiarkan sistem melakukan semua kerja keras untuk Anda. Utilitas yang sangat rapi untuk browsing kode C disebut cscope. Alat berjalan dari baris perintah dan menggunakan antarmuka seperti vi. Secara default, ia akan mencari sumber di direktori saat ini, namun Anda dapat mengkonfigurasinya dengan cara apa. Cscope tersedia di repositori: Sekarang, di direktori yang berisi sumber (secara default, usrsrclinux), jalankan cscope: Ini akan mencari secara rekursif semua sub-direktori, mengindeks sumber dan menampilkan antarmuka utama. Ada kegunaan lain selain mencoba man page or --help flag. Sekarang, saatnya untuk meletakkan alat ini untuk penggunaan yang baik dan mencari fungsi yang diinginkan. Kita akan mulai dengan Temukan simbol C ini. Gunakan tombol kursor untuk masuk ke baris ini, lalu ketik nama fungsi yang diinginkan lalu tekan Enter. Hasilnya akan ditampilkan: Bergantung pada apa yang terjadi, Anda bisa mendapatkan banyak hasil atau tidak sama sekali. Sangat mungkin bahwa tidak ada kode sumber yang berisi fungsi yang terlihat dalam laporan kerusakan. Jika ada terlalu banyak hasil, maka Anda mungkin ingin mencari fungsi berikutnya dalam jejak panggilan dengan menggunakan fungsi Find yang dipanggil oleh opsi fungsi ini. Gunakan Tab untuk melompat di antara bagian input dan output. Jika Anda memiliki dukungan vendor resmi, inilah saat yang tepat untuk membalik alih perintah dan membiarkan mereka menyetir. Jika Anda tetap melakukan penyelidikan, mencari fungsi lain yang tercantum dalam jejak panggilan dapat membantu Anda mempersempit file C yang Anda butuhkan. Tapi tidak ada jaminan dan ini bisa menjadi proses yang panjang dan membosankan. Selanjutnya, kapan pun Anda butuh bantuan, cukup tekan. Dan Anda akan mendapatkan panduan penggunaan dasar: Di direktori sumber kernel, Anda juga bisa membuat indeks cscope, untuk pencarian lebih cepat di masa depan, dengan menjalankan make cscope. Membongkar objek Dengan asumsi Anda telah menemukan sumbernya, waktunya untuk membongkar objek yang dikompilasi dari sumber ini. Pertama, jika Anda menjalankan kernel debug, maka semua objek telah dikompilasi dengan simbol debug. Anda beruntung. Anda hanya perlu membuang benda dan menggali ke dalam kode perakitan-C yang bercampur. Jika tidak, Anda harus mengkompilasi ulang sumber dengan simbol debug dan kemudian merekayasa baliknya. Ini bukan tugas yang sederhana atau sepele. Pertama, jika Anda menggunakan kompiler yang berbeda dari yang digunakan untuk mengkompilasi yang asli, objek Anda akan berbeda dari yang ada dalam laporan kerusakan, membuat usaha Anda sulit jika bukan tidak mungkin. Contoh sepele saya sebut contoh ini sepele karena tidak ada hubungannya dengan kernel. Ini hanya menunjukkan bagaimana mengkompilasi objek dan kemudian membongkar mereka. Setiap sumber akan melakukannya. Dalam kasus kami, gunakan MPlayer dengan baik, media player open source yang populer sebagai kambing hitam kami. Download kode sumber MPlayer, jalankan. configure, make. Setelah benda diciptakan, hapus salah satunya, lalu kompilasi ulang. Jalankan make ltobject namegt. Misalnya: Perlu diketahui bahwa membuat tidak ada artinya tanpa Makefile, yang menentukan apa yang perlu dilakukan. Tapi kita punya Makefile. Itu dibuat setelah kita berlari. configure. Jika tidak, semua ini tidak akan berhasil. Makefile sangat penting. Kita akan segera melihat contoh yang kurang sepele. Jika Anda tidak menghapus objek yang ada, maka Anda mungkin tidak dapat membuatnya. Buatlah batasan waktu pada sumber dan objek, jadi kecuali jika Anda mengubah sumbernya, kompilasi ulang objek akan gagal. Sekarang, Heres contoh sederhana lainnya, dan perhatikan perbedaan ukuran objek yang dibuat, sekali dengan simbol debug dan sekali tanpa: Jika Anda tidak memiliki Makefile, Anda dapat meminta gcc secara manual menggunakan semua jenis flag. Anda memerlukan header kernel yang sesuai dengan arsitektur dan versi kernel yang digunakan untuk membuat kernel tempat terjadi tabrakan, jika tidak, objek yang baru saja dikompilasi akan sama sekali berbeda dari yang mungkin ingin Anda analisis, termasuk fungsi dan offset. Utilitas yang ingin Anda gunakan untuk pembongkaran adalah objdump. Anda mungkin ingin menggunakan utilitas dengan - S flag, yang berarti kode sumber tampilan saling terkait dengan instruksi perakitan. Anda mungkin juga ingin - s bendera, yang akan menampilkan isi dari semua bagian, termasuk yang kosong. - S berarti - d. Yang menampilkan mnemonik assembler untuk instruksi mesin dari objfile, opsi ini hanya membongkar bagian yang diharapkan berisi instruksi. Sebagai alternatif, gunakan - D untuk semua bagian. Dengan demikian, objdump yang paling inklusif adalah: objdump - D - S objek terkompilasi dengan simbol debugging gt ltoutput filegt Ini akan terlihat seperti ini: Dan contoh yang lebih bagus lagi, memhog dump: Pindah ke sumber kernel Pemanasan. Setelah Anda yakin berlatih dengan kode sepele, saatnya pindah ke kernel. Pastikan Anda tidak hanya menghapus file penting apapun. Demi latihan, pindahkan atau ganti nama semua objek kernel yang ada yang mungkin Anda temukan mengintai. Kemudian, kompilasi ulang mereka. Anda akan memerlukan file. config yang digunakan untuk mengkompilasi kernel. Ini harus disertakan dengan sumbernya. Sebagai alternatif, Anda bisa membuangnya dari procconfig. gz. Zcat procconfig. gz gt. config Pada mesin RedHat, Anda akan menemukan file konfigurasi juga di bawah booting. Pastikan Anda menggunakan yang sesuai dengan kernel yang rusak dan menyalinnya ke dalam direktori sumber. Jika diperlukan, edit beberapa pilihan, seperti CONFIGDEBUGINFO. Lebih lanjut tentang itu nanti. Tanpa file. config, Anda tidak dapat mengkompilasi source kernel: Anda mungkin juga menemukan kesalahan dimana Makefile seharusnya hilang, tapi ada di sana. Dalam kasus ini, Anda mungkin menghadapi masalah yang relatif sederhana, dengan variabel lingkungan ARCH yang salah. Misalnya, i585 versus i686 dan x86-64 versus x8664. Perhatikan kesalahan dan bandingkan arsitektur dengan variabel ARCH. Dalam kasus terburuk, Anda mungkin perlu mengekspornya dengan benar. Sebagai contoh: Sebagai solusi jangka panjang, Anda juga bisa membuat tautan simbolis di bawah usrsrclinux dari arsitektur yang buruk ke yang benar. Ini tidak sepenuhnya terkait dengan analisis kerusakan kernel, namun jika dan saat Anda mengkompilasi sumber kernel, Anda mungkin mengalami masalah ini. Sekarang, mengenai variabel CONFIGDEBUGINFO. Ini harus diset ke 1 di file. config Anda. Jika Anda ingat tutorial Kdump, ini adalah prasyarat yang kami minta, agar bisa berhasil memecahkan masalah kerusakan kernel. Ini memberitahu compiler untuk membuat objek dengan simbol debug. Sebagai alternatif, ekspor variabel di shell, sebagai CONFIGDEBUGINFO1. Kemudian, lihat Makefile. Anda harus melihat bahwa jika variabel ini diset, objek akan dikompilasi dengan simbol debug (-g). Inilah yang kita butuhkan. Setelah itu, sekali lagi, kita akan menggunakan objdump. Sekarang, Makefile mungkin benar-benar hilang. Dalam kasus ini, Anda akan mendapatkan banyak kesalahan yang terkait dengan proses kompilasi. Tapi dengan Makefile di tempat, semuanya harus berjalan lancar. Dan kemudian, ada contoh up to date lagi. Jika Anda tidak menghapus yang sudah ada, Anda tidak dapat mengkompilasi yang baru, terutama jika Anda memerlukan simbol debug untuk disassembly nanti. Akhirnya, objek yang dibongkar: Apa yang kita lakukan sekarang Nah, Anda mencari fungsi yang tercantum dalam pengecualian RIP dan menandai alamat awal. Kemudian tambahkan offset ke nomor ini, diterjemahkan ke format heksadesimal. Lalu, pergi ke baris yang ditentukan. Yang tersisa hanyalah mencoba memahami apa yang sebenarnya terjadi. Anda akan memiliki instruksi perakitan yang terdaftar dan mungkin beberapa kode C, memberi tahu kami apa yang mungkin salah. Ini tidak mudah. 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 b ugs 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.
No comments:
Post a Comment