Wednesday, December 14, 2005

Bedah Kernel Linux: Booting

Bagaimana sebuah sistem operasi mulai berjalan? Telah menjadi pertanyaan banyak pemula komputer. Bagaimana sebuah software dapat mengoperasikan seluruh perangkat keras, kemudian menjalankan software-software lain di atasnya. Program pengolah kata, web browser, atau sekedar kalkulator, tidak akan dapat berjalan tanpa sebuah sistem operasi. Sistem operasi merupakan sebuah penghubung antara perangkat keras dan perangkat lunak aplikasi. Pada saat pengguna menekan tombol Control dan S atau dengan menggunakan menu memilih File | Save maka dokumen yang sedang kita edit akan disimpan ke hardisk, tetapi bagaimana sistem operasi menggerakan jarum pembaca hardisk agar melakukan pekerjaan perekaman ke hardisk, ini merupakan suatu misteri besar bagi sebagian besar pengguna komputer. Proses dari pengguna mengetikkan command sampai jarum pembaca hardisk menggoreskan magnet ke atas piringan hardisk, merupakan proses berantai yang panjang.

Artikel ini tidak akan membahas secara panjang lebar seluruh proses dan mekanisme sebuah sistem operasi, sebab pembahasan seperti ini akan menghabiskan ratusan halaman, atau lebih dari 2 semester di ruangan kelas  Tetapi saya cukup akan membahas tahapan paling awal bagaimana sistem operasi mulai bekerja. Tentu saja setelah komputer melakukan POST.

Saya memilih Linux sebagai pilihan karena sangat open terbuka, tersedia seluruh source-code di belantara internet. Buku-buku berkaitan dengan bagaimana secara internal Linux bekerja juga telah banyak beredar. Sehingga Anda yang ingin lebih dalam mempelajarinya dapat dengan mudah tanya mbah guugel mendapatkan informasi. Namun, saya akui bahwa informasi yang cukup mendalam tentang masalah ini masih sangat sedikit, apalagi yang berbahasa Indonesia. Inilah yang memotivasi saya untuk menulis artikel ini.

Boot-up dengan LILO

Dokumen-dokumen yang menjelaskan bagaimana proses sejak tombol ON atau RESET komputer ditekan, sampai Linux mulai berjalan, telah banyak kita jumpai seperti yang tersebut di referensi. Tetapi penjelasan secara detail isi dari source-code sangat amat jarang dijumpai.

Sebagai bahan pembahasan kita, saya memakai LILO yang telah terkenal dipakai oleh banyak distro.

Bagian source-code proses bootup sangat tergantung kepada jenis hardware, ukurannya juga sangat terbatas, dan ditulis dengan bahasa assembly. Artikel ini mengambil contoh source-code untuk PC compatible (intel 386), karena processsor ini memiliki arsitektur yang relatif lebih sederhana di antara sekian banyak prosesor intel. Juga memiliki kompatibilitas dengan prosesor-prosesor terbaru. Sehingga memudahkan kita belajar.

Pada komputer PC kompatibel, setelah RESET, BIOS dijalankan dan LILO menggunakan BIOS tersebut untuk bekerja.

Bab berikut ini membahas bagian proses bootup LILO pada source-code “first.S” dan ”second.S”

Boot Sector

Boot Sector pada suatu disk adalah selalu sektor pertama pada track pertama dari head pertama suatu disk. Ketika komputer dinyalakan (tombol ON) atau direset, BIOS akan mulai berjalan dan melakukan POST (Power On Self Test, test yang dilakukan komputer kepada dirinya sendiri sesaat setelah listrik masuk). BIOS kemudian menginisialisasi data-datanya, kemudian mencari boot sector yang valid. Pertama ia akan mencari di drive A:, kemudian di C:. Jika tidak diketemukannya maka interrupt 18H akan terpanggil, dimana pada komputer PC IBM orisinal, akan menjalankan ROM BASIC. Sebuah boot sector yang valid adalah boot sector yang memiliki nilai “0AA55h” pada offset 510

Ketika BIOS menemukan boot sector yang valid, ia akan membaca sektor tersebut (sebesar 512 Byte) dari disk dan kemudian menuliskannya di memory pada alamat ”0x7C00” kemudian ia akan jump ke alamat ”0x7C00” tersebut dan kode boot sector ini akan menjalankan kontrol komputer selanjutnya.

Mekanisme Pemuatan Kernel oleh LILO

Setiap program yang akan dijalankan oleh komputer harus terlebih dahulu diload atau dipanggil serta dimuat dimemory oleh processor. Linux, sebagaimana sebagian besar sistem operasi, memiliki kernel, yaitu bagian inti dari sistem operasi. Kernel mengatur semua proses penting di dalam sistem operasi. Tanggung-jawab pertama LILO agar Linux dapat berjalan diatas komputer, tentu saja memerintahkan processor untuk memuat kernel Linux ke memori utama.

