Untuk mengurus dan mengurangkan kerumitan ini, pembangun perisian menyusun kod dalam fail kecil yang menghubungkan ke modul tertentu. Pembangun boleh menyusun setiap fail ini secara berasingan dan kemudian menghubungkannya bersama-sama untuk membuat perisian akhir yang dapat dilaksanakan.
Contohnya ialah projek C yang terdiri daripada fail kod sumber di .c sambungan dan antara muka perisian di .sambungan l. Setiap fail sumber dikumpulkan bersama dengan fail tajuk untuk dibuat. o objek dihubungkan bersama menggunakan perpustakaan, dengan itu membuat fail yang boleh dilaksanakan.
Untuk melakukan proses ini, pembangun perisian menggunakan alat, seperti Make, untuk mengotomatisasi proses build dan dependensi fail yang diperlukan. Buat menggunakan Makefiles untuk mengurus tingkah laku proses penyusunan.
Alat GNU Make menyediakan sekumpulan peraturan dan konvensi yang digunakan untuk membuat Makefiles dan mengurangkan kerumitan dalam meningkatkan kecekapan.
Dalam tutorial ini, kita akan membincangkan Linux Kernel Makefiles, secara khusus Kconfig dan Kbuild.
Sebelum kita memulakan, ada baiknya kita perhatikan bahawa artikel ini tidak berpura-pura mengajar segala-galanya mengenai sistem Kernel Build. Walau bagaimanapun, kami memberikan gambaran umum tahap tinggi untuk membina imej dan modul vmlinux.
Sekiranya anda mahukan maklumat di luar skop tutorial ini, kami mengesyorkan sumber berikut untuk mendapatkan maklumat yang lebih baik:
https: // linkfy.ke / goMakefilesDocs
https: // linkfy.ke / gnuMembuat
Kernel Makefiles: Gambaran Keseluruhan
Sistem Pembuatan Kernel, juga disebut sistem konfigurasi, adalah alat penting - bagi mereka yang memerlukannya - yang telah lama wujud. Walau bagaimanapun, tidak semua orang akan menggunakan sistem ini; malah pemacu dan pembangun perisian tahap rendah lain jarang menggunakannya. Oleh kerana anda membaca ini, ini bermaksud anda ingin mengetahui lebih lanjut mengenai Sistem Pembinaan Kernel.
Oleh itu, kita akan membincangkan bagaimana Kernel disusun dan membincangkan sistem Kbuild dan Kconfig supaya anda dapat memahaminya dengan lebih baik.
Kernel Makefile mempunyai lima komponen teras:
- Makefile: Ini adalah fail membuat teratas yang terletak di akar sumber.
- arch / $ (ARCH) Makefile: Ini adalah lengkungan Makefile; ia bertindak sebagai tambahan untuk Makefile teratas.
- .konfigurasi: Ini adalah fail konfigurasi Kernel.
- Skrip / Makefile.*: Ini menentukan peraturan yang ditetapkan untuk semua Makefiles kbuild.
- Kbuild Makefiles: Terdapat kira-kira 500 kfk Makefiles, dan mereka sangat mudah dibaca. Pertimbangkan fail seperti:
https: // elixir.butlin.com / linux / terkini / sumber / skrip / Kbuild.merangkumi
Kconfig
Fail Kconfig mengandungi modul yang membantu ketika menggunakan make * config. Ia membantu Kernel membuat konfigurasi selektif, mewujudkan modulariti dan penyesuaian untuk proses pembuatan Kernel.
Terdapat pelbagai sasaran konfigurasi yang ditentukan oleh sistem Kconfig. Anda boleh menggunakan bantuan membuat untuk melihat sasaran yang tersedia. Sasaran ini diproses oleh pelbagai program yang disediakan oleh Kernel semasa proses pembinaan.
Beberapa sasaran Kconfig termasuk:
- Konfigurasi: Ini digunakan untuk mengemas kini file konfigurasi kernel menggunakan program baris.
- Menuconfig: Ini adalah ciri atau mekanisme Kconfig yang menawarkan akses berdasarkan menu ke pilihan Kernel. Untuk melancarkan menuconfig dan ciri Kconfig lain, anda harus berada di dalam direktori projek platform. Anda boleh menggunakan yang berikut untuk melancarkan ciri menconfig Kconfig. Namun, anda juga boleh melancarkan menuconfig dengan ciri konfigurasi KUI Linux GUI lain seperti xconfig dan gconfig. buat linux-windriver.menuconfig - Menjalankan menuconfig dalam sesi terminal yang berasingan.
- gconfig dan xconfig: Gconfig mengaktifkan ciri Kernel Linux berasaskan GUI. Gconfig menggunakan UI berasaskan GTK atau (berdasarkan X). Sebaliknya, Xconfig menggunakan UI berasaskan Qt. Gunakan arahan berikut untuk melancarkan gconfig dan xconfig, masing-masing:
buat linux-windriver.xconfig
NOTA: Untuk menggunakan gconfig dan xconfig, anda harus memasang alat pengembangan QT pada sistem host.
- Nconfig: Ciri Nconfig menjalankan konfigurasi semasa (Buildtools) dan berlaku untuk program yang didorong oleh menu Ncurses. Ini membolehkan anda memilih pakej yang akan dibina, seperti CPU, pemacu, dan sistem fail ketika membuat Kernel. Gunakan arahan: buat nconfig.
- Oldconfig: Ciri oldconfig membolehkan anda menerapkan yang lebih baru .fail konfigurasi ke fail konfigurasi kernel yang lebih lama. Contohnya, yang lama .fail konfigurasi dan yang lebih baru .file config (versi kernel yang lebih baru) akan mempunyai perbezaan, yang bermaksud anda perlu mengemas kini konfigurasi semasa sebelum kernel dibuat. Anda boleh menggunakan make oldconfig untuk mengemas kini konfigurasi lama secara interaktif dengan menerapkan pilihan yang hilang dalam fail konfigurasi lama.
- Defconfig: Fungsi ini membolehkan sistem pembuatan kernel menambahkan konfigurasi baru yang disediakan oleh defconfig ke .fail konfigurasi. Lebih tepat lagi, sistem Kbuild memeriksa semua fail Kconfig. Sekiranya defconfig menentukan pilihan dalam fail, sistem Kbuild menggunakan nilai yang ditentukan untuk menambahkan pilihan ke .konfigurasi. Sekiranya defconfig tidak menyebut pilihannya, Kbuild menggunakan nilai lalai di .konfigurasi.
Pertimbangkan perkara berikut:
Ringkasan kod Defconfig dari sumber berikut:
https: // elixir.butlin.com / linux / v5.9 / sumber / skrip / kconfig / Makefile # L98
1. defconfig: $ (obj) / konf2. ifneq ($ (wildcard $ (srctree) / arch / $ (SRCARCH) / configs / $ (KBUILD_DEFCONFIG)),)
3. @ $ (kecho) "*** Konfigurasi lalai didasarkan pada '$ (KBUILD_DEFCONFIG)'"
4. $ (Q) $< $(silent) --defconfig=arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG) $(Kconfig)
5. yang lain
6. @ $ (kecho) "*** Konfigurasi lalai berdasarkan sasaran '$ (KBUILD_DEFCONFIG)'"
7. $ (Q) $ (MAKE) -f $ (srctree) / Makefile $ (KBUILD_DEFCONFIG)
8. endif
9.
10. % _defconfig: $ (obj) / konf
11. $ (Q) $< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
12.
13. configfiles = $ (wildcard $ (srctree) / kernel / config / $ @ $ (srctree) / arch / $ (SRCARCH) / config / $ @)
14.
15. %.config: $ (obj) / konf
16. $ (if $ (call configfiles) ,, $ (ralat Tidak ada konfigurasi untuk sasaran ini pada seni bina ini))
17. $ (Q) $ (CONFIG_SHELL) $ (srctree) / skrip / kconfig / merge_config.sh-m .config $ (configfiles)
18. $ (Q) $ (MAKE) -f $ (srctree) / Makefile olddefconfig
Snapshot kod Oldconfig dari sumber berikut:
https: // elixir.butlin.com / linux / v5.9 / sumber / skrip / kconfig / conf.c # L694
1. kes olddefconfig:2. lalai:
3. rehat;
4.
5.
6. jika (input_mode == saveefconfig)
7. jika (conf_write_defconfig (defconfig_file))
8. fprintf (stderr, "n *** Ralat semasa menyimpan defconfig ke:% s \ n \ n",
9. defconfig_file);
10. pulangan 1;
11.
12. lain jika (input_mode != listnewconfig && input_mode != helpnewconfig)
13. sekiranya (!no_conf_write && conf_write (NULL))
14. fprintf (stderr, "\ n *** Ralat semasa menulis konfigurasi.\ n \ n ");
15. jalan keluar (1);
16.
17.
18. / *
19. * Buat automatik.conf jika ia tidak wujud.
20. * Ini menghalang GNU Make 4.1 atau lebih tua daripada mengeluarkan
21. * "sertakan / config / auto.conf: Tiada fail atau direktori seperti itu "
22. * di Makefile peringkat teratas
23. *
24. * syncconfig selalu membuat atau mengemas kini secara automatik.conf kerana ia
25. * digunakan semasa membina.
26. * /
27. jika (conf_write_autoconf (sync_kconfig) && sync_kconfig)
28. fprintf (stderr,
29. "\ n *** Ralat semasa penyegerakan konfigurasi.\ n \ n ");
30. pulangan 1;
31.
32.
33. pulangan 0;
34.
- Savedefconfig: Peraturan ini menjimatkan semasa .config dalam bentuk ./ defconfig, yang dianggap sebagai fail konfigurasi minimum. Gunakan arahan: buat saveefconfig
- Listnewconfig: Ini digunakan untuk menyenaraikan pilihan baru.
- Kvmconfig: Ini membolehkan pilihan untuk sokongan KVM. Gunakan arahan: buat kvm_guest.konfigurasi
- Allyesconfig: Ini membina fail konfigurasi kernel baru dengan semua pilihan ditetapkan ke ya. Ini adalah kebalikan dari allnoconfig.
- Allmodconfig: Ini membina konfigurasi kernel baru dengan modul yang diaktifkan secara lalai.
- Randconfig: Ini membina fail konfigurasi kernel baru dengan jawapan rawak untuk semua pilihan.
- Tinyconfig: Ini menjadikan Kernel terkecil mungkin.
Terdapat banyak sasaran dalam sistem Kconfig. Beberapa yang biasa termasuk konfigurasi dan menuconfig.
Seperti disebutkan, target diproses oleh berbagai program dalam sistem host, baik menyediakan GUI atau baris perintah. Anda boleh mencari alat Kconfig di / scripts / Kconfig di sumber kernel.
https: // elixir.butlin.com / linux / terkini / sumber / skrip / kconfig
https: // elixir.butlin.com / linux / terkini / sumber / skrip / kconfig / Makefile
Proses pertama biasanya adalah membaca fail Kconfig di direktori root, yang digunakan untuk membina pangkalan data konfigurasi awal. Semasa proses berlanjutan, pangkalan data dikemas kini ketika membaca fail mengikut urutan berikut:
.konfigurasi/ lib / modul / $ (shell, uname-r) /.konfigurasi
/ etc / kernel-config
/ boot / config - $ (shell, uname-r)
ARCH_DEFCONFIG
arch / $ (ARCH) / defconfig
.file config kemudian dijatuhkan ke syncconfig, yang menerima .fail konfigurasi sebagai input. Ia memproses fail dan mengeluarkan fail, yang kemudian diklasifikasikan ke dalam pelbagai kategori seperti:
- autokonfigurasi.h: Ini digunakan untuk fail sumber bahasa C.
- kereta.conf dan tristate.konfigurasi: Ini digunakan untuk pemprosesan teks Makefile.
- / termasuk / konfigurasi: Ini adalah fail tajuk kosong yang digunakan dalam penjejakan kebergantungan.
Fail Kbuild
Hampir semua fail Kernel adalah Kbuild Makefiles yang menggunakan infrastruktur Kbuild, yang merupakan ciri pembuatan rekursif. Recursive Make adalah cara menggunakan alat Make sebagai arahan dalam Makefile. Rekursi sangat berguna semasa menyusun projek besar.
Kbuild berfungsi dengan merujuk kepada semua fail yang kami sebutkan di bahagian di atas.
Sistem Kbuild membina komponennya menggunakan Makefile teratas yang merangkumi lengkungan Makefiles dengan nama arch / $ (ARCH) / Makefile dalam fail konfigurasi. Secara rekursif turun ke subdirektori yang menggunakan Make on komponen menggunakan rutin dalam skrip / Makefile.*. Kbuild kemudian membina objek bersebelahan dan menghubungkannya ke objek, mencipta vmlinux.
Untuk mengetahui lebih lanjut mengenai sintaks yang digunakan dalam Kbuild Makefiles, rujuk dokumentasi.
Pertimbangkan skrip berikut.
https: // github.com / torvalds / linux / blob / master / skrip / link-vmlinux.sh
Fail objek o yang digunakan untuk membuat vmlinux disusun terlebih dahulu dalam bawaan masing-masing .fail sebagai var KBUILD_VMLINUX_INIT, MAIN, LIBS. Ini disusun dalam vmlinux.
https: // github.com / torvalds / linux / blob / master / skrip / Makefile.membina
Kesimpulannya
Dalam panduan ini, kami melihat sistem Kbuild dan Kconfig dalam sistem binaan Kernel dan bagaimana ia berfungsi. Seperti yang kami sebutkan di awal tutorial, topik yang dibincangkan luas dan tidak dapat dibahas dalam satu tutorial.