Saturday, December 20, 2008

Bagaimana cara akses hardware (IRQ & DMA) di Linux dari user space...

Itu pertanyaan yang di tanyakan teman saya ketika sedang memprogram Counter Timer (Intel 8254) untuk perangkat embedded kami, teman saya menggunakan DOS versi Windows 98. DOS adalah OS yang bukan multi-tasking, artinya hanya ada satu proses yang dapat di tangani oleh CPU dalam setiap waktu, tidak ada proteksi dengan memory hardware, program yang sedang berjalan memegang kendali semua resource sistem dan dapat mengakses memori sistem dari mana saja. Karena pada dasarnya Linux adalah sistem yang multi-tasking, akses langsung dari hardware secara fisik tidak diperbolehkan. Sangat berbahaya, bagaimana jika proses (program) lain sedang menulis pada sebuah port yang pada saat bersamaan (concurrently) sedang di akses juga oleh proses lainnya?. Low level memori hardware di proteksi oleh Kernel, proses harus menginstruksikan Kernel untuk mengakses, dengan system call.

Bagaimana dengan Real Time I/O? Sekali lagi karena multi-tasking Linux, proses tidak secara langsung akan di kerjakan oleh Kernel pada saat itu juga, kernel Linux harus menjaga performa sistem dan tidak menitik beratkan hanya pada suatu proses. Linux mengimplementasi ini dengan membuat antrian proses atau Process Scheduler dan IO Scheduler untuk operasi I/O. Dalam Kernel standar Linux selalu ada jeda untuk suatu proses atau operasi I/O, teori untuk operasi I/O port selalu lebih dari 10 ms (micro seconds). Jadi jika teman saya ini ingin membuat program timer itu di Linux dan sangat membutuhkan presisi waktu (Real Time) mungkin dia harus menggunakan kernel yang di desain untuk pekerjaan-pekerjaan Real Time, atau meng-hack sendiri kernel tersebut, coz im being lazy to answer all of this everytime ;)