LILO merupakan singkatan dari Linux Loader, yaitu sebuah program yang pekerjaannya hanya memuat/me-load Linux. Untuk memudahkan kita membaca source-code-nya, kita perlu memahami urutan pekerjaan yang dilakukannya. Di bawah ini adalah urutan pekerjaan secara global yang dilakukan oleh LILO.

1. Bila PC direset, BIOS firmware(software yang diembedkan ke dalam hardware) akan tereksekusi.
2. BIOS melakukan setting awal (inisialisasi)
3. BIOS membaca primary-boot-loader dari sektor pertama di hardisk, kemudian meletakannya (menuliskannya) di memory dengan alamat ”0x7C00”. Namun Multi Boot Loader seperti System Commander, membaca primary-boot-loader di sektor pertama dari partisi Linux.
4. Boot Loader tersebut adalah merupakan salah satu bagian dari LILO, berukuran 512 Byte, yang langsung di-copy ke memory “0x9A000”. Kemudian program akan menjalankan kode di memory “0x9A000” tersebut, dan menset ujung kepala stack menjadi “0x9B000”.
5. Menampilkan “L”
6. Kemudian Secondary Loader sebesar 8 sektor di tulis ke “0x9B000”
7. Bilamana terjadi kegagalan pembacaan maka menampilkan 2 digit kode error dan mencoba kembali proses pembacaan tersebut.
8. Jika berhasil, menampilkan “I”
9. Jump ke Secondary Boot Loader di “0x9B000”.
10. Jika parameter booting diberikan oleh pengguna, maka dilakukan setting port serial dan menuliskan “LI” di port serial tersebut.
11. Secondary Boot Loader memeriksa ujung kepala data, dan bila diketemukan error menampilkan secara terus menerus “?”.
12. Menampilkan “L”
13. Membaca descriptor-table dengan ukuran 2 sektor dari file /boot/map, dan menuliskannya di “0x9D200”. Berikutnya adalah menghitung checksum, dan jika error menampilkan “-” dan berhenti.
14. Membaca tabel konversi keyboard sebesar 1 sektor, dan menuliskannya di “0x9D800”
15. Membaca perintah-perintah command-line default sebesar 1 sektor, dan menuliskannya di “0x9D600”
16. Bila default command-line dalam keadaan enable, maka magic-number dari blok ini yang berukuran 2 Byte, diubah menjadi Membaca tabel konversi keyboard sebesar 1 sektor, dan menuliskannya di “0x6B6D”, dan meng-overwrite sektor asalnya.
17. Menampilkan “0”
18. Jika prompt diset maka akan masuk ke dalam mode interaktif.
19. Ganti baris, dan menampilkan “boot:”
20. Menunggu keyboard ditekan. Bila tidak ada input, tunggu timeout.
21. Boot image untuk startup dipilih. Secara default yang akan dipilih adalah image pertama di dalam lilo.conf.
22. “Loading ” ditampilkan.
23. Bila ukuran file dari RAM disk telah ditentukan maka tabel MAP untuk file ini akan dibaca.
24. Sesuai dengan tabel MAP yang terpilih di atas, maka dibacalah file RAM disk (initrd) dan ditulis pada extended memory (alamat setelah ”0x100000”)
25. Selanjutnya, tabel MAP dari kernel dibaca
26. Sesuai dengan tabel MAP dari kernel tersebut, maka pertama-tama boot sector dari kernel yang asli dan ditulis di alamat ”0x90000”
27. Selanjutnya program setup dari kernel ditulis di alamat “0x90200”
28. Kemudian badan kernel (vmlinuz) ditulis di alamat “0x10000”. Namun dengan catatan bahwa bila kernel dikompilasi supaya ditulis di alamat upper maka badan kernel tersebut akan ditulis pada alamat setelah “0x100000”
29. Akhirnya dengan jump ke alamat “0x90200” maka kontrol berpindah kepada program setup.

Demikianlah gambaran global dari proses booting. Kita akan membahas lebih detail proses-proses tersebut dengan cara membahas satu persatu baris yang ada di 2 file awal dari proses booting yaitu file “first.S” dan ”second.S”

Referensi

[1] Linux Kernel 2.4 Internals, http://www.faqs.org/docs/kernel_2_4/lki.html#toc1
[2] LILO generic boot loader for Linux, Ver.20: User’s Guide, Wener Almesberger
[3] LILO generic boot loader for Linux, Ver.20: Technical overview, Wener Almesberger

No comments: