Porting Linux 2.6 ke Platform ARM Baru (bagian 3)

Artikel berikut berseri hingga tiga bagian. Artikel ini ditulis oleh hacker Linux/FreeBSD ARM Yohanes Nugroho, saat ini tinggal di Chiang Mai, Thailand. Penulis mengizinkan tulisannya untuk ditampilkan di portal embedid.net

Pada bagian ini saya akan membahas dua hal yang berhubungan dengan porting kernel 2.6 ke platform ARM baru. Hal pertama adalah Reverse engineering, yang berisi tips yang memudahkan dalam mempelajari file binary image kernel atau tools yang tersedia di firmware original. Hal yang kedua adalah mengenai user space untuk embedded Linux.

Reverse Engineering

Tujuan reverse engineering biasanya adalah untuk membuat driver. Dalam kasus yang saya temui, saya tidak bisa menemukan source code untuk driver watchdog, button, dan RTC (real time clock) . Hal yang paling saya inginkan adalah bagian watchdog, sedangkan bagian lain tidak terlalu berguna bagi saya. Watchdog berguna merestart device jika device tersebut “hang”. Sebenarnya ada software watchdog yang tersedia untuk Linux, tapi karena berbasis software, watchdog inipun bisa hang.

Tujuan lain reverse engineering adalah mempelajari program yang diberikan pada firmware original. Reverse engineering program biasanya digunakan untuk mempelajari mekanisme update, dan untuk mengetahui format firmware yang diterima oleh device.

Langkah pertama reverse engineering adalah mengerti assembly ARM. Hal ini bisa dilakukan dengan membaca arm architecture reference manual. Selain itu output gcc -S akan sangat membantu dalam mengerti kode yang dihasilkan oleh GCC. Jika Anda punya source code dalam C, maka Anda bisa mengetahui kode assembly yang digunakan dengan mengetikkan:

    gcc -S test.c

Hasilnya adalah test.s. Anda bisa mengubah-ubah tingkat optimasi gcc (-Os, -O0, -O1, -O2, dst) dan melihat perbedaan pada kode yang dihasilkan.

Setelah Anda mengetahui dasar-dasar assembly, Langkah berikutnya adalah melakukan disassembly pada modul kernel atau pada image kernel. Ini bisa dilakukan dengan program komersial seperti IDA Pro atau dengan cara sederhana menggunakan program objdump.

Untuk modul yang dikompilasi ke dalam image kernel (bukan modul terpisah), kita bisa mendekompresi zImage atau bootpImage dengan menggunakan program gunzip. Untuk membantu mengenali sebagian fungsi yang diekspor kernel, kita bisa melihat /proc/kallsyms. Isi /proc/kallsyms adalah alamat memori dan nama fungsi pada alamat tersebut. Dengan berbekal titik-titik nama fungsi, Anda bisa merunut source code kernel untuk mencari fungsi yang ingin Anda pelajari.

User space untuk embedded device

Perbedaan utama antara program yang ditujukan untuk embedded dan desktop adalah pada pemakaian memori dan ukuran filenya. Biasanya sistem embedded memiliki memori yang sangat terbatas. Seiring berjalannya tahun, batasan embedded ini selalu berubah, sebelas tahun yang lalu, pada tahun 1997, desktop saya hanya memiliki memori 16 Mb, dengan prosessor 120 Mhz, dan hard disk 1 Gb. NAS yang saya miliki saat ini tergolong embedded device dengan memori 32 Mb, prosessor 200 Mhz, dan harddisk 500 Gb.

Embedded system umumnya dilengkapi dengan Flash ROM dan ini biasanya bisa ditulis/diupdate. Ukuran flash ROM ini kecil (rata-rata 8-32 Mb), dan banyak yang hanya bisa ditulisi sekitar 100 ribu kali. Anda bisa menginstall root filesystem ke dalam Flash ROM, atau ke penyimpanan eksternal.

Jika memungkinkan, penyimpanan eksternal (seperti USB atau IDE/SATA) lebih nyaman, karena space lebih besar dan Anda bisa menggunakannya untuk partisi swap. Jika space untuk root filesystem Anda sangat terbatas (misalnya dalam kasus ROM), sebaiknya Anda membuat distribusi Anda sendiri menggunakan buildroot, dan jika space yang Anda miliki besar, Anda bisa menggunakan distribusi Linux yang lengkap.

