1. Pendapat saya tentang kod sumber kernel
Saiz kod kernel Linux yang besar membuatkan ramai orang "gerun". Jika anda ingin menganalisis Linux dan menyelidiki sifat sistem pengendalian, membaca kod sumber kernel adalah cara yang paling berkesan. Kita semua tahu bahawa menjadi seorang pengaturcara yang cemerlang Analisis kod sumber kernel Linux memerlukan banyak latihan dan penyusunan kod. Pengaturcaraan masih penting, dan selalunya orang yang hanya memprogram boleh dengan mudah mengehadkan diri mereka kepada bidang pengetahuan mereka sendiri. Jika kita ingin meluaskan lagi pengetahuan kita, kita perlu lebih terdedah kepada kod yang ditulis oleh orang lain, terutamanya kod yang ditulis oleh orang yang lebih maju daripada kita. Melalui cara ini, kita boleh keluar dari kurungan lingkungan pengetahuan kita sendiri, melangkah ke lingkungan pengetahuan orang lain dan mempelajari lebih lanjut tentang maklumat yang biasanya kita sukar untuk memahami dalam jangka pendek. Kernel Linux diselenggara dengan teliti oleh "tuan" yang tidak terkira banyaknya dalam komuniti sumber terbuka. Mereka boleh dipanggil pakar kod teratas. Dengan membaca kod kernel Linux, kita belajar bukan sahaja pengetahuan berkaitan kernel, tetapi pada pendapat saya, apa yang lebih berharga ialah mempelajari dan merasakan kaedah pengaturcaraan mereka dan pemahaman tentang komputer.
Saya juga berhubung dengan analisis kod sumber kernel Linux melalui projek yang saya telah mendapat banyak manfaat daripada analisis kod sumber. Saya bukan sahaja memperoleh pengetahuan kernel yang berkaitan, ia juga mengubah pemahaman saya tentang kod kernel:
1. Analisis kod sumber kernel bukan "di luar jangkauan". Kesukaran analisis kod sumber kernel tidak terletak pada kod sumber itu sendiri, tetapi pada cara menggunakan kaedah dan kaedah yang lebih sesuai untuk menganalisis kod. Kerumitan kernel bermakna kita tidak boleh menganalisisnya langkah demi langkah bermula dari fungsi utama seperti menganalisis program demo biasa Kita memerlukan cara untuk campur tangan dari tengah untuk "menembusi" kod sumber kernel satu demi satu. Format "atas permintaan" ini membolehkan kami memahami urutan utama kod sumber dan bukannya terlalu sibuk dengan butiran khusus.
2. Reka bentuk intinya cantik. Status istimewa kernel menentukan bahawa kecekapan pelaksanaan kernel mestilah cukup tinggi untuk bertindak balas kepada keperluan masa nyata aplikasi komputer semasa Oleh itu, kernel Linux menggunakan pengaturcaraan hibrid bahasa C dan pemasangan. Dan kita semua tahu bahawa kecekapan pelaksanaan perisian dan kebolehselenggaraan perisian bertentangan antara satu sama lain dalam banyak kes. Bagaimana untuk meningkatkan kebolehselenggaraan kernel sambil memastikan kecekapan kernel bergantung pada reka bentuk "cantik" dalam kernel ini.
3. Kaedah pengaturcaraan yang menakjubkan. Dalam bidang reka bentuk perisian aplikasi umum, status pengekodan mungkin tidak terlalu ditekankan, kerana pembangun memberi lebih perhatian kepada reka bentuk perisian yang baik, dan pengekodan hanyalah masalah cara pelaksanaan-sama seperti menggunakan kapak untuk memotong kayu api, tanpa terlalu banyak berfikir. Dan ini tidak ditubuhkan dalam kernel Reka bentuk pengekodan yang baik bukan sahaja meningkatkan kebolehselenggaraan, tetapi juga meningkatkan prestasi kod.
Pemahaman setiap orang tentang kernel akan berbeza-beza Memandangkan pemahaman kita tentang kernel terus mendalam, kita akan mempunyai lebih banyak pemikiran dan perasaan tentang reka bentuk dan pelaksanaannya. Oleh itu, artikel ini berharap dapat membimbing lebih ramai orang yang berkeliaran di luar bilik kernel Linux ke dunia Linux untuk merasai sendiri keajaiban dan kehebatan kernel. Dan saya bukan pakar dalam kod sumber kernel Saya hanya berharap untuk berkongsi pengalaman dan pandangan saya sendiri dalam menganalisis kod sumber dan memberikan rujukan dan bantuan kepada mereka yang memerlukannya, ia boleh dianggap sebagai untuk industri komputer Terutamanya dalam kernel sistem pengendalian untuk menyumbang usaha sederhana mereka sendiri. Tanpa berlengah lagi (ia sudah terlalu panjang lebar, memalukan~), izinkan saya berkongsi kaedah analisis kod sumber kernel Linux saya sendiri.
2. Adakah sukar untuk mendapatkan kod sumber kernel?
Pada asasnya, menganalisis kod kernel Linux tidak berbeza dengan melihat kod orang lain, kerana kod di hadapan anda biasanya bukan kod yang anda tulis sendiri. Mari kita ambil contoh mudah dahulu. Orang yang tidak dikenali memberi anda program secara rawak dan meminta anda menerangkan reka bentuk fungsi program selepas membaca kod sumber saya fikir ramai orang yang berfikir bahawa kemahiran pengaturcaraan mereka tidak mengapa , selagi saya sabar membaca kodnya dari awal hingga akhir, dan saya pasti akan menemui jawapannya, tetapi ini memang berlaku. Jadi sekarang mari kita ubah andaian, jika orang ini adalah Linus, dan apa yang dia berikan kepada anda ialah kod modul kernel Linux, adakah anda fikir ia masih begitu mudah? Ramai orang mungkin teragak-agak. Mengapa kami berasa sangat berbeza tentang kod yang diberikan kepada anda oleh orang yang tidak dikenali yang sama (tidak dikira jika Linus mengenali anda, haha~)? Saya rasa ada sebab berikut:
1. Kod kernel Linux agak misteri kepada "dunia luar", tetapi ia sangat besar, dan mungkin sukar untuk dimulakan apabila ia diletakkan di hadapan anda. Sebagai contoh, ia mungkin bermula dari sebab yang sangat kecil-fungsi utama tidak dapat ditemui. Untuk program demo yang mudah, kita boleh menganalisis maksud kod dari awal hingga akhir, dan kaedah menganalisis kod kernel sama sekali tidak berkesan, kerana tiada siapa yang boleh membaca kod Linux dari awal hingga akhir (kerana ia benar-benar tidak perlu , dan apabila digunakan, Lihat sahaja).
2. Ramai orang juga telah bersentuhan dengan kod perisian kecil, tetapi kebanyakannya adalah projek aplikasi Bentuk dan makna kod berkaitan dengan logik perniagaan yang sering mereka hubungi. Kod kernel adalah berbeza Kebanyakan maklumat yang diproses adalah berkait rapat dengan lapisan bawah komputer. Sebagai contoh, kekurangan pengetahuan yang berkaitan tentang sistem pengendalian, penyusun, pemasangan, seni bina dan lain-lain juga akan menyukarkan membaca kod kernel.
3. Cara untuk menganalisis kod kernel tidak cukup munasabah. Berhadapan dengan sejumlah besar kod kernel yang kompleks, jika anda tidak memulakan dengan Linux Mint dari perspektif global, adalah mudah untuk terjebak dalam kerumitan butiran kod. Lagipun, kod kernel adalah besar, dan ia juga mempunyai prinsip reka bentuk dan seni binanya, jika tidak mengekalkannya akan menjadi mimpi ngeri bagi sesiapa sahaja! Jika kita menjelaskan idea reka bentuk keseluruhan modul kod dan kemudian menganalisis pelaksanaan kod, mungkin mudah dan senang untuk menganalisis kod sumber.
Ini adalah pemahaman peribadi saya tentang isu tersebut. Jika anda tidak pernah didedahkan kepada projek perisian kecil, menganalisis kod kernel Linux mungkin merupakan peluang yang baik untuk mengumpul pengalaman dalam projek kecil (sememangnya, kod Linux ialah projek terbesar yang pernah saya dedahkan setakat ini!). Jika anda tidak memahami aspek asas komputer dengan cukup teliti, kami boleh memilih untuk mengumpul pengetahuan asas dengan menganalisis dan belajar pada masa yang sama. Kemajuan menganalisis kod mungkin agak perlahan pada mulanya, tetapi apabila pengetahuan terus terkumpul, pemahaman kita tentang "logik perniagaan" kernel Linux akan beransur-ansur menjadi lebih jelas. Perkara terakhir ialah bagaimana untuk menguasai kod sumber analisis dari perspektif global Ini juga pengalaman yang saya ingin kongsikan dengan anda.
3. Kaedah analisis kod sumber kernel
Langkah pertama: pengumpulan data
Dari perspektif orang memahami perkara baru, sebelum meneroka intipati sesuatu, mesti ada proses memahami perkara baru Proses ini membolehkan kita membentuk konsep awal tentang perkara baru. Sebagai contoh, jika kita ingin belajar gitar, kita perlu terlebih dahulu memahami bahawa bermain gitar memerlukan kita mempelajari asas nyanyian penglihatan, tatatanda yang dipermudahkan, kakitangan dan pengetahuan asas lain, dan kemudian mempelajari kaedah dan penjarian bermain erhu, dan akhirnya bermula. berlatih gitar.
Begitu juga untuk menganalisis kod kernel Pertama, kita perlu mencari kandungan yang terlibat dalam kod untuk dianalisis. Adakah ia kod untuk penyegerakan dan penjadualan proses, kod untuk pengurusan memori video, kod untuk pengurusan peranti, kod untuk permulaan sistem, dsb. Kerumitan kernel menentukan bahawa kita tidak boleh menganalisis semua kod kernel sekaligus, jadi kita perlu memberi diri kita pembahagian kerja yang munasabah. Seperti yang diberitahu oleh reka bentuk algoritma, untuk menyelesaikan masalah besar, kita mesti terlebih dahulu menyelesaikan sub-masalah yang terlibat.
Selepas mencari julat kod untuk dianalisis, kami boleh menggunakan semua sumber yang ada untuk memahami keseluruhan struktur dan fungsi umum bahagian kod ini selengkap mungkin.
Semua sumber yang dinyatakan di sini merujuk kepada Baidu, enjin carian dalam talian kecil Google, buku teks prinsip sistem pengendalian dan buku profesional, atau pengalaman dan maklumat yang diberikan oleh orang lain, atau pun dokumen, ulasan dan kod sumber yang disediakan oleh kod sumber Linux Nama pengecam (jangan memandang rendah penamaan pengecam dalam kod, kadangkala mereka boleh memberikan maklumat penting). Malah, semua sumber di sini merujuk kepada semua sumber yang ada yang boleh anda fikirkan. Sebenarnya, tidak mungkin kita dapat memperoleh semua maklumat yang kita inginkan melalui kaedah pengumpulan maklumat ini. Kita hanya mahu menjadi selengkap mungkin. Kerana lebih komprehensif maklumat dikumpul, lebih banyak maklumat boleh digunakan dalam proses menganalisis kod, dan kesukaran proses analisis akan menjadi lebih kecil.
Berikut ialah contoh balas mudah Katakan kita ingin menganalisis kod yang dilaksanakan oleh mekanisme penukaran frekuensi Linux. Setakat ini kita hanya tahu istilah ini Daripada makna literal, kita boleh membuat kesimpulan secara kasar bahawa ia sepatutnya berkaitan dengan pelarasan frekuensi CPU. Melalui pengumpulan maklumat, kita seharusnya dapat memperoleh maklumat berkaitan berikut:
1. Mekanisme CPUFreq.
2. prestasi, jimat kuasa, ruang pengguna, ondemand, strategi peraturan frekuensi konservatif.
3. /driver/cpufreq/.
4. /documentation/cpufreq.
5. Pstate dan Cstate.
……
Jika anda boleh mengumpul maklumat seperti ini semasa menganalisis kod kernel Linux, anda harus dikatakan sangat "bertuah". Walaupun maklumat tentang kernel Linux sememangnya tidak sekaya .NET dan JQuery, berbanding lebih sepuluh tahun yang lalu, apabila tiada enjin carian yang berkuasa dan tiada bahan penyelidikan yang relevan, ia sepatutnya dipanggil era "penuaian besar"! Melalui "carian" mudah (yang mungkin mengambil masa satu hingga tujuh hari), kami juga menemui direktori fail kod sumber di mana bahagian kod ini terletak, saya perlu mengatakan bahawa maklumat jenis ini adalah "tidak ternilai"!
Langkah 2: Lokasi kod sumber
Daripada pengumpulan data, kami "bernasib baik" untuk mencari direktori kod sumber yang berkaitan dengan kod sumber. Dan ini tidak bermakna bahawa kami sebenarnya menganalisis kod sumber dalam direktori ini. Kadangkala direktori yang kami temui mungkin bertaburan, dan kadangkala direktori yang kami temui mengandungi banyak kod yang berkaitan dengan mesin tertentu, dan kami lebih mengambil berat tentang mekanisme utama kod untuk dianalisis berbanding kod khusus yang berkaitan dengan mesin ( Ini akan membantu kita lebih memahami sifat inti). Untuk tujuan ini, kita perlu berhati-hati memilih maklumat yang melibatkan fail kod dalam maklumat. Malah, langkah ini tidak mungkin dilengkapkan sekaligus, dan tiada siapa yang boleh menjamin bahawa semua fail kod sumber yang akan dianalisis boleh dipilih pada satu masa dan tiada satu pun daripadanya akan terlepas. Dan kami tidak perlu takut selagi kami dapat memahami fail sumber teras yang berkaitan dengan kebanyakan modul, kami secara semula jadi boleh mencari semuanya melalui analisis terperinci kod itu kemudian.
Zurück zum obigen Beispiel: Wir haben die Dokumentation unter /documention/cpufreq sorgfältig gelesen. Der aktuelle Linux-Quellcode speichert die modulbezogene Dokumentation im Dokumentationsordner des Quellcodeverzeichnisses. Wenn das zu analysierende Modul über keine Dokumentation verfügt, verringert dies die Schwierigkeit, wichtige Quellcodedateien zu finden, und führt nicht dazu, dass wir dies tun Der Quellcode, den wir analysieren möchten, kann nicht gefunden werden. Durch das Lesen der Dokumentation können wir zumindest auf die Quelldatei /driver/cpufreq/cpufreq.c achten. Durch diese Dokumentation der Quelldateien, kombiniert mit den zuvor gesammelten Frequenzmodulationsstrategien, können wir leicht auf die fünf Quelldateien cpufreq_performance.c, cpufreq_powersave.c, cpufreq_userspace.c, cpufreq_ondemand und cpufreq_conservative.c achten. Wurden alle beteiligten Dokumente gefunden? Haben Sie keine Angst, beginnen Sie mit der Analyse, und früher oder später werden Sie andere Quelldateien finden. Wenn Sie SourceInsight verwenden, um den Kernel-Quellcode unter Windows zu lesen, können wir andere Dateien freq_table.c, cpufreq_stats.c und /include/linux/cpufreq durch Funktionen wie Funktionsaufrufe und die Suche nach Symbolreferenzen in Kombination mit Codeanalyse leicht finden. H.
Entsprechend der gesuchten Informationsflussrichtung können wir die zu analysierenden Quellcodedateien vollständig lokalisieren. Der Schritt des Auffindens des Quellcodes ist nicht sehr kritisch, da wir nicht alle Quellcodedateien finden müssen und einen Teil der Arbeit auf den Prozess der Codeanalyse verlagern können. Der Speicherort des Quellcodes ist ebenfalls von entscheidender Bedeutung. Das Auffinden eines Teils der Quellcodedatei ist die Grundlage für die Analyse des Quellcodes.
Schritt 3: Einfache Kommentare
Analysieren Sie in den gefundenen Quellcodedateien die allgemeine Bedeutung und Funktion jeder Variablen, jedes Makros, jeder Funktion, jeder Struktur und anderer Codeelemente. Der Grund, warum dies als einfacher Kommentar bezeichnet wird, bedeutet nicht, dass die Kommentararbeit in diesem Teil sehr einfach ist, sondern dass der Kommentar in diesem Teil nicht zu detailliert sein muss, solange er die Bedeutung des Kommentars grob beschreibt relevante Codeelemente. Im Gegenteil: Die Arbeit hier ist natürlich der schwierigste Schritt im gesamten Analyseprozess. Da dies das erste Mal ist, dass man tief in den Kernel-Code eintaucht, wird die große Anzahl unbekannter GNU-C-Satzmuster und überwältigender Makrodefinitionen insbesondere für diejenigen, die den Kernel-Quellcode zum ersten Mal analysieren, sehr enttäuschend sein. Solange Sie sich zu diesem Zeitpunkt beruhigen und alle wichtigen Schwierigkeiten verstehen, können Sie sicherstellen, dass Sie in Zukunft nicht zum Rückzug gezwungen werden, wenn Sie auf ähnliche Schwierigkeiten stoßen. Darüber hinaus wird unser sonstiges Wissen rund um den Kernel wie ein Baum weiter wachsen.
Die Verwendung des Makros „DEFINE_PER_CPU“ erscheint beispielsweise am Anfang der Datei cpufreq.c. Wir können die Bedeutung und Funktion dieses Makros grundsätzlich verstehen, indem wir die Informationen konsultieren. Die hier verwendete Methode ist im Wesentlichen die gleiche wie die zuvor zum Sammeln von Daten verwendete Methode. Darüber hinaus können wir auch die Übertragungsdefinition und andere von SourceInsight bereitgestellte Funktionen verwenden, um die Definition anzuzeigen, oder LKML (LinuxKernelMailList) verwenden, um sie zu überprüfen funktioniert nicht, wir können auch Fragen stellen, um Antworten zu erhalten (Möchten Sie wissen, was LKML und Stackoverflow sind? Sammeln Sie Informationen!). Tatsächlich können wir mit allen möglichen Mitteln immer die Bedeutung dieses Makros verstehen – definieren Sie eine unabhängig verwendete Variable für jede CPU.
Wir bestehen nicht darauf, die Kommentare auf einmal genau beschreiben zu können (wir müssen nicht einmal den spezifischen Implementierungsprozess jeder Funktion herausfinden, sondern nur die allgemeine funktionale Bedeutung herausfinden), wir kombinieren die gesammelten Informationen und die Analyse des obigen Codes Ermitteln Sie kontinuierlich die Bedeutung von Kommentaren (hier sind die Originalkommentare und die Identifikatorbenennung im Quellcode sehr hilfreich). Durch ständige Anmerkungen, ständige Bezugnahme auf Informationen und ständige Änderungen in der Bedeutung von Anmerkungen.
Nachdem wir einfach alle beteiligten Quellcodedateien mit Anmerkungen versehen haben, können wir folgende Effekte erzielen:
1. Verstehen Sie grundsätzlich die Bedeutung der Codeelemente im Quellcode.
2. Grundsätzlich wurden alle wichtigen Quellcodedateien dieses Moduls gefunden.
Kombiniert mit der Gesamt- oder Strukturbeschreibung des zu analysierenden Codes auf Basis der zuvor gesammelten Informationen und Daten können wir die Analyseergebnisse mit den Daten vergleichen, um unser Verständnis des Codes zu ermitteln und zu überarbeiten. Auf diese Weise können wir durch einen einfachen Kommentar die Hauptstruktur des Quellcodemoduls als Ganzes erfassen. Dadurch wird auch der grundlegende Zweck unserer einfachen Anmerkung erreicht.
Schritt 4: Detaillierte Notizen
Nachdem Sie die einfachen Kommentare des Codes ausgefüllt haben, können Sie das Gefühl haben, dass die Analyse des Moduls zur Hälfte abgeschlossen ist und der verbleibende Inhalt eine eingehende Analyse und ein gründliches Verständnis des Codes ist. Einfache Kommentare können die spezifische Bedeutung von Codeelementen nicht immer sehr genau beschreiben, daher sind detaillierte Kommentare unbedingt erforderlich. In diesem Schritt müssen wir Folgendes klären:
1. Wenn die Variablendefinition verwendet wird.
2. Wenn der durch das Makro definierte Code verwendet wird.
3. Die Bedeutung von Funktionsparametern und Rückgabewerten.
4. Der Ausführungsablauf und die Aufrufbeziehung der Funktion.
5. Die spezifische Bedeutung und Verwendungsbedingungen des Strukturarrays.
Wir können diesen Schritt sogar als detaillierte Funktionsannotation bezeichnen, da die Bedeutung von Codeelementen außerhalb der Funktion in einfachen Kommentaren grundsätzlich klar ist. Der Ausführungsablauf und der Algorithmus der Funktion selbst sind die Hauptaufgaben dieses Teils der Annotation und Analyse.
Zum Beispiel, wie der Implementierungsalgorithmus der cpufreq_ondemand-Richtlinie (in der Funktion dbs_check_cpu) implementiert wird. Wir müssen die von der Funktion verwendeten Variablen und die aufgerufenen Funktionen schrittweise analysieren, um die Besonderheiten des Algorithmus zu verstehen. Für die besten Ergebnisse benötigen wir das Ausführungsflussdiagramm und das Funktionsaufruf-Beziehungsdiagramm dieser komplexen Funktion, die die intuitivste Ausdrucksform darstellt.
Durch die Kommentare in diesem Schritt können wir grundsätzlich den gesamten Implementierungsmechanismus des zu analysierenden Codes vollständig verstehen. Und man kann davon ausgehen, dass alle Analysearbeiten zu 80 % abgeschlossen sind. Dieser Schritt ist besonders wichtig. Wir müssen versuchen, die Anmerkungsinformationen genau genug zu machen, damit wir die Definition der internen Module des zu analysierenden Codes besser verstehen können. Tatsächlich verwendet der Linux-Kernel die Makrosatzmuster „module_init“ und „module_exit“, um Moduldateien zu deklarieren, und die Definition der internen Unterfunktionen des Moduls basiert auf einem vollständigen Verständnis der Funktionen des Moduls. Solange das Modul korrekt definiert ist, können wir herausfinden, welche externen Funktionen und Variablen das Modul bereitstellt (mithilfe von EXPORT_SYMBOL_GPL oder von durch EXPORT_SYMBOL importierten Symbolen). Sie können mit dem nächsten Schritt der Analyse der Identifikatorabhängigkeiten innerhalb des Moduls fortfahren.
Schritt 5: Modulinterne Identifikatorabhängigkeiten
Durch die Definition der Codemodule im vierten Schritt können wir die Module „einfach“ einzeln analysieren. Normalerweise können wir mit den Moduleintritts- und -ausgangsfunktionen oben in der Datei beginnen (die durch „module_init“ und „module_exit“ deklarierten Funktionen befinden sich normalerweise am Ende der Datei). Linux-Kernel-Quellcode-Analyse, laut Die von ihnen aufgerufenen Funktionen (selbstdefinierte oder andere Funktionen des Moduls) und die verwendeten Schlüsselvariablen (globale Variablen in dieser Datei oder externe Variablen anderer Module) zeichnen ein Abhängigkeitsdiagramm „Funktion-Variable-Funktion“ – wir nennen es einen Bezeichner Abhängigkeitsdiagramm.
Tatsächlich handelt es sich bei der Identifikator-Abhängigkeitsbeziehung innerhalb des Moduls nicht um eine einfache Baumstruktur, sondern in vielen Fällen um eine komplexe Netzwerkbeziehung. Zu diesem Zeitpunkt wird die Rolle unserer detaillierten Kommentare zum Code deutlich. Wir definieren die Unterfunktionen des Moduls entsprechend der Bedeutung der Funktion selbst und extrahieren den Identifikator-Abhängigkeitsbaum jeder Unterfunktion.
Durch die Identifikator-Abhängigkeitsanalyse kann klar gezeigt werden, dass die vom Modul definierten Funktionen diese Funktionen aufrufen, welche Variablen verwendet werden und welche Abhängigkeiten zwischen Modul-Unterfunktionen bestehen – welche Funktionen und Variablen gemeinsam genutzt werden usw.
Schritt 6: Interdependenzen zwischen Modulen
Sobald alle modulinternen Identifikator-Abhängigkeitsdiagramme sortiert sind, können die Abhängigkeiten zwischen Modulen basierend auf den Variablen oder Funktionen anderer vom Modul verwendeter Module leicht ermittelt werden.
Die Modulabhängigkeitsbeziehung des CPUFreq-Codes kann als folgende Beziehung ausgedrückt werden.
Schritt 7: Modularchitekturdiagramm
Durch das Abhängigkeitsdiagramm zwischen Modulen können der Status und die Funktion des Moduls im gesamten zu analysierenden Code klar ausgedrückt werden. Auf dieser Grundlage können wir die Module klassifizieren und die architektonische Beziehung des Codes klären.
Wie im Modulabhängigkeitsdiagramm von cpufreq gezeigt, können wir deutlich erkennen, dass alle Frequenzmodulationsstrategiemodule von den Kernmodulen cpufreq, cpufreq_stats und freq_table abhängen. Wenn wir uns die drei abhängigen Module als Kernrahmen des Codes vorstellen, basieren diese Frequenzmodulationsstrategiemodule auf diesem Rahmen und sind für die Interaktion mit der Benutzerschicht verantwortlich. Das Kernmodul cpufreq stellt Treiber und andere zugehörige Sockets bereit, die für die Interaktion mit dem zugrunde liegenden System verantwortlich sind. Daher können wir das folgende Modularchitekturdiagramm erhalten.
Tatsächlich ist das Architekturdiagramm kein anorganisches Zusammenfügen von Modulen. Wir müssen auch die von uns konsultierten Daten kombinieren, um die Bedeutung des Architekturdiagramms zu bereichern. Daher variieren die Details des Architekturdiagramms hier je nach Verständnis verschiedener Personen. Und die Bedeutung des Hauptteils des Architekturdiagramms ist grundsätzlich dieselbe. Zu diesem Zeitpunkt haben wir alle Analysearbeiten des zu analysierenden Kernelcodes abgeschlossen.
4. Zusammenfassung
Wie am Anfang des Artikels erwähnt, ist es für uns unmöglich, den gesamten Kernel-Code zu analysieren. Daher ist das Sammeln von Informationen aus dem zu analysierenden Code und die anschließende Analyse der ursprünglichen Geschichte des Codes gemäß dem oben beschriebenen Prozess eine effektive Möglichkeit, die Essenz des Kernels zu verstehen. Diese Methoden zur Analyse des Kernel-Codes entsprechend spezifischer Anforderungen bieten die Möglichkeit, schnell in die Welt des Linux-Kernels einzusteigen. Durch diese Methoden analysieren wir weiterhin andere Module des Kernels und erlangen schließlich ein umfassendes Verständnis des Linux-Kernels, wodurch wir unser Ziel erreichen, den Linux-Kernel zu lernen.
Abschließend empfehle ich zwei Nachschlagewerke zum Erlernen des Kernels. Eines davon ist „The Design and Implementation of the Linux Kernel“, das den Lesern eine schnelle und prägnante Einführung in die Hauptfunktionen und die Implementierung des Linux-Kernels bietet. Aber es wird die Leser nicht in die Abgründe des Linux-Kernel-Codes führen. Es ist ein besonders gutes Nachschlagewerk für das Verständnis der Kernel-Architektur und den Einstieg in den Linux-Kernel-Code. Gleichzeitig wird dieses Buch das Interesse der Leser am Kernel-Code steigern. Das andere ist „Vertiefendes Verständnis des Linux-Kernels“. Warum sollte ich mehr über das Meisterwerk dieses Buches sagen? Ich schlage nur vor, dass Sie, wenn Sie dieses Buch besser lernen möchten, es am besten in Verbindung mit dem Kernel-Code lesen. Da dieses Buch den Kernel-Code sehr detailliert beschreibt, kann das Lesen in Verbindung mit dem Code uns helfen, den Kernel-Code besser zu verstehen. Gleichzeitig finden Sie in diesem Buch bei der Analyse des Kernel-Codes auch Informationen mit Referenzwert. Abschließend hoffe ich, dass Sie so schnell wie möglich in die Welt des Kernels eintauchen und die Überraschungen erleben, die Linux für uns bereithält!
Atas ialah kandungan terperinci Analisis mendalam tentang kod sumber kernel Linux dan penerokaan intipati sistem pengendalian. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!