Naik ke kelas perangkat bertenaga: memahami kernel Linux, device tree yang mendeskripsikan hardware, jenis driver, dan cara menyusun rootfs dengan Buildroot, lalu praktik menyalakan Linux pertama di board dari u-boot sampai userland

Sepuluh episode terakhir berkutat di dunia MCU — bare-metal, register, RTOS. Kini saatnya naik kelas: embedded Linux. Ketika kebutuhan perangkat melampaui kemampuan MCU — butuh networking kompleks, bluetooth stack, banyak proses, driver USB — embedded engineer beralih ke SoC yang menjalankan Linux.
Perbedaan mentalitasnya besar. Di MCU kalian menulis semuanya; di embedded Linux kalian memanfaatkan ekosistem raksasa: kernel, toolchain, libraries, dan package manager. Tapi kekuatan itu datang dengan lapisan abstraksi baru yang wajib dipahami: device tree — file yang memberi tahu kernel hardware apa yang ada di depan matanya. Episode ini membangun fondasi untuk menguasai ketiganya: kernel, device tree, dan rootfs.
| Kebutuhan | MCU | SoC + Linux |
|---|---|---|
| RAM tersedia | KB | MB - GB |
| Networking stack | Manual, sederhana | TCP/IP penuh, TLS |
| Multimedia | Tidak praktis | Framework audio/video lengkap |
| Banyak proses | Tidak ada (RTOS) | Proses Linux asli |
| Pengembangan | Bare-metal, driver manual | Paket, toolchain lengkap |
Rugi-ruginya: boot lebih lama (detik), konsumsi daya lebih tinggi, dan determinisme real-time lebih sulit dijamin (dibahas di episode 14). Itulah sebabnya banyak sistem memakai arsitektur hybrid — SoC Linux untuk aplikasi, MCU kecil untuk tugas real-time.
Empat komponen wajib: bootloader (U-Boot adalah standar de facto), kernel zImage, device tree blob (.dtb), dan rootfs. Kalian akan menemukan keempatnya di board Linux mana pun — termasuk Raspberry Pi (yang menyembunyikan kompleksitas ini di balik config.txt).
Masalah yang dipecahkan device tree: satu kernel bisa jalan di ribuan board berbeda. Daripada meng-compile kernel per board, Linux membaca deskripsi hardware dari file .dts (source) yang di-compile ke .dtb (binary). Ini "hardware datasheet" versi mesin:
/dts-v1/;
/ {
compatible = "vendor,my-board";
#address-cells = <1>;
#size-cells = <1>;
soc {
uart0: serial@40004000 {
compatible = "vendor,uart";
reg = <0x40004000 0x400>;
clock-frequency = <16000000>;
status = "okay";
};
leds {
compatible = "gpio-leds";
led0 { gpios = <&gpio1 12 0>; label = "status"; };
};
};
};Konsep kunci:
compatible — string yang menghubungkan node dengan driver di kernel: kernel mencari driver dengan of_match_table yang cocok.reg — alamat dan ukuran blok register peripheral.gpios — referensi ke node gpio1 dengan pin 12 — contoh cara node saling merujuk.status — okay (aktif) vs disabled.Kesalahan device tree adalah sumber "hardware tidak terdeteksi" paling umum di embedded Linux. Perbaikannya bukan menulis ulang driver, melainkan memperbaiki deskripsi. Ini keterampilan yang sangat dicari — dan jarang diajarkan.
Kernel menangani scheduling proses, memory, dan semua hardware. Saat aplikasi ingin memakai peripheral, ia tidak menyentuh register langsung — ia lewat driver yang terdaftar sebagai file device di /dev:
/dev/ttyS0 # UART (serial console)
/dev/gpiochip0 # GPIO controller
/dev/i2c-0 # I2C busPengembangan driver di kernel adalah topik besar (butuh series sendiri), tapi untuk embedded engineer ada dua level yang harus dikuasai:
/dev dan sysfs dari aplikasi C/Python. Untuk 80% kebutuhan (GPIO, I2C, SPI, UART) ini sudah cukup dan jauh lebih aman.module_init, probe, dan read/write callbacks.Aturan praktis: mulai dari user-space. Hanya tulis kernel module jika benar-benar dibutuhkan (timing ketat, interupsi khusus, hardware unik).
Rootfs adalah filesystem yang berisi userland: init, busybox, libraries, dan aplikasi kalian. Dua build system utama untuk membuat image:
| Tool | Karakteristik | Cocok untuk |
|---|---|---|
| Buildroot | Sederhana, satu image utuh, cepat | Produk tunggal, tim kecil, belajar |
| Yocto/OpenEmbedded | Sangat fleksibel, custom layers, lambat | Produk besar, banyak varian, enterprise |
Buildroot mengubah ~2000 paket menjadi satu image bootable dengan satu konfigurasi:
git clone https://github.com/buildroot/buildroot.git
cd buildroot
make qemu_arm_vexpress_defconfig
make -j$(nproc)Hasilnya output/images/ berisi zImage, vexpress-v2p-ca9.dtb, dan rootfs.ext2 — lengkap siap boot. Menguji image tanpa hardware fisik? Pakai QEMU: boot Linux embedded di PC dengan qemu-system-arm — cara tercepat dan termurah untuk belajar tanpa board mahal.
Tip
Tidak punya board Linux? Raspberry Pi Zero 2 W atau board i.MX murah adalah pilihan bagus. Tapi kalian juga bisa memulai hari ini tanpa hardware sama sekali: jalankan Buildroot + QEMU di laptop, buat image, boot, dan telusuri device tree-nya. Semua konsep di episode ini bisa dipelajari di atas emulator.
Alur praktik di board nyata (misal Raspberry Pi atau board i.MX):
cat /proc/cpuinfo, cat /proc/device-tree/model, ls /dev, dan coba GPIO user-space lewat sysfs.Uji kecil yang menguatkan pemahaman device tree: ubah satu nilai compatible di .dts dengan sengaja, rebuild dtb, boot — dan lihat hardware "hilang". Ganti kembali, boot lagi, hardware muncul. Itulah bukti langsung bahwa kernel buta tanpa deskripsi hardware yang benar.
compatible dan reg.Kernel panic - not syncing: VFS: Unable to mount root fs; periksa initramfs dan jenis filesystem.console=ttyS0,115200 di kernel cmdline.Inti yang harus dibawa pulang:
compatible + reg adalah paspor device./dev; mulai dari user-space, baru kernel module.Di episode 11 selanjutnya kita menambahkan senjata bahasa modern: Rust untuk embedded — no_std, memory safety tanpa garbage collector, dan praktik membuat aplikasi embedded di Rust. Di era 2026, Rust bukan lagi sekadar alternatif — ia sudah mainstream di industri. Sampai jumpa di episode 11!