Difference between revisions of "OS: Linux Kernel"
Onnowpurbo (talk | contribs) |
Onnowpurbo (talk | contribs) |
||
(65 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
− | Sebuah kernel UNIX adalah interpreter yang menerjemahkan panggilan system call tingkat pengguna akses yang disinkronisasi ke hardware dan device driver. Panggilan didefinisikan oleh standar POSIX. | + | Sebuah kernel [[UNIX]] adalah [[interpreter]] yang menerjemahkan panggilan system call tingkat pengguna akses yang disinkronisasi ke [[hardware]] dan [[device driver]]. Panggilan didefinisikan oleh standar [[POSIX]]. |
− | Interpreter mengelola permintaan system call tingkat pengguna untuk mengakses file atau proses. Kernel scheduler memungkinkan UNIX untuk mengatur subsistem file dan proses. Subsistem file bekerja dengan perangkat device raw atau block device. Subsistem Proses mengelola sinkronisasi process, komunikasi antar-proses, manajemen memori dan penjadwalan proses. | + | [[Interpreter]] mengelola permintaan system call tingkat pengguna untuk mengakses [[file]] atau proses. [[Kernel scheduler]] memungkinkan [[UNIX]] untuk mengatur subsistem file dan proses. Subsistem file bekerja dengan perangkat device raw atau block device. Subsistem Proses mengelola sinkronisasi process, komunikasi antar-proses, manajemen memori dan penjadwalan proses. |
− | Kernel mengelola melalui penggunaan dua struktur | + | [[Kernel]] mengelola melalui penggunaan dua struktur penting yaitu, tabel proses dan struktur pengguna. Tabel proses berisi parameter penjadwalan, gambar memori, sinyal dan kondisi proses lainnya. Struktur pengguna termasuk registri mesin, kondisi system call , tabel file descriptor, akunting dan stack kernel. |
==Tour Linux Kernel Source== | ==Tour Linux Kernel Source== | ||
Line 9: | Line 9: | ||
Oleh Alessandro Rubini, rubini@pop.systemy.it | Oleh Alessandro Rubini, rubini@pop.systemy.it | ||
− | Bagian ini mencoba untuk menjelaskan source code Linux secara teratur, mencoba membantu pembaca untuk mencapai pemahaman yang baik tentang bagaimana source code diletakkan dan bagaimana fitur unix yang paling relevan diimplementasikan. Targetnya adalah untuk membantu programmer C berpengalaman yang tidak terbiasa dengan Linux dalam mendapatkan akrab dengan desain Linux secara keseluruhan. Itulah sebabnya entry point yang dipilih untuk tur kernel adalah entry point kernel sendiri: sistem boot. | + | Bagian ini mencoba untuk menjelaskan [[source code]] [[Linux]] secara teratur, mencoba membantu pembaca untuk mencapai pemahaman yang baik tentang bagaimana [[source code]] diletakkan dan bagaimana fitur unix yang paling relevan diimplementasikan. Targetnya adalah untuk membantu programmer C berpengalaman yang tidak terbiasa dengan [[Linux]] dalam mendapatkan akrab dengan desain Linux secara keseluruhan. Itulah sebabnya entry point yang dipilih untuk tur kernel adalah entry point kernel sendiri: sistem boot. |
Pemahaman yang baik tentang bahasa C diperlukan untuk memahami materi, serta familiar dengan konsep Unix dan arsitektur PC. Namun, tidak ada kode C akan muncul dalam bagian ini, melainkan pointer ke source code sebenarnya. Bagian ini cenderung untuk memberikan gambaran informal. | Pemahaman yang baik tentang bahasa C diperlukan untuk memahami materi, serta familiar dengan konsep Unix dan arsitektur PC. Namun, tidak ada kode C akan muncul dalam bagian ini, melainkan pointer ke source code sebenarnya. Bagian ini cenderung untuk memberikan gambaran informal. | ||
Line 54: | Line 54: | ||
Proses init akan berusaha untuk menjalankan /etc/init, atau /bin/init, atau /sbin/init. | Proses init akan berusaha untuk menjalankan /etc/init, atau /bin/init, atau /sbin/init. | ||
− | Jika tidak ada yang berhasil, code akan menjalankan | + | Jika tidak ada yang berhasil, code akan menjalankan "/bin/sh /etc/rc" dan fork root shell di terminal pertama. Code ini digunakan sejak Linux 0.01, saat itu sistem operasi hanya berupa kernel saja, dan proses tanpa login tersedia. |
Setelah exec() program init dari salah satu lokasi standard (kita asumsikan kita memiliki salah satunya), kernel tidak punya kontrol secara langsung terhadap aliran program. Fungsi kernel, selanjutnya adalah untuk memfasilitasi proses melalui system call, juga memberikan layanan untuk kejadian asinkron (seperti interupsi hardware). Multitasking sudah di setip, dan selanjutnya init akan memanaje akses multiuser melalui fork() system daemon dan proses login. | Setelah exec() program init dari salah satu lokasi standard (kita asumsikan kita memiliki salah satunya), kernel tidak punya kontrol secara langsung terhadap aliran program. Fungsi kernel, selanjutnya adalah untuk memfasilitasi proses melalui system call, juga memberikan layanan untuk kejadian asinkron (seperti interupsi hardware). Multitasking sudah di setip, dan selanjutnya init akan memanaje akses multiuser melalui fork() system daemon dan proses login. | ||
− | Karena kernel bertanggung jawab untuk memberikan layanan, pembahasan ini akan dilanjutkan dengan melihat pada layanan tersebut (yaitu | + | Karena kernel bertanggung jawab untuk memberikan layanan, pembahasan ini akan dilanjutkan dengan melihat pada layanan tersebut (yaitu "system calls"), juga memberikan gambaran umum tentang struktur data di bawahnya maupun organisasi dari code. |
− | ===Bagaimana Kernel | + | ===Bagaimana Kernel Melihat Proses=== |
− | Dari | + | Dari sudut pandang kernel, sebuah proses tidak lebih dari sebuah entry pada tabel proses. |
Oleh karenanya, tabel process adalah salah satu tabel paling penting dalam struktur data di system, bersama dengan tabel memory-management dan buffer cache. Satu-satunya hal (item) yang di simpan di tabel proses adalah struktur task_struct, lumayan besar sekali, di definisikan di definisikan di include/linux/sched.h. Dalam task_struct baik informasi low-level dan high-level disimpan -- mulai dari copy dari register hardware hingga inode dari directory tempat beroperasinya proses. | Oleh karenanya, tabel process adalah salah satu tabel paling penting dalam struktur data di system, bersama dengan tabel memory-management dan buffer cache. Satu-satunya hal (item) yang di simpan di tabel proses adalah struktur task_struct, lumayan besar sekali, di definisikan di definisikan di include/linux/sched.h. Dalam task_struct baik informasi low-level dan high-level disimpan -- mulai dari copy dari register hardware hingga inode dari directory tempat beroperasinya proses. | ||
Line 82: | Line 82: | ||
Fork relatif mudah, dan fork.c lumayan pendek dan sangat mudah untuk dimengerti. Tugas utamanya adalah mengisi struktur data dari proses baru. Langkah yang dilakukan, selain mengisi kolom, adalah: | Fork relatif mudah, dan fork.c lumayan pendek dan sangat mudah untuk dimengerti. Tugas utamanya adalah mengisi struktur data dari proses baru. Langkah yang dilakukan, selain mengisi kolom, adalah: | ||
− | + | * Mengambil page yang free untuk meletakan task_struct | |
− | + | * Mencari slot proses yang kosong (find_empty_process()) | |
− | + | * Mengambil page yang free untuk kernel_stack_page | |
− | + | * Copy LDT bapak ke anak | |
− | + | * Duplikasi informasi mmap ke bapak | |
− | sys_fork() | + | sys_fork() juga memanaje deskripsi file dan inode. |
− | + | Kernel 1.0 memberikan dukungan vestigial untuk threading, dan fork() system call akan menunjukan beberapa hal untuk itu. Kernel thread adalah work-in-progress diluar kernel utama. | |
− | + | Keluar dari sebuah proses lebih triky, karena proses parent harus diberitahu akan adanya child yang berjalan. Tambah lagi, sebuah proses dapat exit jika di kill() oleh proses lain (hal ini adalah fitur Unix). File exit.c oleh karenanya merupakan tempat dari sys_kill() dan berbagai jenis sys_wait(), selain dari sys_exit(). | |
− | + | Code dari exit.c tidak akan diterangkan disini -- karena tidak terlalu menarik. Intinya dia akan menangani dari perintah untuk keluar dari system secara konsisten. Standard POSIX, akan secara detail menerangkan tentang berbagai sinyal yang harus di tangani dalam proses keluar tersebut. | |
===Menjalankan Program=== | ===Menjalankan Program=== | ||
+ | Setelah menjalankan fork(), dua copy dari program yang sama akan jalan. Salah satu diantaranya biasanya akan meng-exec() program yang lain. System call exec() harus menemukan lokasi dari image binary dari file executable, me-load dan men-jalan-kannya. Kata "load" disini boleh tentu berarti "copy binary image ke memory", karena Linux mendukung demand loading. | ||
− | + | Implementasi exec() di Linux mendukung beberapa format binary. Hal ini dapat dicapai melalui struktur linux_binfmt, dimana ada dua pointer ke fungsi -- satu untuk load executable dan yang lain untuk load library, setiap format binary me-representasikan executable maupun library. Loading dari shared library di implementasikan di source file yang sama dengan exec(), untuk sekarang kita fokus ke exec() saja. | |
− | + | Unix system memberikan programmer enam pola dari fungsi exec(). Semua kecuali satu dapat di implementasikan sebagai fungsi library, kernel Linux mengimplementasikan sys_execve() sendiri. Dia menjalankan tugas yang sangat sederhana, yaitu, load head dari executable, dan mencoba meng-execute-nya. Jika dua byte pertama adalah "#!", maka kalimat pertama akan di parsing dan interpreter akan di jalankan, selain itu format binary yang terdaftar akan berusaha di coba dijalankan. | |
− | + | Format Linux asli didukung secara langsung dalam fs/exec.c, dan fungsi yang relevan akan me-load binary aout_dan load library aout. Untuk binary, fungsi loading dari executable "a.out" akan berujung pada mmap() ke file disk, atau call read_exec(). mmap() digunakan oleh Linux jika dibutuhkan mekanisme loading ke page memory program saat di akses, sedangkan read_exec() digunakan jika memory mapping tidak didukung oleh filesystem host (contoh filesystem "msdos") | |
− | + | Kernel 1.1 memasukan revisi filesystem msdos, yang mendukung mmap(). Di samping itu, struct linux_binfmt menjadi linked list bukan sekedar array, untuk memungkinkan loading format binary baru sebagai kernel modul. Selanjutnya, structure yang ada juga di kembangkan untuk mengakses route core-dump yang berhubungan dengan format. | |
− | |||
− | |||
===Akses ke File System=== | ===Akses ke File System=== | ||
− | + | Kita semua tahu bahwa filesystem adalah sumber daya paling dasar dalam system Uniux, sangat mendasar dan ubiquitous sehingga membutuhkan nama yang mudah di ingat - untuk memudahkan kita akan menggunakan singkatan sederhana "fs". | |
− | + | Disini akan di asumsikan bahwa pembaca mengerti dasar fs Unix -- ijin akses, inode, superblock, mount dan umount. Konsep ini banyak di terangkan di literatur Unix lainnya. Kita akan banyak membahas isu spesifik fs di Linux. | |
− | + | Unix awal biasanya mendukung satu tipe fs saja, yang strukturnya tersebar dalam seluruh kernel. Pada hari ini, kita menggunakan interface standard antara kernel dengan fs, agar memudahkan pertukaran data pada berbagai arsitektur. Linux memberikan lapisan standard untuk menyampaikan informasi antara kernel dengan modul fs. Lapisan interface ini biasanya di sebut VFS, untuk "virtual filesystem". | |
− | + | Code filesystem oleh karenanya biasanya di pecah menjadi dua lapisan: lapisan atas memfokuskan diri pada manajemen dari tabel kernel dan struktur data, sedangkan lapisan bawah terdiri dari sekumpulan fungsi yang fs-dependent, yang di akses melalui struktur data VFS. Semua bagian yang fs-independent berada di file fs/*.c. Mereka menangani isu berikut ini: | |
− | + | * Manaje buffer chache (buffer.c); | |
− | + | * Respond ke system call fcntl() dan ioctl() (fcntl.c dan ioctl.c); | |
− | + | * Memetakan pipe dan fifo pada inode dan buffer (fifo.c, pipe.c); | |
− | + | * Manaje tabel file and inode (file_table.c, inode.c); | |
− | + | * Lock dan unlock file dan record (locks.c); | |
− | + | * Memetakan name ke inode (namei.c, open.c); | |
− | + | * Implementasi fungsi select() (select.c) yang tricky; | |
− | + | * Memberikan informasi (stat.c); | |
− | + | * mount dan umount filesystem (super.c); | |
− | + | * exec() executable dan dump core (exec.c); | |
− | + | * Load berbagai format binary (bin_fmt*.c, seperti diterangkan diatas). | |
− | + | Interface VFS, terdiri dari sekumpulan operasi high-level yang di kerjakan oleh code fs-independent dan di lakukan oleh setiap tipe filesystem. Struktur yang paling relevan adalah inode_operations dan file_operations, meskipun mereka tidak sendiri karena beberapa struktur lain juga ada. Seluruh struktur di definisikan dalam include/linux/fs.h. | |
− | + | Pintu masuk dalam kernel ke file system yang sebenarnya ada di struktur file_system_type. Array file_system_types terdapat dalam fs/filesystems.c dan digunakan saat perintah mount diberikan. Fungsi read_super dari tipe fs yang relevan akan bertanggung jawab untuk mengisi struct super_block, yang akhirnya juga mengisi struct super_operations dan struct type_sb_info. struct super_operations memberikan pointer untuk operasi fs yang generik untuk fs-type current, struct type_sb_info memberikan informasi yang lebih spesifik tentang fs-type. | |
− | + | Array tipe filesystem sudah menjadi linked list, untuk membuka kemungkinan load tipe fs baru sebagai kernel module. Fungsi (un-)register_filesystem di masukan dalam fs/super.c. | |
===Anatomi dari Tipe File System=== | ===Anatomi dari Tipe File System=== | ||
− | + | Tugas dari filesystem type adalah untuk menjalankan tugas low-level yang di petakan ke operasi VFS yang lebih high level pada media fisik (disk, networ atau apa saja). Interface VFS cukup flexibel untuk mendukung filesystem Unix konvensional maupun yang tidak konvensional seperti msdos dan umsdos. | |
− | + | Setiap fs-type dibangun oleh hal berikut, di samping directory sendiri: | |
− | + | * Entry ke array file_systems[] (fs/filesystems.c); | |
− | + | * include file superblock (include/linux/type_fs_sb.h); | |
− | + | * include file inode (include/linux/type_fs_i.h); | |
− | + | * include file generic (include/linux/type_fs.h}); | |
− | + | * Dua #include dalam include/linux/fs.h, termasuk entry struct super_block dan struct inode. | |
− | + | Directory yang dimiliki oleh fs type berisi semua code, yang bertanggung jawab terhadap inode dan data management. | |
− | + | Untuk melihat dari dekat bagaimana low-level code dan interface VFS bekerja untuk fs type ada baiknya memnaca procfs. Source code fs/procfs cukup mudah dibaca. | |
− | + | Selanjutnya kita akan mencoba melihat mekanisme kerja di dalam VFS, minix filesystem akan digunakan sebagai contoh. minix type dipilih karena relatif kecil tapi cukup komplit; di samping itu, fs type linux lainnya diturunkan dari minix. ext2 type jauh lebih komplex mungkin bisa menjadi pelajaran bagi pembaca yang cukup tekun. | |
− | + | Pada saat minix-fs di mount, minix_akan membaca read_super dan mengisi struktur super_block dengan data yang dibaca dari device yang di mount. Parameter s_op dalam struktur tersebut akan menyimpan pointer ke minix_sops, yang digunakan oleh code filesystem generik yang dijalankan oleh operasi superblock. | |
− | + | Mengkaitkan fs yang baru saja di mount ke sistem tree global bergantung pada data berikut (asumsinya sb adalah struktur super_block dan dir_i point ke inode untuk mount point): | |
− | sb->s_mounted | + | sb->s_mounted point ke root-dir inode dari mounted filesystem (MINIX_ROOT_INO); |
− | dir_i->i_mount | + | dir_i->i_mount menyimpan sb->s_mounted; |
− | sb->s_covered | + | sb->s_covered menyimpan dir_i |
− | + | Umount dapat dilakukan oleh do_umount, yang akan menjalankan minix_put_super. | |
− | + | Jika sebuah file di akses, minix_read_inode akan mulai bekerja; dia akan mengisi system-wide struktur inode dengan field dari minix_inode. Field inode->i_op akan di isi sesuai dengan inode->i_mode dan dia akan bertanggung jawab akan operasi selanjutnya pada file tersebut. Source untuk fungsi minix yang baru saja dijelasnkan dapat dilihat di fs/minix/inode.c. | |
− | + | Struktur inode_operations digunakan untuk menjalankan operasi inode ke fungsi kernel yang spesifik fs-type; entry pertama di struktur adalah pointer ke item file_operations, yang equivalen dengan data-management dari i_op. minix fs-type mengijinkan tiga instance dari inode-operation (untuk directori, untuk file dan untuk symbolic link) dan dua instance dari file-operation (symlinks tidak memerlukan hal ini). | |
− | + | Operasi directori (minix_readdir) dapat ditemukan di fs/minix/dir.c; operasi file (read dan write) ada di fs/minix/file.c dan operasi symlink (reading dan following link) ada di fs/minix/symlink.c. | |
− | + | Selebihnya dari minix directory mengimplementasikan tugas berikut: | |
− | + | * bitmap.c mengatur alokasi dan pembebasan inode dan block (pada ext2 fs, hal ini dilakukan pada dua source file yang berbeda); | |
− | + | * fsynk.c bertanggung jawab untuk system call fsync() -- dia mengatur block direct, indirect dan double indirect (ini merupakan bagian dari pengetahuan umum Unix); | |
− | + | * namei.c berisi semua operasi nama pada inode, seperti membuat dan memhancurkan node, rename dan links; | |
− | + | * truncate.c menjalankan pemotongan (truncatin) dari file. | |
− | === | + | ===console driver=== |
− | + | Karena merupakan I/O device utama di sebagian besar Linux, console driver perlu memperoleh perhatian lebih. Source code dari console, maupun berbagai karakter driver, dapat ditemukan pada drivers/char, dan kita akan menggunakan directory tersebut sebagai titik referensi ketika melakukan penamaan file. | |
− | Console | + | Inisialisasi Console dilakukan oleh fungsi tty_init(), di tty_io.c. Fungsi bertanggung jawab untuk memperoleh nomor device dan memanggil fungsi init untuk masing-masing device. con_init(), yang kemudian menghubungkan ke console, dan berada console.c. |
− | + | Inisialisasi console telah berubah lumayan banyak pada evolusi 1.1. console_init() dilepas dari tty_init(), dan dapat di panggil secara langsung oleh ../../main.c. Virtual console dialokasikan secara dinamis. | |
− | |||
− | + | ===Write ke console=== | |
− | + | Jika console device di tulis, fungsi con_write akan di jalankan. Fungsi ini mengatur semua control karakter dan escape sequences yang digunakan oleh aplikasi untuk memperoleh manajemen layar (screen) secara lengkap. escape sequence yang di implementasikan adalah milik terminal vt102; Hal ini berarti bahwa environment kita perlu di set TERM=vt102 jika kita melakukan telnet ke host non-Linux; untuk aktifitas lokal, lebih baik menggunakan TERM=console karena console Linux memberikan fungsi superset dari vt102. | |
− | + | con_write(), sebagian besar merupakan pernyataan nested switch, yang digunakan untuk meng-handel finite state automaton yang meng-interpretasikan escape sequences karakter satu per satu. Saat mode normal, character yang di cetak akan di tulis secara langsung ke memory video, menggunakan current attr-ibute. Dalam console.c, semua field struct vc dapat di akses melalui macro, oleh karenanya referensi ke (contoh) attr, sebetulnya me-refer ke field di struktur vc_cons[currcons], selama currcons adalah nomor dari console yang di referensikan. | |
− | + | Sebetulnya, vc_cons di kernel yang baru, tidak lagi berupa array dari struktur, dia berupa array dari pointer yang isinya di kmalloc() -kan. Penggunaan macro sangat menyederhanakan perubahan yang dilakukan, karena sebagian besar code tidak perlu di tulis ulang. | |
− | + | mapping dan unmapping dari console memory ke screen dilakukan oleh fungsi set_scrmem() (yang mengcopy data dari buffer console ke video memory) dan get_scrmem (yang mengcopydata kembali ke buffer console). buffer private dari current console secara fisik di map ke video RAM, untuk meminimalkan jumlah data yang perlu di transfer. Hal ini berarti, get- dan set-_scrmem() secara statik ada di console.c dan di panggil hanya saat console switch. | |
− | + | ===Read console=== | |
− | + | Membaca (read) console dilakukan melalui line-discipline. default (dan unique) line discipline di Linux di kenal sebagai tty_ldisc_N_TTY. line discipline adalah "men-displin input melalui line". Ini merupakan tabel fungsi, yang fokus untuk membaca device. Dengan di bantu oleh flag termios, line discipline mengontrol input dari tty: raw, cbreak dan cooked mode; select(); ioctl() dan sebagainya. | |
− | + | Fungsi read di line discipline di sebut read_chan(), yang akan membaca which tty buffer secara independent dari masukan yang ada. Alasannya, karena masuknya karakter melalui tty di tangani oleh interupsi hardware secara asinkron. | |
− | + | Line discipline N_TTY dapat ditemukan di tty_io.c, kernel selanjutnya akan menggunakan source file n_tty.c yang berbeda. | |
− | + | Bagian paling bawah dari console input adalah bagian dari manajemen keyboard, dan oleh karenanya akan di tangani dalam keyboard.c, dalam fungsi keyboard_interrupt(). | |
− | + | ===Manajemen Keyboard=== | |
− | + | Majamen Keyboard cukup membuat kepala pusing. Oleh karenanya dia dibatasi di file keyboard.c, yang berisi banyak angka hexadecimal yang merepresentasikan banyak kode keyboard yang muncul di keyboard dari berbagai pembuat keyboard. | |
− | + | Bagi pembaca yang sangat tertarik dengan Linux keyboard, cara terbaik untuk membaca keyboard.c adalah mulai dari kalimat terakhir ke atas. Detail pada tingkat yang paling rendah terutama pada setengah pertama dari file tersebut. | |
− | + | ===Switching current console=== | |
− | |||
− | + | current console di switch dengan cara mengaktifkan fungsi change_console(), yang berada di tty_io.c dan di aktifkan oleh keyboard.c dan vt.c (sebelumnya console switch untuk meresponds tombol keyboard yang di tekan, belakangan jika program me-request dengan cara memanggil ioctl()). | |
− | + | Proses switch yang sebenarnya dilakukan dalam dua langkah, dan fungsi complete_change_console() yang menangani langkah ke dua. Membagi switch berarti untuk menyelesaikan sebuah tugas sesudah terjadi handshake dengan proses yang mengontrol tty sesudah kita tinggalkan. Jika console tidak di bawah kontrol proses, call ke change_console() akan di selesaikan oleh complete_change_console() sendiri. Intervensi proses diperlukan untuk bisa melakukan switch secara baik antara console grafik dengan text dan sebaliknya, dan pada server X (sebagai contoh) dia akan mengontrol sendiri console grafik-nya. | |
− | + | ===Mekanisme seleksi (selection)=== | |
− | + | "selection" adalah fasilitas cut and paste untuk text console di Linux. Mekanisme ini biasanya di tangani oleh proses pada user-level, yang biasanya di inisiasi oleh selection atau gpm. Program pada user-level menggunakan ioctl() pada console untuk memberitahukan pada kernel untuk meng-highlight bagian pada layar. Text yang di select, kemudian akan di copy ke selection buffer. buffer ini merupakan entitas statik di console.c. Paste text dilakukan secara "manual" mem-push karakter di antrian tty input. Seluruh mekanisme selection di proteksi oleh #ifdef sehingga user dapat men-disable-nya saat konfigurasi kernel untuk menghemat beberapa kilobyte dari RAM. | |
− | |||
− | + | Selection adalah fasilitas yang sangat low-level, dan dia bekerja secara tersembunyi dari aktifitas kernel lainnya. Hal ini berarti #ifdef hanya menghilangkan highlight sebelum screen di modifikasi. | |
− | + | Kernel yang baru mempunyai code yang lebih baik untuk selection, dan pointer mouse dapat di highlight secara independent oleh text yang di select. Selanjutnya, sejak versi 1.1.73 dan seterusnya digunakan dynamic buffer untuk text yang dipilih, membuat kernel 4kB lebih kecil. | |
− | + | ===ioctl() dari device=== | |
− | |||
− | + | System call ioctl() merupakan pintu masuk untuk proses user untuk mengontrol perilaku sebuah file device. Manajemen ioctl di-spawn oleh ../../fs/ioctl.c, dimana sys_ioctl() yang sebenarnya berada. Permohonan standard ioctl akan ditangani di situ, permohonan yang berhubungan dengan file akan di proses oleh file_ioctl() (di source file yang sama), sedangkan proses lainnya akan di proses oleh fungsi ioctl() yang spesifik untuk device tersebut. | |
− | + | Bahan-bahan ioctl untuk console device berada di vt.c, karena console driver akan mengirimkan ioctl requests ke vt_ioctl(). | |
− | |||
− | + | Materi tentang ioctl cukup memusingkan kepala. Beberapa request berhubungan dengan device, dan beberapa lagi berhubungan dengan line discipline. | |
− | + | Fitur pada kernel 1.1.7x ke atas: tty_ioctl.c mengimplementasikan line discipline request (dengan nama n_tty_ioctl(), yang merupakan fungsi n_tty satu-satunya yang berada di luar n_tty.c), sementara file_operations field menunjuk ke tty_ioctl() di tty_io.c. Jika nomor request tidak dapat di tangani oleh tty_ioctl(), dia akan meneruskan ke tty->driver.ioctl atau, jika dia gagal, ke tty->ldisc.ioctl. Berbagai hal yang berkenaan dengan driver untuk console dapat ditemukan di vt.c, sementara material line discipline di tty_ioctl.c. | |
− | + | Request TIOCLINUX adalah device-independent code. Artinya, console selection dapat di set oleh ioctl dari tty manapun (set_selection() selalu beroperasi di console foreground), dan ini merupakan salah satu security hole di Linux lama. Maka pada Linux yang baru, hanya superuser yang dapat menangani selection. | |
− | |||
− | + | Ada banyak jenis request yang di berikan console device, dan cara terbaik untuk mengetahui-nya adalah melihat isi file vt.c. | |
− | + | ==Referensi== | |
− | + | * http://www.tldp.org/LDP/khg/HyperNews/get/tour/tour.html | |
− | + | ==Pranala Menarik== | |
− | + | * [[Linux]] | |
+ | * [[Ubuntu]] | ||
+ | * [[Buku Sistem Operasi]] | ||
− | + | ===Secara Umum=== | |
− | + | * [[Sistem Operasi]] | |
− | + | ===Instalasi Linux=== | |
− | == | + | * [[Linux: CLI untuk Survival]] |
+ | * [[Linux: Skema Partisi di Linux]] | ||
+ | * [[Linux: Instalasi Sistem Operasi]] | ||
+ | |||
+ | ===Compile Kernel=== | ||
+ | |||
+ | * [[Kernel]] | ||
+ | * [[OS: Linux Kernel]] | ||
+ | * [[Kernel: Anatomi Kernel Source]] | ||
+ | * [[Compile Kernel]] | ||
+ | * [[Compile Kernel: Konfigurasi Kernel]] | ||
+ | |||
+ | ===Remaster Linux=== | ||
+ | |||
+ | * [[Cara Cepat Melakukan Remastering Ubuntu]] | ||
+ | |||
+ | ===Sistem Operasi untuk Embedded=== | ||
+ | |||
+ | * [[OpenWRT]] | ||
+ | * [[OpenWRT: Download Firmware yang sudah jadi]] | ||
+ | * [[OpenWRT: Source Repository Download]] | ||
+ | * [[OpenWRT: Melihat Daftar Package]] | ||
+ | |||
+ | ====Membuat Firmware Sendiri==== | ||
+ | |||
+ | * [[OpenWRT: Build Firmware]] | ||
+ | * [[OpenWRT: Build Firmware Buffalo WZRHPG450H]] | ||
+ | * [[OpenWRT: Build Firmware Buffalo WZRHPG300N]] | ||
+ | * [[OpenWRT: Build Firmware Ubiquiti NanoStation2]] | ||
+ | * [[OpenWRT: Build Firmware Mikrotik RB433]] | ||
+ | * [[OpenWRT: Build Firmware Linksys WRT160NL]] | ||
+ | * [[OpenWRT: Build Firmware Linksys WRT54GL]] | ||
+ | |||
+ | ====Flash ke Device==== | ||
+ | |||
+ | * [[OpenWRT: Flash Linksys WRT54GL]] | ||
+ | * [[OpenWRT: Flash Buffalo WZRHP450H]] | ||
+ | * [[OpenWRT: Flash Buffalo WZRHP300N]] | ||
+ | * [[OpenWRT: Flash UBNT NanoStation2]] | ||
+ | |||
+ | ====Beberapa Tip==== | ||
− | * | + | * [[OpenWRT: Mikrotik RB433]] |
+ | * [[OpenWRT: 3G modem]] | ||
+ | * [[OpenWRT: Build Firmware dengan 3G Modem Support]] | ||
+ | * [[OpenWRT: Setup Firewall]] | ||
+ | * [[OpenWRT: Konfigurasi UBNT NanoStation2 tanpa WebGUI]] | ||
− | == | + | ===Tuning Kernel=== |
− | |||
− | |||
− | |||
− | |||
* [[OS: Parameter Kernel Default]] | * [[OS: Parameter Kernel Default]] | ||
+ | |||
+ | ====Tuning Kernel Scheduler==== | ||
+ | |||
* [[OS: Kernel Scheduler]] | * [[OS: Kernel Scheduler]] | ||
+ | * [[OS: Tuning Kernel Scheduler]] | ||
+ | * [[OS: Tuning Completely Fair scheduler CFS]] | ||
* [[OS: Complete Teori Tuning Kernel Scheduler]] | * [[OS: Complete Teori Tuning Kernel Scheduler]] | ||
− | + | ||
+ | ====Tuning I/O Scheduler==== | ||
+ | |||
* [[OS: Tuning Completely Fair Queueing CFQ I/O scheduler]] | * [[OS: Tuning Completely Fair Queueing CFQ I/O scheduler]] | ||
− | * [[OS: Tuning | + | * [[OS: Complete Teori Tuning I/O Performance]] |
+ | |||
+ | ====Tuning Manajemen Memory==== | ||
+ | |||
+ | * [[OS: Tuning Manajemen Memory]] | ||
+ | |||
+ | ===Android=== | ||
+ | |||
+ | * [[OS: Android - Download]] | ||
+ | |||
+ | ===Membuat Kernel Module=== | ||
+ | |||
+ | * [[OS: Mengerti System Call]] | ||
+ | * [[OS: Membuat Kernel Modul]] | ||
+ | |||
+ | ===Monitoring & Benchmark=== | ||
+ | |||
* [[OS: Build in Monitoring Tool]] | * [[OS: Build in Monitoring Tool]] | ||
* [[Linux Benchmarking]] | * [[Linux Benchmarking]] | ||
* [[OS: Benchmarking menggunakan UnixBench]] | * [[OS: Benchmarking menggunakan UnixBench]] | ||
* [[OS: Benchmarking menggunakan LLCBench]] | * [[OS: Benchmarking menggunakan LLCBench]] |
Latest revision as of 15:12, 15 May 2013
Sebuah kernel UNIX adalah interpreter yang menerjemahkan panggilan system call tingkat pengguna akses yang disinkronisasi ke hardware dan device driver. Panggilan didefinisikan oleh standar POSIX.
Interpreter mengelola permintaan system call tingkat pengguna untuk mengakses file atau proses. Kernel scheduler memungkinkan UNIX untuk mengatur subsistem file dan proses. Subsistem file bekerja dengan perangkat device raw atau block device. Subsistem Proses mengelola sinkronisasi process, komunikasi antar-proses, manajemen memori dan penjadwalan proses.
Kernel mengelola melalui penggunaan dua struktur penting yaitu, tabel proses dan struktur pengguna. Tabel proses berisi parameter penjadwalan, gambar memori, sinyal dan kondisi proses lainnya. Struktur pengguna termasuk registri mesin, kondisi system call , tabel file descriptor, akunting dan stack kernel.
Tour Linux Kernel Source
Sumber: http://www.tldp.org/LDP/khg/HyperNews/get/tour/tour.html Oleh Alessandro Rubini, rubini@pop.systemy.it
Bagian ini mencoba untuk menjelaskan source code Linux secara teratur, mencoba membantu pembaca untuk mencapai pemahaman yang baik tentang bagaimana source code diletakkan dan bagaimana fitur unix yang paling relevan diimplementasikan. Targetnya adalah untuk membantu programmer C berpengalaman yang tidak terbiasa dengan Linux dalam mendapatkan akrab dengan desain Linux secara keseluruhan. Itulah sebabnya entry point yang dipilih untuk tur kernel adalah entry point kernel sendiri: sistem boot.
Pemahaman yang baik tentang bahasa C diperlukan untuk memahami materi, serta familiar dengan konsep Unix dan arsitektur PC. Namun, tidak ada kode C akan muncul dalam bagian ini, melainkan pointer ke source code sebenarnya. Bagian ini cenderung untuk memberikan gambaran informal.
Setiap pathname untuk file direferensikan dalam bagian ini mengacu pada direktori utama, biasanya
/usr/src/linux
Booting System
Saat PC di nyalakan, processor 80x86 akan beroperasi menggunakan mode real dan menjalankan code di address 0xFFFF0, yang merupakan address ROM-BIOS. PC BIOS menjalankan beberapa test pada sistem dan menginisialisasi vector interupsi pada address fisik 0. Setelah itu, PC akan memasukan sektor pertama dari bootable device ke 0x7C00, dan jump ke situ. Device tersebut biasanya floppy atau hard drive. Memang ini terlihat sederhana, tapi memang hanya itu yang dibutuhkan untuk mengerti bagaimana awal kernel beroperasi.
Bagian pertama dari Linux kernel di tulis dalam bahasa assembler 8086 (boot/bootsect.S). Jika dijalankan, dia akan pindah ke address absolut di 0x90000, load 2 kBytes dari code selanjutnya dari boot device ke address 0x90200, dan seluruh sisa kernel ke address 0x10000. Message "Loading..." akan ditampilkan saat sistem load. Kontrol diberikan kepada code boot/Setup.S, real-mode assembly source yang lain.
Bagian dari setup mengidentifikasi fitur dari mesin dan tipe dari VGA. Jika di minta, dia juga akan menanyakan kepada pengguna untuk memilih mode video untuk console. Selanjutnya, dia akan memindahkan seluruh sistem dari address 0x10000 ke address 0x1000, masuk ke mode protected dan jump ke sistem yang ada 0x1000.
Langkah selanjutnya adalah proses dekompresi kernel. Code berada pada 0x1000 berasal dari zBoot/head.S yang akan menginisialisasi register dan menjalankan decompress_kernel(), yang akan membuat zBoot/inflate.c, zBoot/unzip.c dan zBoot/misc.c. Data yang sudah di-dekompres masuk ke address 0x100000 (1 Meg), dan hal ini yang menyebabkan Linux biasanya tidak dapat di jalankan di RAM kurang dari 2MB.
Enkapsulasi kernel dalam gzip file dilakukan oleh Makefile dan utility di directory zBoot. Cukup menarik untuk dilihat.
Kernel release 1.1.75 memindahkan directory boot dan zBoot ke arch/i386/boot. Perubahan ini untuk memungkinkan kernel bagi arsitektur yang berbeda. Pada bagian ini, informasi yang diberikan akan spesifik untuk i386.
Decompressed code di execute pada address address 0x1010000 [kemungkinan sekarang berbeda], yang mana semua setup 32bit dilakukan: IDT, GDT dan LDT di load, processor dan coprocessor di identifikasi, paging dilakukan, akhirnya, routine start_kernel dijalankan. Source dari operasi ini adalah boot/head.S. Bagian ini barangkali merupakan bagian paling tricky dari kernel secara keseluruhan.
Perlu dicatat bahwa jika terjadi error pada tahapan di atas, komputer akan lockup. Karena sistem operasi tidak dapat mengatasi error karena sistem operasi belum beroperasi dengan penuh.
start_kernel() ada di init/main.c, dan tidak pernah return. Selanjutnya semua code menggunakan bahasa C, diluar manajemen interrupt dan system call masuk / keluar (sebetulnya kebanyakan marco juga embed assembly code).
Perputaran Roda Sistem Operasi
Setelah mengatasi berbagai hal yang tricky, start_kernel() menginisialisasi semua bagian dari kernel, terutama,
- Set batas memory dan call ke paging_init().
- Inisialisasi traip, IRQ kanal dan scheduling.
- Parsing command lnine.
- Jika diminta, alokasi profiling buffer.
- Inisialisasi semua device driver dan disk buffer, juga berbagai bagian kecil lainnya.
- Kalibrasi delay loop (biasanya di hitung sebagai angka ``BogoMips).
- Cek apakah interrupt 16 bekerja dengan baik dengan coprocessor.
Akhirnya, kernel siap untuk move_to_user_mode(), untuk mem-fork proses init, yang code-nya berada pada source file yang sama. Process nomor 0 yang juga dikenal sebagai idle task akan terus jalan sebagai infinite idle loop.
Proses init akan berusaha untuk menjalankan /etc/init, atau /bin/init, atau /sbin/init.
Jika tidak ada yang berhasil, code akan menjalankan "/bin/sh /etc/rc" dan fork root shell di terminal pertama. Code ini digunakan sejak Linux 0.01, saat itu sistem operasi hanya berupa kernel saja, dan proses tanpa login tersedia.
Setelah exec() program init dari salah satu lokasi standard (kita asumsikan kita memiliki salah satunya), kernel tidak punya kontrol secara langsung terhadap aliran program. Fungsi kernel, selanjutnya adalah untuk memfasilitasi proses melalui system call, juga memberikan layanan untuk kejadian asinkron (seperti interupsi hardware). Multitasking sudah di setip, dan selanjutnya init akan memanaje akses multiuser melalui fork() system daemon dan proses login.
Karena kernel bertanggung jawab untuk memberikan layanan, pembahasan ini akan dilanjutkan dengan melihat pada layanan tersebut (yaitu "system calls"), juga memberikan gambaran umum tentang struktur data di bawahnya maupun organisasi dari code.
Bagaimana Kernel Melihat Proses
Dari sudut pandang kernel, sebuah proses tidak lebih dari sebuah entry pada tabel proses.
Oleh karenanya, tabel process adalah salah satu tabel paling penting dalam struktur data di system, bersama dengan tabel memory-management dan buffer cache. Satu-satunya hal (item) yang di simpan di tabel proses adalah struktur task_struct, lumayan besar sekali, di definisikan di definisikan di include/linux/sched.h. Dalam task_struct baik informasi low-level dan high-level disimpan -- mulai dari copy dari register hardware hingga inode dari directory tempat beroperasinya proses.
Tabel process dapat berupa array dan double-link list, juga tree. Implementasi fisik dapat berupa static array dari pointer, yang panjangnya adalah NR_TASKS, sebuah konstanta yang di definisikan di include/linux/tasks.h, dan setiap struktur berada di bagian page reserved memory. Struktur list diperoleh melalui pointer next_task dan prev_task, sedangkan struktur tree cukup kompleks dan tidak akan di terangkan disini. Kita mungkin ingin mengubah nilai NR_TASKS dari 128, tapi pastikan untuk memaksa mengcompile semua file dependensi yang tergantung kepadanya.
Setelah booting selesai, kernel akan selalu bekerja atas nama dari salah satu proses, dan global variable current, sebuah pointer ke item task_struct, digunakan untuk mencatat proses yang sedang berjalan. current hanya akan diubah oleh scheduler, di kernel/sched.c. Akan tetapi, semua proses harus di lihat, macro for_each_task digunakan. Hal ini jauh lebih cepat daripada scan array secara berurutan, jika system dalam kondisi beban yang ringan.
Sebuah proses harus dijalankan dalam mode user mode atau kernel mode. Badan utama dari user program akan di execute dalam user mode dan system call akan di execute dalam kernel mode. stack yang digunakan oleh process dalam dua mode exekusi juga berbeda -- stack segmen konvensional digunakan dalam user mode, sedang fixed-size stack (satu page,dimiliki oleh process) digunakan dalam kernel mode. Page kernel stack tidak pernah di swap, karena dia harus tersedia jika sewaktu-waktu system call memanggil.
System calls, dalam kernel, berupa fungsi dalam bahasa C, nama 'official' biasanya menggunakan prefix `sys_'. Sebuah system call diberi nama, sebagai contoh, untuk burnout akan memanggil fungsi kernel sys_burnout().
Lihat for_each_task dan SET_LINKS, di include/linux/sched.h akan menolong untuk mengerti struktur list dan tree di tabel proses.
Pembuatan dan Penghancuran proses
Sebuah sistem unix akan membuat proses melalui system call fork(), dan terminasi proses melalui perintah exit() atau dengan memberikan signal. Implementasi Linux dari kedua perintah tersebut berada di kernel/fork.c dan kernel/exit.c.
Fork relatif mudah, dan fork.c lumayan pendek dan sangat mudah untuk dimengerti. Tugas utamanya adalah mengisi struktur data dari proses baru. Langkah yang dilakukan, selain mengisi kolom, adalah:
- Mengambil page yang free untuk meletakan task_struct
- Mencari slot proses yang kosong (find_empty_process())
- Mengambil page yang free untuk kernel_stack_page
- Copy LDT bapak ke anak
- Duplikasi informasi mmap ke bapak
sys_fork() juga memanaje deskripsi file dan inode.
Kernel 1.0 memberikan dukungan vestigial untuk threading, dan fork() system call akan menunjukan beberapa hal untuk itu. Kernel thread adalah work-in-progress diluar kernel utama.
Keluar dari sebuah proses lebih triky, karena proses parent harus diberitahu akan adanya child yang berjalan. Tambah lagi, sebuah proses dapat exit jika di kill() oleh proses lain (hal ini adalah fitur Unix). File exit.c oleh karenanya merupakan tempat dari sys_kill() dan berbagai jenis sys_wait(), selain dari sys_exit().
Code dari exit.c tidak akan diterangkan disini -- karena tidak terlalu menarik. Intinya dia akan menangani dari perintah untuk keluar dari system secara konsisten. Standard POSIX, akan secara detail menerangkan tentang berbagai sinyal yang harus di tangani dalam proses keluar tersebut.
Menjalankan Program
Setelah menjalankan fork(), dua copy dari program yang sama akan jalan. Salah satu diantaranya biasanya akan meng-exec() program yang lain. System call exec() harus menemukan lokasi dari image binary dari file executable, me-load dan men-jalan-kannya. Kata "load" disini boleh tentu berarti "copy binary image ke memory", karena Linux mendukung demand loading.
Implementasi exec() di Linux mendukung beberapa format binary. Hal ini dapat dicapai melalui struktur linux_binfmt, dimana ada dua pointer ke fungsi -- satu untuk load executable dan yang lain untuk load library, setiap format binary me-representasikan executable maupun library. Loading dari shared library di implementasikan di source file yang sama dengan exec(), untuk sekarang kita fokus ke exec() saja.
Unix system memberikan programmer enam pola dari fungsi exec(). Semua kecuali satu dapat di implementasikan sebagai fungsi library, kernel Linux mengimplementasikan sys_execve() sendiri. Dia menjalankan tugas yang sangat sederhana, yaitu, load head dari executable, dan mencoba meng-execute-nya. Jika dua byte pertama adalah "#!", maka kalimat pertama akan di parsing dan interpreter akan di jalankan, selain itu format binary yang terdaftar akan berusaha di coba dijalankan.
Format Linux asli didukung secara langsung dalam fs/exec.c, dan fungsi yang relevan akan me-load binary aout_dan load library aout. Untuk binary, fungsi loading dari executable "a.out" akan berujung pada mmap() ke file disk, atau call read_exec(). mmap() digunakan oleh Linux jika dibutuhkan mekanisme loading ke page memory program saat di akses, sedangkan read_exec() digunakan jika memory mapping tidak didukung oleh filesystem host (contoh filesystem "msdos")
Kernel 1.1 memasukan revisi filesystem msdos, yang mendukung mmap(). Di samping itu, struct linux_binfmt menjadi linked list bukan sekedar array, untuk memungkinkan loading format binary baru sebagai kernel modul. Selanjutnya, structure yang ada juga di kembangkan untuk mengakses route core-dump yang berhubungan dengan format.
Akses ke File System
Kita semua tahu bahwa filesystem adalah sumber daya paling dasar dalam system Uniux, sangat mendasar dan ubiquitous sehingga membutuhkan nama yang mudah di ingat - untuk memudahkan kita akan menggunakan singkatan sederhana "fs".
Disini akan di asumsikan bahwa pembaca mengerti dasar fs Unix -- ijin akses, inode, superblock, mount dan umount. Konsep ini banyak di terangkan di literatur Unix lainnya. Kita akan banyak membahas isu spesifik fs di Linux.
Unix awal biasanya mendukung satu tipe fs saja, yang strukturnya tersebar dalam seluruh kernel. Pada hari ini, kita menggunakan interface standard antara kernel dengan fs, agar memudahkan pertukaran data pada berbagai arsitektur. Linux memberikan lapisan standard untuk menyampaikan informasi antara kernel dengan modul fs. Lapisan interface ini biasanya di sebut VFS, untuk "virtual filesystem".
Code filesystem oleh karenanya biasanya di pecah menjadi dua lapisan: lapisan atas memfokuskan diri pada manajemen dari tabel kernel dan struktur data, sedangkan lapisan bawah terdiri dari sekumpulan fungsi yang fs-dependent, yang di akses melalui struktur data VFS. Semua bagian yang fs-independent berada di file fs/*.c. Mereka menangani isu berikut ini:
- Manaje buffer chache (buffer.c);
- Respond ke system call fcntl() dan ioctl() (fcntl.c dan ioctl.c);
- Memetakan pipe dan fifo pada inode dan buffer (fifo.c, pipe.c);
- Manaje tabel file and inode (file_table.c, inode.c);
- Lock dan unlock file dan record (locks.c);
- Memetakan name ke inode (namei.c, open.c);
- Implementasi fungsi select() (select.c) yang tricky;
- Memberikan informasi (stat.c);
- mount dan umount filesystem (super.c);
- exec() executable dan dump core (exec.c);
- Load berbagai format binary (bin_fmt*.c, seperti diterangkan diatas).
Interface VFS, terdiri dari sekumpulan operasi high-level yang di kerjakan oleh code fs-independent dan di lakukan oleh setiap tipe filesystem. Struktur yang paling relevan adalah inode_operations dan file_operations, meskipun mereka tidak sendiri karena beberapa struktur lain juga ada. Seluruh struktur di definisikan dalam include/linux/fs.h.
Pintu masuk dalam kernel ke file system yang sebenarnya ada di struktur file_system_type. Array file_system_types terdapat dalam fs/filesystems.c dan digunakan saat perintah mount diberikan. Fungsi read_super dari tipe fs yang relevan akan bertanggung jawab untuk mengisi struct super_block, yang akhirnya juga mengisi struct super_operations dan struct type_sb_info. struct super_operations memberikan pointer untuk operasi fs yang generik untuk fs-type current, struct type_sb_info memberikan informasi yang lebih spesifik tentang fs-type.
Array tipe filesystem sudah menjadi linked list, untuk membuka kemungkinan load tipe fs baru sebagai kernel module. Fungsi (un-)register_filesystem di masukan dalam fs/super.c.
Anatomi dari Tipe File System
Tugas dari filesystem type adalah untuk menjalankan tugas low-level yang di petakan ke operasi VFS yang lebih high level pada media fisik (disk, networ atau apa saja). Interface VFS cukup flexibel untuk mendukung filesystem Unix konvensional maupun yang tidak konvensional seperti msdos dan umsdos.
Setiap fs-type dibangun oleh hal berikut, di samping directory sendiri:
- Entry ke array file_systems[] (fs/filesystems.c);
- include file superblock (include/linux/type_fs_sb.h);
- include file inode (include/linux/type_fs_i.h);
- include file generic (include/linux/type_fs.h});
- Dua #include dalam include/linux/fs.h, termasuk entry struct super_block dan struct inode.
Directory yang dimiliki oleh fs type berisi semua code, yang bertanggung jawab terhadap inode dan data management.
Untuk melihat dari dekat bagaimana low-level code dan interface VFS bekerja untuk fs type ada baiknya memnaca procfs. Source code fs/procfs cukup mudah dibaca.
Selanjutnya kita akan mencoba melihat mekanisme kerja di dalam VFS, minix filesystem akan digunakan sebagai contoh. minix type dipilih karena relatif kecil tapi cukup komplit; di samping itu, fs type linux lainnya diturunkan dari minix. ext2 type jauh lebih komplex mungkin bisa menjadi pelajaran bagi pembaca yang cukup tekun.
Pada saat minix-fs di mount, minix_akan membaca read_super dan mengisi struktur super_block dengan data yang dibaca dari device yang di mount. Parameter s_op dalam struktur tersebut akan menyimpan pointer ke minix_sops, yang digunakan oleh code filesystem generik yang dijalankan oleh operasi superblock.
Mengkaitkan fs yang baru saja di mount ke sistem tree global bergantung pada data berikut (asumsinya sb adalah struktur super_block dan dir_i point ke inode untuk mount point):
sb->s_mounted point ke root-dir inode dari mounted filesystem (MINIX_ROOT_INO); dir_i->i_mount menyimpan sb->s_mounted; sb->s_covered menyimpan dir_i
Umount dapat dilakukan oleh do_umount, yang akan menjalankan minix_put_super.
Jika sebuah file di akses, minix_read_inode akan mulai bekerja; dia akan mengisi system-wide struktur inode dengan field dari minix_inode. Field inode->i_op akan di isi sesuai dengan inode->i_mode dan dia akan bertanggung jawab akan operasi selanjutnya pada file tersebut. Source untuk fungsi minix yang baru saja dijelasnkan dapat dilihat di fs/minix/inode.c.
Struktur inode_operations digunakan untuk menjalankan operasi inode ke fungsi kernel yang spesifik fs-type; entry pertama di struktur adalah pointer ke item file_operations, yang equivalen dengan data-management dari i_op. minix fs-type mengijinkan tiga instance dari inode-operation (untuk directori, untuk file dan untuk symbolic link) dan dua instance dari file-operation (symlinks tidak memerlukan hal ini).
Operasi directori (minix_readdir) dapat ditemukan di fs/minix/dir.c; operasi file (read dan write) ada di fs/minix/file.c dan operasi symlink (reading dan following link) ada di fs/minix/symlink.c.
Selebihnya dari minix directory mengimplementasikan tugas berikut:
- bitmap.c mengatur alokasi dan pembebasan inode dan block (pada ext2 fs, hal ini dilakukan pada dua source file yang berbeda);
- fsynk.c bertanggung jawab untuk system call fsync() -- dia mengatur block direct, indirect dan double indirect (ini merupakan bagian dari pengetahuan umum Unix);
- namei.c berisi semua operasi nama pada inode, seperti membuat dan memhancurkan node, rename dan links;
- truncate.c menjalankan pemotongan (truncatin) dari file.
console driver
Karena merupakan I/O device utama di sebagian besar Linux, console driver perlu memperoleh perhatian lebih. Source code dari console, maupun berbagai karakter driver, dapat ditemukan pada drivers/char, dan kita akan menggunakan directory tersebut sebagai titik referensi ketika melakukan penamaan file.
Inisialisasi Console dilakukan oleh fungsi tty_init(), di tty_io.c. Fungsi bertanggung jawab untuk memperoleh nomor device dan memanggil fungsi init untuk masing-masing device. con_init(), yang kemudian menghubungkan ke console, dan berada console.c.
Inisialisasi console telah berubah lumayan banyak pada evolusi 1.1. console_init() dilepas dari tty_init(), dan dapat di panggil secara langsung oleh ../../main.c. Virtual console dialokasikan secara dinamis.
Write ke console
Jika console device di tulis, fungsi con_write akan di jalankan. Fungsi ini mengatur semua control karakter dan escape sequences yang digunakan oleh aplikasi untuk memperoleh manajemen layar (screen) secara lengkap. escape sequence yang di implementasikan adalah milik terminal vt102; Hal ini berarti bahwa environment kita perlu di set TERM=vt102 jika kita melakukan telnet ke host non-Linux; untuk aktifitas lokal, lebih baik menggunakan TERM=console karena console Linux memberikan fungsi superset dari vt102.
con_write(), sebagian besar merupakan pernyataan nested switch, yang digunakan untuk meng-handel finite state automaton yang meng-interpretasikan escape sequences karakter satu per satu. Saat mode normal, character yang di cetak akan di tulis secara langsung ke memory video, menggunakan current attr-ibute. Dalam console.c, semua field struct vc dapat di akses melalui macro, oleh karenanya referensi ke (contoh) attr, sebetulnya me-refer ke field di struktur vc_cons[currcons], selama currcons adalah nomor dari console yang di referensikan.
Sebetulnya, vc_cons di kernel yang baru, tidak lagi berupa array dari struktur, dia berupa array dari pointer yang isinya di kmalloc() -kan. Penggunaan macro sangat menyederhanakan perubahan yang dilakukan, karena sebagian besar code tidak perlu di tulis ulang.
mapping dan unmapping dari console memory ke screen dilakukan oleh fungsi set_scrmem() (yang mengcopy data dari buffer console ke video memory) dan get_scrmem (yang mengcopydata kembali ke buffer console). buffer private dari current console secara fisik di map ke video RAM, untuk meminimalkan jumlah data yang perlu di transfer. Hal ini berarti, get- dan set-_scrmem() secara statik ada di console.c dan di panggil hanya saat console switch.
Read console
Membaca (read) console dilakukan melalui line-discipline. default (dan unique) line discipline di Linux di kenal sebagai tty_ldisc_N_TTY. line discipline adalah "men-displin input melalui line". Ini merupakan tabel fungsi, yang fokus untuk membaca device. Dengan di bantu oleh flag termios, line discipline mengontrol input dari tty: raw, cbreak dan cooked mode; select(); ioctl() dan sebagainya.
Fungsi read di line discipline di sebut read_chan(), yang akan membaca which tty buffer secara independent dari masukan yang ada. Alasannya, karena masuknya karakter melalui tty di tangani oleh interupsi hardware secara asinkron.
Line discipline N_TTY dapat ditemukan di tty_io.c, kernel selanjutnya akan menggunakan source file n_tty.c yang berbeda.
Bagian paling bawah dari console input adalah bagian dari manajemen keyboard, dan oleh karenanya akan di tangani dalam keyboard.c, dalam fungsi keyboard_interrupt().
Manajemen Keyboard
Majamen Keyboard cukup membuat kepala pusing. Oleh karenanya dia dibatasi di file keyboard.c, yang berisi banyak angka hexadecimal yang merepresentasikan banyak kode keyboard yang muncul di keyboard dari berbagai pembuat keyboard.
Bagi pembaca yang sangat tertarik dengan Linux keyboard, cara terbaik untuk membaca keyboard.c adalah mulai dari kalimat terakhir ke atas. Detail pada tingkat yang paling rendah terutama pada setengah pertama dari file tersebut.
Switching current console
current console di switch dengan cara mengaktifkan fungsi change_console(), yang berada di tty_io.c dan di aktifkan oleh keyboard.c dan vt.c (sebelumnya console switch untuk meresponds tombol keyboard yang di tekan, belakangan jika program me-request dengan cara memanggil ioctl()).
Proses switch yang sebenarnya dilakukan dalam dua langkah, dan fungsi complete_change_console() yang menangani langkah ke dua. Membagi switch berarti untuk menyelesaikan sebuah tugas sesudah terjadi handshake dengan proses yang mengontrol tty sesudah kita tinggalkan. Jika console tidak di bawah kontrol proses, call ke change_console() akan di selesaikan oleh complete_change_console() sendiri. Intervensi proses diperlukan untuk bisa melakukan switch secara baik antara console grafik dengan text dan sebaliknya, dan pada server X (sebagai contoh) dia akan mengontrol sendiri console grafik-nya.
Mekanisme seleksi (selection)
"selection" adalah fasilitas cut and paste untuk text console di Linux. Mekanisme ini biasanya di tangani oleh proses pada user-level, yang biasanya di inisiasi oleh selection atau gpm. Program pada user-level menggunakan ioctl() pada console untuk memberitahukan pada kernel untuk meng-highlight bagian pada layar. Text yang di select, kemudian akan di copy ke selection buffer. buffer ini merupakan entitas statik di console.c. Paste text dilakukan secara "manual" mem-push karakter di antrian tty input. Seluruh mekanisme selection di proteksi oleh #ifdef sehingga user dapat men-disable-nya saat konfigurasi kernel untuk menghemat beberapa kilobyte dari RAM.
Selection adalah fasilitas yang sangat low-level, dan dia bekerja secara tersembunyi dari aktifitas kernel lainnya. Hal ini berarti #ifdef hanya menghilangkan highlight sebelum screen di modifikasi.
Kernel yang baru mempunyai code yang lebih baik untuk selection, dan pointer mouse dapat di highlight secara independent oleh text yang di select. Selanjutnya, sejak versi 1.1.73 dan seterusnya digunakan dynamic buffer untuk text yang dipilih, membuat kernel 4kB lebih kecil.
ioctl() dari device
System call ioctl() merupakan pintu masuk untuk proses user untuk mengontrol perilaku sebuah file device. Manajemen ioctl di-spawn oleh ../../fs/ioctl.c, dimana sys_ioctl() yang sebenarnya berada. Permohonan standard ioctl akan ditangani di situ, permohonan yang berhubungan dengan file akan di proses oleh file_ioctl() (di source file yang sama), sedangkan proses lainnya akan di proses oleh fungsi ioctl() yang spesifik untuk device tersebut.
Bahan-bahan ioctl untuk console device berada di vt.c, karena console driver akan mengirimkan ioctl requests ke vt_ioctl().
Materi tentang ioctl cukup memusingkan kepala. Beberapa request berhubungan dengan device, dan beberapa lagi berhubungan dengan line discipline.
Fitur pada kernel 1.1.7x ke atas: tty_ioctl.c mengimplementasikan line discipline request (dengan nama n_tty_ioctl(), yang merupakan fungsi n_tty satu-satunya yang berada di luar n_tty.c), sementara file_operations field menunjuk ke tty_ioctl() di tty_io.c. Jika nomor request tidak dapat di tangani oleh tty_ioctl(), dia akan meneruskan ke tty->driver.ioctl atau, jika dia gagal, ke tty->ldisc.ioctl. Berbagai hal yang berkenaan dengan driver untuk console dapat ditemukan di vt.c, sementara material line discipline di tty_ioctl.c.
Request TIOCLINUX adalah device-independent code. Artinya, console selection dapat di set oleh ioctl dari tty manapun (set_selection() selalu beroperasi di console foreground), dan ini merupakan salah satu security hole di Linux lama. Maka pada Linux yang baru, hanya superuser yang dapat menangani selection.
Ada banyak jenis request yang di berikan console device, dan cara terbaik untuk mengetahui-nya adalah melihat isi file vt.c.
Referensi
Pranala Menarik
Secara Umum
Instalasi Linux
Compile Kernel
- Kernel
- OS: Linux Kernel
- Kernel: Anatomi Kernel Source
- Compile Kernel
- Compile Kernel: Konfigurasi Kernel
Remaster Linux
Sistem Operasi untuk Embedded
- OpenWRT
- OpenWRT: Download Firmware yang sudah jadi
- OpenWRT: Source Repository Download
- OpenWRT: Melihat Daftar Package
Membuat Firmware Sendiri
- OpenWRT: Build Firmware
- OpenWRT: Build Firmware Buffalo WZRHPG450H
- OpenWRT: Build Firmware Buffalo WZRHPG300N
- OpenWRT: Build Firmware Ubiquiti NanoStation2
- OpenWRT: Build Firmware Mikrotik RB433
- OpenWRT: Build Firmware Linksys WRT160NL
- OpenWRT: Build Firmware Linksys WRT54GL
Flash ke Device
- OpenWRT: Flash Linksys WRT54GL
- OpenWRT: Flash Buffalo WZRHP450H
- OpenWRT: Flash Buffalo WZRHP300N
- OpenWRT: Flash UBNT NanoStation2
Beberapa Tip
- OpenWRT: Mikrotik RB433
- OpenWRT: 3G modem
- OpenWRT: Build Firmware dengan 3G Modem Support
- OpenWRT: Setup Firewall
- OpenWRT: Konfigurasi UBNT NanoStation2 tanpa WebGUI
Tuning Kernel
Tuning Kernel Scheduler
- OS: Kernel Scheduler
- OS: Tuning Kernel Scheduler
- OS: Tuning Completely Fair scheduler CFS
- OS: Complete Teori Tuning Kernel Scheduler