Library C untuk embedded

Library C dari GNU (glibc) memakan space yang cukup besar, dan ini tentunya tidak diinginkan jika Anda ingin membuat seluruh distribusi Anda berjalan di flash memory. Solusinya adalah uClibc, library C yang ukurannya mini. Untuk menggunakan uClibc, program Anda harus dikompilasi ulang agar dilink pada library uClibc. Proses ini cukup merepotkan, sehingga sebaiknya Anda menggunakan buildroot, yang dapat membantu Anda mengkompilasi aneka macam program standar.

Membuat Distribusi dengan Buildroot

Buildroot adalah program untuk membuat sebuah root filesystem custom dengan mudah. Buildroot juga bisa menambahkan program ipkg ke dalam root filesystem yang Anda miliki, jadi setelah Anda membuat sebuah root filesystem standar, Anda masih bisa menginstall paket-paket tambahan, dengan kata lain buildroot ini dapat digunakan untuk membuat distribusi Linux Anda sendiri.

Untuk menggunakan buildroot sebaiknya Anda memiliki koneksi Internet yang cepat atau Anda harus mendownload dulu semua source code yang diperlukan oleh buildroot yang bisa mencapai ratusan megabyte. Untuk memulai menggunakan buildroot, Anda cukup mengetikkan:

     make menuconfig

Sama seperti ketika Anda ingin mengkonfigurasi kernel Linux. Menu yang serupa pun akan muncul. Di menu tersebut Anda wajib memilih arsitektur target (hampir semua target yang didukung oleh Linux bisa Anda pilih). Setelah itu Anda bisa memilih package-package apa saja yang akan disertakan. Anda juga perlu memperhatikan opsi “Target Filesystem Options” yang menentukan output apa yang akan dihasilkan ketika menjalankan perintah “make”. Saya lebih suka memilih target “tar the root file system” untuk menghasilkan file .tar yang dapat saya ekstrak di storage device target.

Menginstall Debian Lengkap

Beberapa distribusi mendukung platform ARM (misalnya Gentoo dan Debian) dan bisa diinstall pada device dengan spesifikasi rendah. Hal ini juga berarti bahwa distribusi tersebut bisa diinstall pada embedded device asalkan storage spacenya mencukupi.

Pada bagian ini saya hanya akan membahas Debian. Sebenarnya saat ini sedang ada proyek emdebian yang berusaha membuat Debian khusus untuk embedded system, tapi proyek tersebut belum matang, dan saya hanya akan membahas instalasi Debian secara penuh.

Pertimbangan saya menginstall Debian secara penuh ada dua. Pertama adalah kemudahan, saya memakai Debian di desktop, dan sudah terbiasa dengan aneka perintah seperti “apt-get”, dan saya tidak ingin menggunakan distribusi lain lagi. Kedua adalah kemampuan device, saya ingat bahwa 10 tahun yang lalu, server di Informatika ITB mampu menjalankan distribusi Linux yang lengkap dan bisa menangani cukup banyak user dengan Pentium 200 Mhz. Karena user di apartemen saya hanya saya dan istri saya, maka kemampuan device ini lebih dari cukup untuk diinstall Debian tanpa perlu menginstall atau membuat distribusi Linux khusus.

