Sistem file Proc mencerminkan keadaan kernel Linux saat ini.
Keadaan kernel saat ini dapat mewakili berbagai informasi seperti proses yang berjalan di dalamnya, informasi perangkat keras, informasi jaringan, dll. Jadi sistem ini dirancang sedemikian rupa sehingga semua informasi ini dapat diakses dengan mudah oleh proses tingkat pengguna.
Kami juga mengatakan bahwa sistem file proc adalah sistem file semu. Ini karena, file dalam sistem file ini dimuat dengan informasi saat file ini diakses dan itulah alasan mengapa file dalam sistem file ini biasanya menunjukkan ukuran nol.
Lakukan ls /proc pada sistem Anda dan Anda akan melihat sesuatu yang mirip dengan berikut ini:
$ ls /proc 1 15 1681 1719 35 60 713 878 cgroups filesystems kpageflags pagetypeinfo sysrq-trigger ....
Jadi kita melihat bahwa sistem file ini berisi file dan juga direktori. Nama-nama file atau direktori dapat berupa abjad atau numerik. Nama file atau direktori numerik sebagian besar sesuai dengan proses yang berjalan pada sistem dan nomor tersebut mewakili ID proses dari proses tersebut. Jadi sangat mudah untuk mengetahui informasi tingkat kernel tentang proses apa pun dengan menggunakan ID prosesnya dan membuka file yang sesuai.
Dalam artikel ini kita akan membangun pengetahuan kita tentang Loadable Kernel Modules (LKM) dan akan membahas bagaimana file proc ini dibuat, dibaca, dan ditulis.
Lihat artikel kami sebelumnya tentang sistem file proc Linux untuk memahami berbagai file yang terletak di bawah /proc.
Membuat file Proc
Dalam artikel tentang modul kernel Linux, kami membahas cara membuat, memuat, dan membongkar LKM. Itu adalah konsep dasar untuk menambahkan lebih banyak fungsionalitas ke kernel linux saat dijalankan. File Proc bekerja dengan prinsip yang sama. Setiap file proc dibuat, dimuat dan dibongkar dalam bentuk LKM.
Dalam kode berikut, kami mencoba membuat file proc dan mendefinisikan kemampuan baca dan tulisnya.
#include <linux/module.h> #include <linux/kernel.h> #include <linux/proc_fs.h> #include <linux/string.h> #include <linux/vmalloc.h> #include <asm/uaccess.h> #define MAX_LEN 4096 int read_info( char *page, char **start, off_t off,int count, int *eof, void *data ); ssize_t write_info( struct file *filp, const char __user *buff,unsigned long len, void *data ); static struct proc_dir_entry *proc_entry; static char *info; static int write_index; static int read_index; int init_module( void ) { int ret = 0; info = (char *)vmalloc( MAX_LEN ); memset( info, 0, MAX_LEN ); proc_entry = create_proc_entry( "procEntry123", 0644, NULL ); if (proc_entry == NULL) { ret = -1; vfree(info); printk(KERN_INFO "procEntry123 could not be created\n"); } else { write_index = 0; read_index = 0; proc_entry->read_proc = read_info; proc_entry->write_proc = write_info; printk(KERN_INFO "procEntry123 created.\n"); } return ret; } void cleanup_module( void ) { remove_proc_entry("procEntry123", proc_entry); printk(KERN_INFO "procEntry123 unloaded.\n"); vfree(info); } ssize_t write_info( struct file *filp, const char __user *buff, unsigned long len, void *data ) { int capacity = (MAX_LEN-write_index)+1; if (len > capacity) { printk(KERN_INFO "No space to write in procEntry123!\n"); return -1; } if (copy_from_user( &info[write_index], buff, len )) { return -2; } write_index += len; info[write_index-1] = 0; return len; } int read_info( char *page, char **start, off_t off, int count, int *eof, void *data ) { int len; if (off > 0) { *eof = 1; return 0; } if (read_index >= write_index) read_index = 0; len = sprintf(page, "%s\n", &info[read_index]); read_index += len; return len; }
Pada kode di atas :
- Dalam fungsi init_module kami menggunakan fungsi 'create_proc_entry' untuk membuat file proc bernama 'procEntry123'
- File dibuat dengan hak istimewa yang sesuai seperti yang dijelaskan oleh argumen kedua ke fungsi create_proc_entry.
- Dua fungsi read_info dan write_info digunakan saat file proc dibaca dan ditulis.
- Alamat kedua fungsi ini ditetapkan ke anggota struktur proc_dir_entry.
- Langkah di atas dilakukan agar kode dapat mengetahui fungsi mana yang akan dipanggil ketika file proc dibaca dan ditulis.
- Dalam fungsi write_info, jika ada kapasitas untuk menulis di buffer, fungsi copy_from_user digunakan untuk menyalin string dari ruang pengguna ke buffer memori yang dialokasikan modul kernel.
- Dalam fungsi read_info, informasi yang ada di buffer dikirim kembali ke ruang pengguna.
Makefile untuk kode di atas terlihat seperti :
$ cat Makefile obj-m += proc.o all: sudo make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: sudo make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Sekarang, ketika kode di atas dikompilasi, kita melihat :
$ make sudo make -C /lib/modules/2.6.32-21-generic/build M=/home/himanshu modules make: Entering directory `/usr/src/linux-headers-2.6.32-21-generic' CC [M] /home/himanshu/proc.o /home/himanshu/proc.c: In function ‘init_module’: /home/himanshu/proc.c:33: warning: assignment from incompatible pointer type Building modules, stage 2. MODPOST 1 modules LD [M] /home/himanshu/proc.ko make: Leaving directory `/usr/src/linux-headers-2.6.32-21-generic'
Setelah kode berhasil dikompilasi, modul dimasukkan dan dimuat dengan perintah berikut:
$ sudo insmod proc.ko
Dan setelah memasukkan jika kita melihat direktori proc, kita menemukan entri 'procEntry123'
$ ls /proc/procEntry123 /proc/procEntry123
Sekarang, jika kita mencoba menulis dan membaca darinya :
$ echo "TGS" > /proc/procEntry123 $ cat /proc/procEntry123 TGS
Jadi kami melihat bahwa kami dapat membaca dan menulis file proc. Dengan cara yang sama semua file proc standar diimplementasikan.