Dijelaskan Makefile Kernel Linux

Dalam pengembangan perangkat lunak, proses membuat dan mengelola repositori kode besar dapat menjadi sangat kompleks dengan mudah.

Untuk mengelola dan mengurangi kerumitan ini, pengembang perangkat lunak mengatur kode dalam file kecil yang ditautkan ke modul tertentu. Pengembang dapat mengkompilasi setiap file ini secara terpisah dan kemudian menautkannya bersama-sama untuk membuat perangkat lunak akhir yang dapat dieksekusi.

Contohnya adalah proyek C yang terdiri dari file kode sumber dalam ekstensi.c dan interface perangkat lunak dalam ekstensi.h. Setiap file sumber dikompilasi bersama dengan file header yang akan dibuat. o objek dihubungkan bersama menggunakan perpustakaan, sehingga menciptakan file yang dapat dieksekusi.

Untuk melakukan proses ini, pengembang perangkat lunak menggunakan alat, seperti Make, untuk mengotomatiskan proses pembuatan dan dependensi file yang diperlukan. Make menggunakan Makefiles untuk mengelola perilaku proses kompilasi.

Alat Make GNU menyediakan seperangkat aturan dan konvensi yang digunakan untuk membuat Makefile dan mengurangi kerumitan dalam meningkatkan efisiensi.

Dalam tutorial ini, kita akan membahas Makefile Kernel Linux, khususnya Kconfig dan Kbuild.

Sebelum kita mulai, ada baiknya untuk dicatat bahwa artikel ini tidak berpura-pura mengajarkan segala sesuatu tentang sistem Kernel Build. Namun, kami memberikan ikhtisar tingkat tinggi tentang membangun gambar dan modul vmlinux.

Jika Anda menginginkan informasi di luar cakupan tutorial ini, kami merekomendasikan sumber daya berikut untuk informasi yang lebih baik:

https://linkfy.to/goMakefilesDocs

https://linkfy.to/gnuMake

Kernel Makefiles: Gambaran Umum

Kernel Build System, juga disebut sistem konfigurasi, adalah alat penting—bagi mereka yang membutuhkannya—yang telah ada selama beberapa waktu. Namun, tidak semua orang akan menggunakan sistem ini; bahkan driver dan pengembang perangkat lunak tingkat rendah lainnya jarang menggunakannya. Karena Anda membaca ini, itu berarti Anda ingin tahu lebih banyak tentang Sistem Pembuatan Kernel.

Jadi, kita akan membahas bagaimana Kernel dikompilasi dan membahas sistem Kbuild dan Kconfig sehingga Anda dapat memahaminya dengan lebih baik.

Kernel Makefile memiliki lima komponen inti:

  1. Makefile: Ini adalah file make teratas yang terletak di root sumber.
  2. arch/$(ARCH) Makefile:Ini adalah lengkungan Makefile; itu bertindak sebagai suplemen untuk Makefile teratas.
  3. .config: Ini adalah file konfigurasi Kernel.
  4. Scripts/Makefile.*: Ini mendefinisikan aturan yang ditetapkan untuk semua kbuild Makefiles.
  5. Kbuild Makefiles:Ada sekitar 500 kbuild Makefile, dan tidak mudah dibaca. Pertimbangkan file seperti:

https://elixir.bootlin.com/linux/latest/source/scripts/Kbuild.include

Kconfig

File Kconfig berisi modul yang membantu saat menggunakan make *config. Ini membantu Kernel membuat konfigurasi selektif, menciptakan modularitas dan kemampuan penyesuaian untuk proses pembuatan Kernel.

Ada berbagai target konfigurasi yang ditentukan oleh sistem Kconfig. Anda dapat menggunakan bantuan make untuk melihat target yang tersedia. Target ini diproses oleh berbagai program yang disediakan oleh Kernel selama proses pembuatan.

