IO Linux

Salah satu tujuan OS adalah menyembunyikan kerumitan device hardware dari sistem si penggunanya. Contohnya, Virtual File System menyamakan tampilan filesystems yang dimount tanpa memperdulikan devices fisik yang berada di bawahnya. Bab ini akan menjelaskan bagaimana kernel Linux mengatur device fisik di sistem.

Salah satu fitur yang mendasar adalah kernel mengabstraksi penanganan device. Semua device hardware terlihat seperti file pada umumnya: mereka dapat dibuka, ditutup, dibaca, dan ditulis menggunakan calls sistem yang sama dan standar untuk memanipulasi file. Setiap device di sistem direpresentasikan oleh sebuah file khusus device, contohnya disk IDE yang pertama di sistem direpresentasikan dengan /dev/hda. Devices blok (disk) dan karakter dibuat dengan perintah mknod dan untuk menjelaskan device tersebut digunakan nomor devices besar dan kecil. Devices jaringan juga direpresentasikan dengan files khusus device, tapi file ini dibuat oleh Linux setelah Linux menemukan dan menginisialisasi pengontrol-pengontrol jaringan di sistem. Semua device yang dikontrol oleh driver device yang sama memiliki nomor device besar yang umum. Nomor devices kecil digunakan untuk membedakan antara device-device yang berbeda dan pengontrol-pengontrol mereka, contohnya setiap partisi di disk IDE utama punya sebuah nomor device kecil yang berbeda. Jadi, /dev/hda2, yang merupakan partisi kedua dari disk IDE utama, punya nomor besar 3 dan nomor kecil yaitu 2. Linux memetakan file khusus device yang diteruskan ke system call (katakanlah melakukan mount ke sistem file device blok) pada driver si device dengan menggunakan nomor device besar dan sejumlah tabel sistem, contohnya tabel device karakter, chrdevs.

Linux membagi devices ke tiga kelas: devices karakter, devices blok dan devices jaringan.

Device karakter

Device karakter, device paling sederhana dari Linux, diakses sebagai file. Aplikasi menggunakan system calls standar untuk membukanya, membacanya dan menulisnya dan menutupnya persis seolah devices adalah file. Memang benar, meski pun devices ini merupakan modem yang sedang digunakan oleh PPP daemon untuk menghubungkan sistem Linux ke jaringan. Saat sebuah device karakter diinisialisasi, driver devicenya mendaftarkan sang device pada kernel Linux dengan menambahkan sebuah entry ke vektor chrdevs dari struk data device_struct. Pengenal utama devicenya digunakan sebagai indeks ke vektor ini. Pengenal utama untuk suatu device tidak pernah berubah.

Cara Kerja

Setiap entry di vektor chrdevs, sebuah struk data device_struct, mengandung dua elemen: sebuah penunjuk nama dari driver devices yang terdaftar dan sebuah penunjuk ke operasi-operasi file seperti buka, baca, tulis, dan tutup. Isi dari /proc/devices untuk devices karakter diambil dari vektor chrdevs.

Saat sebuah file khusus karakter yang merepresentasikan sebuah devices karakter (contohnya /dev/cua0) dibuka, kernelnya harus mengatur beberapa hal sehingga routine operasi file yang benar dari driver devices karakter akan terpanggil.

Seperti sebuah file atau direktori pada umumnya, setiap file khusus device direpresentasikan dengan sebuah inode VFS. Inode VFS untuk sebuah file khusus karakter tersebut, sebenarnya untuk semua filesystem yang berada dibawahnya, contohnya EXT2. Hal ini terlihat dari informasi di filesystem yang sebenarnya ketika nama file khusus device dilihat.

Setiap inode VFS memiliki keterkaitan dengan seperangkat operasi file dan operasi-operasi ini berbeda tergantung pada objek filesystem yang direpresentasikan oleh inode tersebut. Kapan pun sebuah VFS yang merepsentasikan file khusus karakter dibuat, operasi-operasi filenya diset ke operasi device karakter default.

