Artikel ini membawa anda pengetahuan yang berkaitan tentang kod sumber kernel bagi lima modul utama Linux, termasuk isu yang berkaitan dengan reka bentuk seni bina keseluruhan kernel saya harap ia akan membantu semua orang.
Cadangan berkaitan: "Tutorial Video Linux"
Nota: Artikel ini dan artikel "analisis kernel Linux" yang lain adalah berdasarkan konvensyen berikut:
a) Versi kernel ialah Linux 5.6.18, yang boleh diperolehi daripada pautan berikut:https:// mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.6.18.tar.xz
b) Memandangkan kebanyakan sistem terbenam menggunakan pemproses ARM, bahagian seni bina terlibat , semuanya dengan ARM sebagai objek analisis
2. Fungsi teras kernel Linux
Oleh itu, fungsi terasnya ialah: mengurus peranti perkakasan untuk digunakan oleh aplikasi. Komponen standard komputer moden (sama ada PC atau sistem terbenam) ialah CPU, Memori (memori dan memori luaran), peranti input dan output, peranti rangkaian dan peranti persisian lain. Jadi untuk mengurus peranti ini, kernel Linux mencadangkan seni bina berikut.
(kod untuk mendapatkan mesej peribadi latar belakang [kod] secara percuma)
3 Seni bina keseluruhan kernel Linux
Rajah di atas menggambarkan seni bina keseluruhan kernel Linux. Menurut fungsi teras kernel, kernel Linux mencadangkan 5 subsistem, yang bertanggungjawab untuk fungsi berikut:
1. Bertanggungjawab untuk menguruskan sumber CPU supaya setiap proses boleh mengakses CPU dengan cara yang adil yang mungkin. 2. Pengurus Memori, pengurusan memori. Bertanggungjawab untuk mengurus sumber Memori supaya pelbagai proses boleh berkongsi sumber memori mesin dengan selamat. Di samping itu, pengurusan memori akan menyediakan mekanisme ingatan maya, yang membolehkan proses menggunakan lebih banyak memori daripada memori sistem yang tersedia. Memori yang tidak digunakan akan disimpan dalam memori tidak meruap luaran melalui sistem fail, dan akan diambil apabila diperlukan. dalam ingatan. 3. VFS (Sistem Fail Maya), sistem fail maya. Kernel Linux mengabstrak peranti luaran dengan fungsi yang berbeza, seperti peranti Cakera (cakera keras, cakera magnetik, NAND Flash, Nor Flash, dll.), peranti input dan output, peranti paparan, dll., ke dalam antara muka operasi fail bersatu (terbuka). , tutup, baca, tulis, dsb.) untuk mengakses. Ini adalah penjelmaan "semuanya adalah fail" dalam sistem Linux (sebenarnya, Linux tidak menyeluruh, kerana CPU, memori, rangkaian, dll. belum lagi menjadi fail. Jika anda benar-benar memerlukan segala-galanya untuk menjadi fail, anda perlu melihat apa yang sedang dibangunkan oleh Bell Labs "Pelan 9"). 4. Rangkaian, subsistem rangkaian. Bertanggungjawab untuk mengurus peranti rangkaian sistem dan melaksanakan pelbagai piawaian rangkaian. 5. IPC (Komunikasi Antara Proses), komunikasi antara proses. IPC tidak menguruskan sebarang perkakasan, ia bertanggungjawab terutamanya untuk komunikasi antara proses dalam sistem Linux. 3.2 Penjadual ProsesPenjadual proses ialah subsistem yang paling penting dalam kernel Linux. Ia menyediakan kawalan akses kepada CPU. Oleh kerana sumber CPU adalah terhad dalam komputer, dan banyak aplikasi menggunakan sumber CPU, "subsistem penjadualan proses" diperlukan untuk menjadualkan dan mengurus CPU. Subsistem penjadualan proses merangkumi 4 sub-modul (lihat rajah di bawah), fungsinya adalah seperti berikut:1 untuk melaksanakan penjadualan proses , yang menentukan proses (atau proses) yang akan memiliki CPU.
2. Penjadual khusus Senibina, bahagian berkaitan seni bina, digunakan untuk mengabstrak kawalan CPU yang berbeza ke dalam antara muka yang bersatu. Kawalan ini digunakan terutamanya semasa proses penggantungan dan sambung semula, yang melibatkan akses daftar CPU, operasi arahan pemasangan, dsb. 3. Penjadual bebas seni bina, bahagian bebas seni bina. Ia akan berkomunikasi dengan "modul Dasar Penjadualan" untuk memutuskan proses yang akan dilaksanakan seterusnya, dan kemudian menyambung semula proses yang ditentukan melalui "modul Penjadual khusus Senibina". 4. Antaramuka Panggilan Sistem, antara muka panggilan sistem. Subsistem penjadualan proses membuka antara muka yang perlu disediakan kepada ruang pengguna melalui antara muka panggilan sistem, sambil melindungi butiran yang tidak memerlukan program ruang pengguna untuk dijaga.3.3 Pengurus Memori (MM)
Pengurusan memori juga merupakan subsistem yang paling penting dalam kernel Linux. Ia menyediakan kawalan akses kepada sumber memori. Sistem Linux akan mewujudkan hubungan pemetaan antara memori fizikal perkakasan dan memori yang digunakan oleh proses (dipanggil memori maya ini adalah setiap proses, jadi proses yang berbeza boleh menggunakan memori maya yang sama, dan ini adalah memori maya yang sama). dipetakan kepada ingatan fizikal yang berbeza.
Subsistem pengurusan memori termasuk 3 sub-modul (lihat rajah di bawah), fungsinya adalah seperti berikut:
1 -bahagian yang berkaitan. Menyediakan antara muka maya untuk mengakses Memori perkakasan.
2. Pengurus Bebas Seni Bina, bahagian bebas seni bina. Menyediakan semua mekanisme pengurusan memori, termasuk: pemetaan memori berasaskan proses;
3. Antaramuka Panggilan Sistem, antara muka panggilan sistem. Melalui antara muka ini, fungsi seperti peruntukan dan pelepasan memori, dan pemetaan fail disediakan kepada aplikasi program ruang pengguna.
3.4 Sistem Fail Maya (VFS)
Sistem fail dalam erti kata tradisional ialah kaedah menyimpan dan mengatur data komputer. Ia mengabstrakkan blok data sejuk pada cakera komputer, pemacu keras dan peranti lain dengan cara yang mudah difahami dan mesra pengguna (struktur fail dan direktori), dengan itu menjadikannya mudah untuk mencari dan mengaksesnya. Oleh itu, intipati sistem fail ialah "kaedah menyimpan dan mengatur data", dan manifestasi sistem fail ialah "membaca data dari peranti tertentu dan menulis data ke peranti tertentu".
Dengan kemajuan teknologi komputer, kaedah menyimpan dan menyusun data juga sentiasa bertambah baik, menghasilkan banyak jenis sistem fail, seperti FAT, FAT32, NTFS, EXT2, EXT3, dll. Untuk keserasian, sistem pengendalian atau kernel mesti menyokong pelbagai jenis sistem fail dalam bentuk ungkapan yang sama, yang memanjangkan konsep sistem fail maya (VFS).
Fungsi VFS adalah untuk mengurus pelbagai sistem fail, melindungi perbezaannya dan menyediakan antara muka program pengguna untuk mengakses fail dengan cara yang bersatu.
Kami boleh membaca atau menulis data daripada cakera, pemacu keras, NAND Flash dan peranti lain, jadi sistem fail awal telah dibina pada peranti ini. Konsep ini juga boleh diperluaskan kepada peranti perkakasan lain, seperti memori, paparan (LCD), papan kekunci, port bersiri, dll.
Kawalan akses kami kepada peranti perkakasan juga boleh diringkaskan sebagai membaca atau menulis data, jadi ia boleh diakses menggunakan antara muka operasi fail bersatu. Inilah yang dilakukan oleh kernel Linux Sebagai tambahan kepada sistem fail cakera tradisional, ia juga mengabstraksikan sistem fail peranti, sistem fail memori, dsb. Logik ini semuanya dilaksanakan oleh subsistem VFS.
Subsistem VFS merangkumi 6 sub-modul (lihat rajah di bawah), fungsinya adalah seperti berikut:
1. digunakan untuk kawalan Semua peranti luaran dan pengawal. Memandangkan terdapat sejumlah besar peranti perkakasan (terutamanya produk terbenam) yang tidak serasi antara satu sama lain, terdapat juga banyak pemacu peranti. Oleh itu, hampir separuh daripada Kod Sumber dalam kernel Linux adalah pemacu peranti Kebanyakan jurutera Linux yang mendasari (terutama syarikat domestik) sedang menulis atau menyelenggara pemacu peranti dan tidak mempunyai masa untuk menganggarkan kandungan lain (yang sebenarnya adalah intipati Linux. kernel).
2. Antara Muka Bebas Peranti, modul ini mentakrifkan cara bersatu untuk menerangkan peranti perkakasan (model peranti bersatu Semua pemacu peranti mematuhi definisi ini, yang boleh mengurangkan kesukaran pembangunan). Pada masa yang sama, antara muka boleh disediakan ke atas dengan cara yang konsisten.
3. Sistem Logik, setiap sistem fail akan sepadan dengan Sistem Logik (sistem fail logik), yang akan melaksanakan logik sistem fail tertentu.
4. Antara Muka Bebas Sistem, modul ini bertanggungjawab untuk mewakili peranti perkakasan dan sistem fail logik dengan antara muka bersatu (peranti pantas dan peranti aksara), supaya perisian lapisan atas tidak lagi mengambil berat tentang perkakasan tertentu bentuk.
5. Antaramuka Panggilan Sistem, antara muka panggilan sistem, menyediakan ruang pengguna dengan antara muka bersatu untuk mengakses sistem fail dan peranti perkakasan.
3.5 Subsistem Rangkaian (Bersih)
Subsistem rangkaian bertanggungjawab terutamanya untuk menguruskan pelbagai peranti rangkaian dalam kernel Linux, dan melaksanakan pelbagai susunan protokol rangkaian, dan akhirnya menyambung kepada sistem lain melalui rangkaian Fungsi. Dalam kernel Linux, subsistem rangkaian hampir serba lengkap Ia merangkumi 5 sub-modul (lihat rajah di bawah fungsinya adalah seperti berikut:
1. Pemacu Peranti Rangkaian , pemacu peranti rangkaian adalah sama dengan pemacu peranti dalam subsistem VFS.
2. Antara Muka Bebas Peranti, yang sama seperti dalam subsistem VFS.
3. Protokol Rangkaian, melaksanakan pelbagai protokol penghantaran rangkaian, seperti IP, TCP, UDP, dll.
4. Antara Muka Bebas Protokol, melindungi peranti perkakasan dan protokol rangkaian yang berbeza, dan menyediakan antara muka (soket) dalam format yang sama.
5 antara muka Panggilan Sistem, antara muka panggilan sistem menyediakan ruang pengguna dengan antara muka bersatu untuk mengakses peranti rangkaian.
Bagi subsistem IPC, memandangkan fungsinya agak mudah, ia tidak akan diterangkan di sini.
Kod sumber kernel Linux merangkumi tiga bahagian utama:
1 Kod teras kernel, termasuk apa yang diterangkan dalam Bab 3 Pelbagai subsistem dan submodul, serta subsistem sokongan lain, seperti pengurusan kuasa, pemulaan Linux, dsb.
2 , iaitu, kernel tidak Bergantung pada mana-mana perisian lain, anda boleh menyusunnya sendiri), koleksi perisian tegar, KVM (teknologi mesin maya), dll.
3. notis hak cipta dan fail tambahan lain
Seperti yang ditunjukkan dalam Rajah r di bawah, struktur direktori peringkat atas kod sumber kernel boleh dilihat menggunakan arahan ls Penerangan khusus adalah seperti berikut.
include/ ---- 内核头文件,需要提供给外部模块(例如用户空间代码)使用。 kernel/ ---- Linux内核的核心代码,包含了3.2小节所描述的进程调度子系统,以及和进程调度相关的模块。 mm/ ---- 内存管理子系统(3.3小节)。 fs/ ---- VFS子系统(3.4小节)。 net/ ---- 不包括网络设备驱动的网络子系统(3.5小节)。 ipc/ ---- IPC(进程间通信)子系统。 arch// ---- 体系结构相关的代码,例如arm, x86等等。 arch//mach- ---- 具体的machine/board相关的代码。 arch//include/asm ---- 体系结构相关的头文件。 arch//boot/dts ---- 设备树(Device Tree)文件。 init/ ---- Linux系统启动初始化相关的代码。 block/ ---- 提供块设备的层次。 sound/ ---- 音频相关的驱动及子系统,可以看作“音频子系统”。 drivers/ ---- 设备驱动(在Linux kernel 3.10中,设备驱动占了49.4的代码量)。 lib/ ---- 实现需要在内核中使用的库函数,例如CRC、FIFO、list、MD5等。 crypto/ ----- 加密、解密相关的库函数。 security/ ---- 提供安全特性(SELinux)。 virt/ ---- 提供虚拟机技术(KVM等)的支持。 usr/ ---- 用于生成initramfs的代码。 firmware/ ---- 保存用于驱动第三方设备的固件。 samples/ ---- 一些示例代码。 tools/ ---- 一些常用工具,如性能剖析、自测试等。 Kconfig, Kbuild, Makefile, scripts/ ---- 用于内核编译的配置文件、脚本等。 COPYING ---- 版权声明。 MAINTAINERS ----维护者名单。 CREDITS ---- Linux主要的贡献者名单。 REPORTING-BUGS ---- Bug上报的指南。 Documentation, README ---- 帮助、说明文档。
Cadangan berkaitan: "Tutorial Video Linux"
Atas ialah kandungan terperinci Kod sumber kernel Linux bagi lima modul utama dan reka bentuk seni bina kernel keseluruhan (penjelasan grafik dan teks terperinci). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!