Proses Boot Linux: dari Tombol Daya hingga Kernel
(0xkato.xyz)- Penjelasan teknis yang menguraikan proses sejak tombol daya komputer ditekan hingga kernel Linux mulai dijalankan langkah demi langkah
- Membahas secara rinci bagaimana CPU memulai dari real mode lalu masuk ke protected mode dan long mode
- Menjelaskan secara mendetail peran dan prinsip kerja tiap tahap seperti firmware BIOS/UEFI, bootloader (GRUB), serta dekompresi kernel dan relokasi alamat
- Menjelaskan konsep-konsep inti yang diperlukan untuk inisialisasi kernel seperti memory mapping, interrupt, page table, kASLR dengan contoh yang ringkas
- Dengan memahami mekanisme internal boot Linux, artikel ini memberi wawasan tentang arsitektur sistem, keamanan, dan optimasi performa
Part 1 — Dari tombol daya hingga eksekusi pertama kernel
-
Saat tombol daya ditekan, CPU di-reset ke real mode dan menjalankan instruksi awal
- Real mode adalah skema pengalamatan sederhana yang sudah ada sejak era 8086, yang menghitung alamat fisik dengan menggabungkan segment dan offset
- Contoh:
physical_address = (segment << 4) + offset - Setelah reset, CPU melompat ke alamat
0xFFFFFFF0(reset vector) dan menyerahkan kontrol ke firmware
-
Register adalah slot penyimpanan supercepat di dalam CPU, seperti CS (code segment) dan IP (instruction pointer)
- CS menunjukkan lokasi kode saat ini, sedangkan IP menunjuk instruksi berikutnya yang akan dijalankan
BIOS dan UEFI
- BIOS adalah firmware lama yang, setelah POST (power-on self test), memeriksa urutan boot dan mencari disk yang bisa di-boot
- Disk yang bisa di-boot ditandai dengan
0x55AAdi akhir sektor 512 byte pertama - BIOS menyalin sektor ini ke alamat
0x7C00lalu melompat ke sana untuk mengeksekusinya
- Disk yang bisa di-boot ditandai dengan
- UEFI adalah pengganti modern yang dapat memahami filesystem secara langsung dan memuat program boot yang lebih besar
- Berbeda dengan BIOS, UEFI tidak memiliki batasan “sektor pertama” dan dapat meneruskan informasi sistem yang lebih kaya ke OS
Bootloader
- Bootloader adalah program yang memuat kernel ke memori dan menyiapkannya untuk dijalankan
- GRUB adalah contoh yang umum digunakan; ia membaca file konfigurasi lalu memuat kernel dan initial ramdisk (initrd) ke memori
- File kernel terdiri dari program setup kecil untuk real mode dan inti kernel yang terkompresi
- GRUB menuliskan informasi seperti lokasi kernel, command line, dan lokasi initrd ke struktur setup header, lalu melompat ke kode setup kernel
Program setup (setup code)
- Berperan membuat ruang kerja yang dapat diprediksi sebelum kernel dijalankan
- Menyelaraskan register segmen (CS, DS, SS) dan menghapus direction flag agar penyalinan memori berjalan konsisten
- Membuat stack untuk menyimpan data sementara saat pemanggilan fungsi
- Menginisialisasi area BSS (ruang variabel global yang harus dimulai dengan nilai 0) menjadi 0
- Jika opsi
earlyprintkada, port serial dapat disetel agar pesan debug awal bisa dicetak - Meminta peta RAM (e820) ke firmware untuk mengetahui area memori yang tersedia dan area yang dicadangkan
- Setelah semua siap, program memanggil fungsi C pertama,
main, lalu masuk ke tahap perpindahan mode
Interrupt
- Interrupt adalah mekanisme yang membuat CPU menghentikan sementara pekerjaan saat ini untuk menangani kejadian yang mendesak
- Contoh umumnya adalah event perangkat keras seperti input keyboard dan timer
- Maskable interrupt dapat diblokir sementara, sedangkan NMI (Non-Maskable Interrupt) selalu harus ditangani
- Selama perpindahan mode, interrupt diblokir sementara untuk mencegah gangguan yang tidak terduga
Part 2 — Dari real mode ke 32-bit, lalu ke 64-bit
- Linux modern berjalan dalam long mode milik arsitektur x86_64
- Diperlukan perpindahan bertahap: real mode → protected mode → long mode
Protected mode
- Ini adalah mode 32-bit yang diperkenalkan untuk melampaui keterbatasan era 1980-an, dengan dua struktur inti
- GDT (Global Descriptor Table): mendefinisikan alamat awal, ukuran, dan izin tiap segmen
- Linux menggunakan flat model untuk menyederhanakan seluruh ruang 32-bit menjadi satu area kontinu
- IDT (Interrupt Descriptor Table): menyimpan alamat handler yang dipanggil saat interrupt terjadi
- Selama boot, hanya IDT minimum yang dimuat; setelah inisialisasi kernel, IDT lengkap dipasang
- GDT (Global Descriptor Table): mendefinisikan alamat awal, ukuran, dan izin tiap segmen
Proses perpindahan mode
- Kode setup terlebih dahulu melakukan menonaktifkan interrupt, menghentikan chip PIC, mengaktifkan jalur A20, dan menginisialisasi koprosesor matematika
- Jalur A20 adalah mekanisme historis untuk mengatasi masalah wrapping alamat 1MB
- Setelah memuat GDT dan IDT minimum, sistem mengatur bit PE pada register CR0 dan melakukan far jump
- Dengan demikian sistem masuk ke protected mode, lalu segmen dan stack pointer dikonfigurasi ulang sesuai skema alamat yang baru
Register kontrol
- CR0: mengaktifkan protected mode
- CR3: menyimpan alamat tingkat teratas dari page table
- CR4: mengaktifkan fitur ekstensi seperti PAE
Persiapan masuk ke long mode
- Untuk beralih ke mode 64-bit, ada dua syarat
- Paging harus aktif: melakukan pemetaan antara alamat virtual dan alamat fisik
- Bit LME (Long Mode Enable) pada register EFER harus disetel
- Page table memetakan halaman berukuran 4KB, tetapi pada boot awal biasanya disusun sederhana sebagai identity map berukuran 2MB
Prosedur mengaktifkan paging
- Mengaktifkan fitur PAE di CR4 lalu membuat page table minimum yang mencakup area alamat rendah dalam unit 2MB
- Menuliskan alamat tabel tingkat teratas ke CR3 lalu mengaktifkan paging
- Menyetel bit LME pada EFER dan melompat ke kode 64-bit untuk masuk ke long mode
- Setelah alamat dan register meluas menjadi 64-bit, persiapan eksekusi kernel selesai
Part 3 — Dekompresi kernel, perbaikan alamat, dan perpindahan dirinya sendiri
- Kini CPU sudah berada dalam mode 64-bit, dan di memori terdapat image kernel terkompresi
- Stub 64-bit kecil bertugas mengekstrak kernel dan menyesuaikan alamatnya
Pembersihan awal dan penyiapan pengaman
- Stub menghitung lokasi eksekusi aktualnya sendiri, dan jika bertumpang tindih dengan kernel, ia berpindah ke lokasi aman lewat self-relocation
- Melakukan inisialisasi area BSS miliknya sendiri dan memuat IDT sederhana (termasuk handler page fault dan NMI)
- Jika page fault terjadi, pemetaan yang kurang akan segera ditambahkan untuk pemulihan
- Membuat identity mapping untuk area-area yang diperlukan seperti kernel, parameter boot, dan buffer command line
Dekompresi kernel
- Fungsi
extract_kerneldijalankan untuk mengekstrak kompresi kernel- Mendukung berbagai algoritme kompresi seperti gzip, xz, zstd, dan lzo
- Setelah diekstrak, sistem membaca header ELF lalu menyalin section kode/data ke alamat yang benar
- Jika alamat tempat kernel dibangun berbeda dari alamat muat aktual, maka dilakukan relocation
- Instruksi atau pointer yang memuat alamat diperbaiki agar sesuai dengan lokasi memori yang sebenarnya
- Setelah semuanya siap, eksekusi melompat ke fungsi
start_kernel, dan inisialisasi kernel yang sesungguhnya pun dimulai
Perpindahan alamat kernel secara acak (kASLR)
- kASLR (Kernel Address Space Layout Randomization) mengacak alamat fisik dan virtual kernel untuk meningkatkan tingkat kesulitan serangan
- Saat boot, dua basis (base) dipilih secara acak
- Basis fisik: alamat RAM tempat kernel benar-benar ditempatkan
- Basis virtual: titik awal alamat virtual yang akan digunakan kernel
- Saat boot, dua basis (base) dipilih secara acak
- Proses pemilihannya
- Menyusun daftar area yang harus dilindungi, seperti bootloader, initrd, dan buffer command line
- Memindai peta memori firmware untuk mencari area kosong yang cukup besar
- Memilih slot acak dengan entropi yang diperoleh dari instruksi bilangan acak perangkat keras dan sumber lain
- Jika tidak ada area yang sesuai, sistem kembali ke alamat default, dan jika opsi
nokaslrdigunakan maka pengacakan dinonaktifkan
Ringkasan istilah
- Hexadecimal (heksadesimal): ditandai dengan prefiks
0x, memudahkan representasi struktur bit dan alignment perangkat keras - Register: penyimpanan sementara di dalam CPU (CS, DS, SS, IP, SP, dll.)
- Segment/Offset: metode perhitungan alamat di real mode
(segment * 16 + offset) - BIOS/UEFI: firmware yang bertugas menginisialisasi sistem dan memuat program boot
- Bootloader (GRUB): memuat kernel dan meneruskan informasi sistem
- Stack/BSS: ruang penyimpanan sementara fungsi dan area variabel global yang diinisialisasi ke 0
- Interrupt/NMI: mekanisme penanganan event perangkat keras/perangkat lunak
- GDT/IDT: tabel definisi segmen dan interrupt
- A20 Line: sakelar pencegah wrapping alamat 1MB
- Protected Mode/Long Mode: mode eksekusi 32-bit dan 64-bit
- Paging/Page Tables: alamat virtual dan alamat fisik
1 komentar
Opini Hacker News
Tulisan saya bisa dilihat di Booting x86-64
Ungkapan “UEFI memulai mesin” sedikit kurang tepat secara istilah. Yang sebenarnya memulai mesin adalah firmware, dan kita berkomunikasi dengan firmware melalui UEFI
Artikel ini melewatkan banyak bagian menarik dari firmware modern. Misalnya, saat memanggil
ExitBootServices(), sistem sudah masuk ke long mode. Tidak perlu melalui proses perpindahan mode real/protected segalaDi Chromebook, bagian ini dirilis sebagai open source bersama bootloader coreboot
Dokumentasi terkait bisa dilihat di Chromium EC Zephyr README
Satu hal lain yang saya penasaran adalah, bagaimana tepatnya saat tombol daya fisik ditekan itu terhubung ke reset vector. Ini terasa seperti wilayah sihir hardware dan rangkaian elektronik
Untuk itu, dokumen struktur disk dari Pixelbeat cukup membantu
Tidak ada bantuan selain petunjuk untuk menjelaskan lebih dalam. Pada akhirnya saya tidak pindah ke Dublin, dan yah, soal surveillance capitalism dan semacamnya, anggurnya ternyata memang masih terasa asam