VFS inode memiliki hanya satu operasi file, yaitu operasi membuka file. Saat file khusus karakter dibuka oleh sebuah aplikasi, operasi buka file yang umum atau generik menggunakan pengenal utama dari device tersebut. Pengenal ini digunakan sebagai index ke vektor chrdevs untuk memperoleh blok operasi file untuk device tertentu ini. Ia juga membangun struk data file yang menjelaskan file khusus karakter ini, yang membuat penunjuk operasi file menunjuk ke driver device itu. Setelah itu semua aplikasi dari operasi-operasi file aplikasi akan dipetakan untuk memanggil perangkat devices karakter dari operasi file itu.

Device blok

Device ini pun diakses seperti file. Mekanisme untuk menyediakan perangkat operasi file yang benar bagi file khusus blok yang terbuka sama seperti devices karakter. Linux memelihara operasi dari perangkat device blok yang terdaftar sebagai vektor blkdevs. Vektor ini, seperti halnya vektor chrdevs, diindeks dengan menggunakan nomor device besar dari sang device. Entrynya juga merupakan struk data device_struct. Tidak seperti devices karakter, ada sejumlah kelas yang dimiliki device blok. Device-device SCSI adalah salah satu kelasnya dan device IDE adalah kelas lainnya. Kelaslah yang mendaftarkan dirinya sendiri pada kernel Linux dan menyediakan operasi file kepada kernel. Driver-driver device untuk sebuah kelas device blok menyediakan interface khusus kelas kepada kelas tersebut. Jadi, contohnya, sebuah driver device SCSI harus menyediakan interface untuk subsistem SCSI agar dapat menyediakan operasi file bagi devices ini ke kernel.

Cara Kerja

Setiap driver device blok harus menyediakan sebuah interface ke cache buffernya, demikian pula interface operasi umum file. Setiap driver device blok mengisi entrynya di vektor blk_dev dari struk data blk_dev_struct. Indeksnya ke vektor ini, lagi-lagi, nomor utama devicenya. Struk data blk_dev_struct mengandung alamat routine permintaan dan sebuah penunjuk ke sekumpulan struk data request,yang masing-masingnya merepresentasikan sebuah request dari cache buffernya untuk driver untuk membaca atau menulis atau menulis satu blok data.

Setiap kali cache buffer ingin membaca dari, atau pun menuliskan satu blok data ke device terdaftar, ia menambahkan struk data request kedalam blk_dev_struct nya. Gambar di atas ini menunjukkan bahwa setiap request memiliki pointer (penunjuk) ke satu atau lebih struk data buffer_head. Masing-masingnya merupakan suatu request untuk membaca atau menulis sebuah blok data. Struk buffer_head tersebut dikunci (oleh cache buffer) dan mungkin ada suatu proses yang menunggu buffer ini selesai di operasi blok tersebut. Setiap struk request dialokasikan dari suatu daftar yang statik, yaitu daftar all_request. Jika proses tersebut sedang dimasukkan sebuah ke list request yang kosong, fungsi request dari drivernya akan dipanggil agar memulai proses antrian request. Jika tidak driver tersebut hanya akan memproses setiap request di daftar request.

Sekali driver device telah menyelesaikan sebuah request, ia harus membuang setiap stuk buffer_request dari struk requestnya, kemudian mencapnya up to date dan membuka kuncinya. Pembukaan kunci buffer_head akan membangunkan proses apa pun yang tidur akibat menunggu operasi blok selesai. Contoh dari kasus ini misalnya dimana sebuah nama file sedang ditangani dan filesystem EXT2 harus membaca blok data yang mengandung entry direktori EXT2 berikutnya dari device blok yang menyimpan filesystem tersebut. Proses ini tidur di buffer_head yang akan mengandung entri direktorinya sampai driver devicenya membangunkannya. Struk data request tersebut ditandai bebas sehingga ia dapat digunakan di request blok lainnya.

Device jaringan

