GNU/Linux >> Belajar Linux >  >> Linux

Cara Membuat File Proc Linux di Program C menggunakan LKM

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.


Linux
  1. Cara Membuat Swap di Linux

  2. Cara membuat file swap di Linux

  3. Cara membuat Pengguna Linux Menggunakan Ansible

  1. Cara Membuat File di Linux Menggunakan Terminal/Command Line

  2. Buat file dengan menggunakan baris perintah di Linux

  3. Cara membuat file sparse di Linux menggunakan perintah 'dd'

  1. Cara Membuat Volume HardDisk Virtual Menggunakan File di Linux

  2. Cara Membuat File di Linux

  3. Cara Memotong (Kosong) File di Linux