2 poin oleh GN⁺ 2025-10-26 | 1 komentar | Bagikan ke WhatsApp
  • 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 0x55AA di akhir sektor 512 byte pertama
    • BIOS menyalin sektor ini ke alamat 0x7C00 lalu melompat ke sana untuk mengeksekusinya
  • 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 earlyprintk ada, 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

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_kernel dijalankan 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
  • 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 nokaslr digunakan 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

 
GN⁺ 2025-10-26
Opini Hacker News
  • Artikel yang sangat bagus. Beberapa bulan lalu saya juga menulis tentang proses boot Linux, tetapi lebih berfokus pada sisi disk I/O (apa yang ada di disk, dan bagaimana itu dimuat)
    Tulisan saya bisa dilihat di Booting x86-64
  • Ada kode seperti ini di source halaman
    <!-- Femboy Mode Button - Hidden on Mobile -->
    <button class="rave-button" id="raveButton" onclick="toggleRaveMode()" title="Femboy Mode" style="display: none;">
      <span class="button-text">uwu</span>
    </button>
    
    Rasanya seperti, ini apaan ya
    • Ini masih fitur yang sedang dikerjakan
  • UEFI adalah antarmuka yang diimplementasikan firmware. Jadi itu bukan firmware itu sendiri, melainkan antarmuka standar untuk berkomunikasi dengan firmware
    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 segala
    • Saya penasaran ada referensi yang membahas hal-hal seperti ini lebih lanjut di mana
  • Saya penasaran apakah tombol daya benar-benar menyalakan CPU secara langsung. Mungkin Intel Management Engine (atau fitur serupa dari AMD) selalu aktif, lalu menerima sinyal tombol daya dan memulai CPU
    • Menurut saya peran itu ditangani oleh Embedded Controller (EC). Ini adalah bagian yang berjalan sebelum bootloader mengangkat CPU
      Di Chromebook, bagian ini dirilis sebagai open source bersama bootloader coreboot
      Dokumentasi terkait bisa dilihat di Chromium EC Zephyr README
  • Saya sedang mencari versi artikel yang lebih mendetail daripada ini. Saya tidak ingin membaca seluruh datasheet mikroprosesor, tetapi akan bagus kalau ada materi yang membahas lebih dalam sampai tahap sebelum UEFI/BIOS
  • Artikelnya memang menarik, tapi di sisi lain saya bertanya-tanya kenapa sampai perlu menjelaskan heksadesimal (HEX). Rasanya pembaca artikel level seperti ini masa tidak tahu itu
    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
    • HN bukan tempat yang hanya dibaca profesional IT. Bisa saja ada orang yang penasaran dengan proses boot Linux tetapi tidak terlalu paham atau sudah lupa konsep heksadesimal
  • Topiknya menarik, tapi terasa terlalu untuk pemula
    • Saat membaca penjelasan seperti “ketika daya sudah stabil, CPU di-reset ke real mode”, saya jadi berpikir, apakah nenek saya cukup mahir untuk memahami ini
    • Saya belajar analisis audiens (audience analysis) di universitas, dan penting untuk menilai pengetahuan apa yang boleh diasumsikan sudah ada, serta istilah atau singkatan mana yang perlu dijelaskan. Dalam penulisan teknis, ini semacam seni
  • Sulit dibaca di ponsel. Warna teksnya terlalu pudar
    • Di browser desktop pun styling-nya kurang bagus. Dengan memakai reader mode di Firefox atau Firefox Mobile, artikel itu jadi jauh lebih nyaman dibaca
    • Desainnya terlihat agak merendahkan diri sendiri
  • GRUB memang disebut, tetapi tidak dibahas secara detail
    Untuk itu, dokumen struktur disk dari Pixelbeat cukup membantu
  • Artikel ini mengingatkan saya pada wawancara teknis Facebook yang pernah saya jalani dulu. Sekitar tahun 2010, itu wawancara telepon untuk posisi Production Engineer, dan saya ditanya, “Jelaskan proses boot server Linux”
    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