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
ExitBootServices(), sistem sudah masuk ke long mode. Tidak perlu melalui proses perpindahan mode real/protected segala