Device jaringan merupakan sebuah entity yang mengirimkan dan menerima paket-paket data. Biasanya ia merupakan device fisik seperti kartu ethernet. Beberapa devices jaringan bagaimana pun hanyalah software, seperti device loopback yang digunakan untuk mengirimkan data ke Anda. Setiap device direpresentasikan dengan struk data device. Driver device jaringan mendaftarkan device-device yang ia kontrol pada Linux selama inisialisasi jaringan yaitu saat kernel melakukan booting. Struk data device tersebut berisi informasi mengenai device dan alamat fungsi-fungsi yang memungkinkan bermacam-macam protokol jaringan menggunakan layanan dari device tersebut. Fungsi-fungsi ini kebanyakan terkait dengan mentransmisikan data dengan menggunakan device jaringan. Device tersebut menggunakan mekanisme pendukung jaringan standar untuk melewatkan data yang diterima sampai ke lapisan protokol yang semestinya. Semua data jaringan atau paket yang ditransmisikan dan diterima, direpresentasikan dengan struk-struk data sk_buff. Struk-struk data yang bersifat fleksibel ini memungkinkan header-header protokol jaringan menjadi mudah ditambahkan dan dibuang. Bagian ini hanya memfokuskan pada struk data device serta bagaimana jaringan ditemukan dan diinsialisasi.

Struk data device ini mengandung informasi tentang device jaringan :

Nama

Berbeda dengan device karakter dan blok yang menggunakan file khusus device yang dibuat dengan perintah mknod, file khusus device terlihat sekilas seperti device jaringan sistem yang ditemukan dan diinsialisasi. Nama mereka standar, yaitu setiap nama merepsentasikan jenis device masing-masing. Device multiple dari jenis yang sama dinomori lebih besar dari 0. Oleh sebab itu device-device ethernet dikenal sebagai /dev/eth0, /dev/eth1, /dev/eth2 dan seterusnya.

Beberapa device jaringan yang umum adalah

  • /dev/ethN Device ethernet

  • /dev/slN Device SLIP

  • /dev/pppN Device PPP

  • /dev/lo Device Loopback

Informasi bus

Berikut ini adalah informasi yang driver device butuhkan untuk mengontrol devicenya. Nomor irq merupakan interrupt yang digunakan oleh device ini. Alamat basisnya adalah alamat dari segala register status dan control dari device yang ada di memori I/O. Channel DMA adalah nomor DMA yang device jaringan ini gunakan. Semua informasi ini diset pada waktu booting, yaitu saat device ini diinisialisasi.

Flags interface

Hal-hal berikut ini akan menjelaskan karakteristik dan kemampuan dari device jaringan:

  • IFF_UP Interface bangkit dan berjalan,

  • IFF_BROADCAST Alamat broadcast di device adalah sah

  • IFF_DEBUG Penghilangan error dinyalakan

  • IFF_LOOPBACK Merupakan device loopback

  • IFF_POINTTOPOINT Merupakan link point to point (SLIP dan PPP)

  • IFF_NOTRAILERS Tidak ada pengangkut jaringan

  • IFF_RUNNING Sumberdaya yang dialokasikan

  • IFF_NOARP Tidak mendukung protokol ARP

  • IFF_PROMISC Device di mode penerimaan acak, ia akan menerima semua paket tanpa memperdulikan kemana paket-paket ini dialamatkan

  • IFF_ALLMULTI Menerima seluruh frame multicast IP

  • IFF_MULTICAST Dapat menerima frame multicast IP

Informasi protokol

Setiap device menjelaskan bagaimana ia digunakan oleh lapisan protokol jaringan.

mtu

Ukuran paket terbesar yang jaringan dapat kirim, tidak termasuk header lapisan link yang ia perlu tambahkan.

Keluarga

Keluarga ini menandakan bahwa keluarga protokol yang dapat didukung oleh device tersebut. Keluarga untuk seluruh device jaringan Linux adalah AF_INET, keluarga alamat internet.

Jenis

Jenis menjelaskan media di mana device jaringan terpasang. Ada banyak jenis media yang didukung oleh device jaringan Linux. Termasuk diantaranya adalah Ethernet, X.25, Token Ring, Slip, PPP dan Apple Localtalk.

Alamat

Struk data device tersebut memiliki sejumlah alamat yang relevan bagi device jaringan ini, termasuk alamat-alamat IP-nya.

Antrian paket

Merupakan antrian paket-paket sk_buff yang antri menunggu untuk dikirmkan lewat device jaringan ini.

Fungsi pendukung

Setiap device menyediakan seperangkat routine standar yang lapisan-lapisan protokol sebut sebagai bagian dari interface mereka ke lapisan link device ini. Hal ini termasuk pembuatannya dan routine-routine pengirim frame dan routine-routine penambah header standar dan pengumpul statistik. Statistik ini bisa dilihat dengan memakai perintah ifconfig.