Beberapa target Kconfig antara lain:

  • Config: Ini digunakan untuk memperbarui file konfigurasi kernel menggunakan program baris.
  • Menuconfig:Ini adalah fitur atau mekanisme Kconfig yang menawarkan akses berbasis menu ke opsi Kernel. Untuk meluncurkan menuconfig dan fitur Kconfig lainnya, Anda harus berada di dalam direktori proyek platform. Anda dapat menggunakan yang berikut ini untuk meluncurkan fitur menuconfig Kconfig. Namun, Anda juga dapat meluncurkan menuconfig dengan fitur konfigurasi Kernel GUI Linux lainnya seperti xconfig dan gconfig.
  • make linux-windriver.menuconfig – Executes menuconfig in a separate terminal session.
  • gconfig and xconfig:Gconfig mengaktifkan fitur Kernel Linux berbasis GUI. Gconfig menggunakan UI berbasis GTK atau (berbasis X). Di sisi lain, Xconfig menggunakan UI berbasis Qt. Gunakan perintah berikut untuk meluncurkan gconfig dan xconfig, masing-masing:
make linux-windriver.gconfig 

make linux-windriver.xconfig

CATATAN: Untuk menggunakan gconfig dan xconfig, Anda harus menginstal alat pengembangan QT di sistem host.

  • Nconfig:Fitur Nconfig menjalankan konfigurasi saat ini (Buildtools) dan berlaku untuk program berbasis menu Ncurses. Ini memungkinkan Anda untuk memilih paket yang akan dibangun, seperti CPU, driver, dan sistem file saat membangun Kernel. Gunakan perintah: make nconfig.
  • Oldconfig:Fitur konfigurasi lama memungkinkan Anda untuk menerapkan file.config yang lebih baru ke file konfigurasi kernel yang lebih lama. Misalnya, file.config lama dan file.config yang lebih baru (versi kernel yang lebih baru) akan memiliki perbedaan, artinya Anda perlu memperbarui konfigurasi saat ini sebelum kernel build. Anda dapat menggunakan make oldconfig untuk memperbarui konfigurasi lama secara interaktif dengan menerapkan opsi yang hilang di file konfigurasi lama.
  • Defconfig:Fitur ini memungkinkan sistem build kernel untuk menambahkan konfigurasi baru yang disediakan oleh defconfig ke file.config. Lebih tepatnya, sistem Kbuild memeriksa semua file Kconfig. Jika defconfig menentukan opsi dalam file, sistem Kbuild menggunakan nilai yang ditentukan untuk menambahkan opsi ke.config. Jika defconfig tidak menyebutkan opsi tersebut, Kbuild menggunakan nilai default di.config.

Pertimbangkan hal berikut:

Cuplikan kode defconfig dari sumber berikut:

https://elixir.bootlin.com/linux/v5.9/source/scripts/kconfig/Makefile#L98

1.  defconfig: $(obj)/conf
2.  ifneq ($(wildcard $(srctree)/arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG)),)
3.      @$(kecho) "*** Default configuration is based on '$(KBUILD_DEFCONFIG)'"
4.      $(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG) $(Kconfig)
5.  else
6.      @$(kecho) "*** Default configuration is based on target '$(KBUILD_DEFCONFIG)'"
7.      $(Q)$(MAKE) -f $(srctree)/Makefile $(KBUILD_DEFCONFIG)
8.  endif
9.   
10. %_defconfig: $(obj)/conf
11.     $(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/[email protected] $(Kconfig)
12.  
13. configfiles=$(wildcard $(srctree)/kernel/configs/[email protected] $(srctree)/arch/$(SRCARCH)/configs/[email protected])
14.  
15. %.config: $(obj)/conf
16.     $(if $(call configfiles),, $(error No configuration exists for this target on this architecture))
17.     $(Q)$(CONFIG_SHELL) $(srctree)/scripts/kconfig/merge_config.sh -m.config $(configfiles)
18.     $(Q)$(MAKE) -f $(srctree)/Makefile olddefconfig

Cuplikan kode Oldconfig dari sumber berikut:

https://elixir.bootlin.com/linux/v5.9/source/scripts/kconfig/conf.c#L694

1.      case olddefconfig:
2.      default:
3.          break;
4.      }
5.   
6.      if (input_cara == savedefconfig) {
7.          if (conf_write_defconfig(defconfig_file)) {
8.              fprintf(stderr, "n*** Error while saving defconfig to: %snn",
9.                  defconfig_file);
10.             return 1;
11.         }
12.     } else if (input_cara != listnewconfig && input_cara != helpnewconfig) {
13.         if (!no_conf_write && conf_write(NULL)) {
14.             fprintf(stderr, "n*** Error during writing of the configuration.nn");
15.             exit(1);
16.         }
17.  
18.         /*
19.          * Create auto.conf if it does not exist.
20.          * This prevents GNU Make 4.1 or older from emitting
21.          * "include/config/auto.conf: No such file or directory"
22.          * in the top-level Makefile
23.          *
24.          * syncconfig always creates or updates auto.conf because it is
25.          * used during the build.
26.          */
27.         if (conf_write_autoconf(sync_kconfig) && sync_kconfig) {
28.             fprintf(stderr,
29.                 "n*** Error during sync of the configuration.nn");
30.             return 1;
31.         }
32.     }
33.     return 0;
34. }

  • Savedefconfig:Aturan ini menyimpan.config saat ini dalam bentuk./defconfig, yang dianggap sebagai file konfigurasi minimal. Gunakan perintah: make saveefconfig
  • Listnewconfig: Ini digunakan untuk membuat daftar opsi baru.
  • Kvmconfig:Ini memungkinkan opsi untuk dukungan KVM. Gunakan perintah: make kvm_guest.config
  • Allyesconfig:Ini membangun file konfigurasi kernel baru dengan semua opsi disetel ke ya. Ini kebalikan dari allnoconfig.
  • Allmodconfig: Ini membangun konfigurasi kernel baru dengan modul mana yang diaktifkan secara default.
  • Randconfig: Ini membangun file konfigurasi kernel baru dengan jawaban acak untuk semua opsi.
  • Tinyconfig: Ini membuat Kernel sekecil mungkin.