Saya tidak akan membahas secara spesifik langkah untuk agestar, tapi secara umum untuk platform baru apapun (langkah spesifik Agestar bisa dilihat di http://irina.homelinux.com). Anda bahkan dapat menggunakan langkah-langkah ini untuk menginstall Linux ke PC. Misalnya Anda bisa memakai ini di untuk menginstall Debian di PC lama yang tidak memiliki CD ROM dan tidak bisa boot dari floppy ataupun jaringan.

Pertama Anda perlu program cdebootstrap

     apt-get install cdebootstrap

Buat direktori baru, lalu jalankan:

     cdebootstrap -aarm etch etch ftp://ftp.us.debian.org/debian

Dalam kasus saya, saya menggunakan arsitektur ARM, jika Anda menggunakan arsitektur lain, Anda tinggal mengganti -aarm dengan arsitektur yang Anda miliki. Sebaiknya Anda mengganti ftp://ftp.us.debian.org/debian dengan server yang lebih dekat. Setelah itu Anda perlu membuat direktori dev:

 cd etch/dev
 /sbin/MAKEDEV generic-arm
 /sbin/MAKEDEV md

Parameter generic-arm bisa diganti sesuai arsitektur target Anda. Anda bisa menambahkan device-device tambahan (misalnya dalam kasus Agestar, device tambahan yang diperlukan adalah mtd block).

Semua file hasil bisa Anda salin ke device yang akan diboot (misalnya harddisk atau flash disk). Setelah itu Anda perlu melakukan booting kernel, pastikan bahwa Anda menambahan parameter kernel “init=/bin/sh”. Ini akan mencegah kernel menjalankan program startup apapun (distribusi ini belum lengkap).

Ketika sampai di command prompt, Anda perlu menjalankan:

    cd /var/cache/bootstrap
    export PATH

Perintah berikut ini bertujuan memount /proc agar aneka program bisa berjalan dengan benar.

    mount -t proc proc /proc

Setelah itu Anda perlu menginstall file-file yang belum diinstall. Karena keterbatasan pemeriksaan dependensi Debian saat ini, file-file package perlu diinstall paksa beberapa kali. Diawali dengan file-file dasar:

    dpkg --force-all -i libc6*deb
    dpkg --force-all -i dpkg*deb
    dpkg --force-all -i libc6*deb

Lalu perintah berikut ini perlu dijalankan 3 kali.

dpkg -iGREB .

Setelah yang ketiga, hapus /var/mail lalu ulangi perintah tersebut sekali lagi.

Anda perlu mengedit /etc/fstab untuk memberitahu partisi mana yang perlu dimount ketika proses booting dilakukan. Setidaknya file fstab harus berisi root filesystem dan proc filesystem, dan biasanya Anda juga perlu menyertakan partisi swap. Isi file fstab misalnya seperti ini:

# [file system] [mount point] [type] [options] [dump] [pass]
 /dev/sda1 none swap sw 0 0
 /dev/sda2 / ext3 defaults 0 0
 proc /proc proc defaults 0 0

Anda mungkin perlu juga mengedit file /etc/inittab jika device Anda tidak memiliki console virtual (seperti dalam kasus agestar). Setelah itu Anda bisa boot device tanpa “init=/bin/sh” dan Anda akan masuk ke Debian.

Aneka Ide dari proyek NSLU2-Linux

Para pengguna proyek NSLU2-Linux memiliki banyak ide dalam memanfaatkan device mereka. Ide yang sama bisa ditiru juga untuk device agestar yang saya miliki. Contoh ide tersebut misalnya:

Menggunakan device di mobil karena daya yang digunakan rendah (carputer/car computer). Device ini bisa menjadi MP3 server/player (jika dihubungkan ke speaker USB)atau sebagai storage device untuk GPS logging Menambahan LCD melalui USB atau menghubungkan Palm lawas sebagai display Menggunakan device sebagai VoIP PBX

Penutup

Porting kernel 2.6 ke platform ARM baru merupakan pelajaran yang sangat berharga bagi saya. Pengalaman ini lebih berguna dari sekedar membaca banyak buku mengenai kernel Linux. Pengalaman ini juga mendorong saya untuk melihat-lihat lagi device-device yang saya miliki dan potensinya jika diinstall Linux. Misalnya saya memiliki Palm Tungsten E yang saat ini jarang digunakan dan ternyata device ini sudah didukung oleh Linux.

Dari sisi praktis, NAS yang tadinya hanya berguna untuk media penyimpanan dan memiliki beberapa fitur lain yang buggy, kini bisa memiliki banyak fungsi. Dengan kernel yang baru, device ini pun menjadi lebih stabil (tidak pernah error/crash lagi).

Setiap bulan banyak device baru yang dirilis, dan banyak device-device tersebut yang berpotensi menjalankan Linux. Para hacker di Internet telah memporting banyak device, tapi masih banyak kesempatan untuk memporting aneka device lain yang saat ini beredar. Mungkin memporting device yang kurang populer tidak akan menjadikan Anda terkenal, tapi hal tersebut akan mengajarkan banyak hal pada Anda.

Bagian 1 Bagian 2 Bagian 3

Copyright © 2009-2010 Yohanes Nugroho

Website: http://yohan.es/

Pos ini dipublikasikan di Embedded, Linux dan tag , , , . Tandai permalink.

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s