Ada banyak target dalam sistem Kconfig. Beberapa yang umum termasuk config dan menuconfig.

Seperti disebutkan, target diproses oleh berbagai program di sistem host, baik yang menyediakan GUI atau command line. Anda dapat menemukan alat Kconfig di /scripts/Kconfig di sumber kernel.

https://elixir.bootlin.com/linux/latest/source/scripts/kconfig

https://elixir.bootlin.com/linux/latest/source/scripts/kconfig/Makefile

Proses pertama biasanya membaca file Kconfig di direktori root, yang digunakan untuk membangun database konfigurasi awal. Saat proses berlanjut, database diperbarui saat membaca file dalam urutan berikut:

.config

/lib/modules/$(shell,uname-r)/.config

/etc/kernel-config

/boot/config-$(shell,uname-r)

ARCH_DEFCONFIG

arch/$(ARCH)/defconfig

File.config kemudian dijatuhkan ke syncconfig, yang menerima file.config sebagai input. Ini memproses file dan file output, yang kemudian diklasifikasikan ke dalam berbagai kategori seperti:

  • autoconf.h: Ini digunakan untuk file sumber bahasa C.
  • auto.conf and tristate.conf: Ini digunakan untuk pemrosesan teks Makefile.
  • /includes/config: Ini adalah file header kosong yang digunakan dalam pelacakan ketergantungan.

File Kbuild

Hampir semua file Kernel adalah Kbuild Makefiles yang menggunakan infrastruktur Kbuild, yang merupakan fitur make rekursif. Recursive Make adalah cara menggunakan alat Make sebagai perintah di Makefile. Rekursi sangat berguna saat menyusun proyek besar.

Kbuild bekerja dengan mengacu pada semua file yang kami sebutkan di bagian di atas.

Sistem Kbuild membangun komponennya menggunakan Makefile teratas yang menyertakan Arch Makefiles dengan nama arch/$(ARCH)/Makefile dalam file konfigurasi. Secara rekursif turun ke subdirektori yang memanggil Make pada komponen menggunakan rutinitas di scripts/Makefile.*. Kbuild kemudian membangun objek yang berdekatan dan menghubungkannya ke objek, menciptakan vmlinux.

Untuk mempelajari lebih lanjut tentang sintaks yang digunakan dalam Kbuild Makefiles, lihat dokumentasi.

Perhatikan skrip berikut.

https://github.com/torvalds/linux/blob/master/scripts/link-vmlinux.sh

File objek o yang digunakan untuk membuat vmlinux dikompilasi terlebih dahulu dalam file.a bawaan masing-masing sebagai var KBUILD_VMLINUX_INIT,MAIN,LIBS. Ini disusun dalam vmlinux.

https://github.com/torvalds/linux/blob/master/scripts/Makefile.build

Kesimpulan

Dalam panduan ini, kami melihat sistem Kbuild dan Kconfig di sistem build Kernel dan cara kerjanya. Seperti yang kami sebutkan di awal tutorial, topik yang dibahas sangat luas dan tidak dapat dicakup dalam satu tutorial.

Related Posts