Fazla uzatmadan başlayayım:
1)
Gerekli güncelleştirmeleri ve paketleri kurduktan sonra ilk olarak proc
uygulamamız için terminalden C kod dosyasının (prc.c) ve Makefile dosyasının
bulunacağı, Ev dizininde sistem adlı bir klasör oluşturduk.
Bu işlemden sonra proc uygulamamızı oluşturmak için dosyaları derlemek
gerekiyor.
Bunuda terminalden o dizinde olduğumuzdan emin olarak #makekomutu
ile yapıyoruz. Aşağıdaki ekran çıktısında da görüldüğü üzere dosyalarımız
başarılı bir şekilde derlendi. Bu aşamada başarılı bir derleme sonucunda
dosyalarımızın bulunduğu dizinde İşletim Sisteminin yeni dosyalar
oluşturduğunuda görebiliriz.
3)
Bu derlemeden sonra #sudo insmod komutu
ile root moda geçiyor ve proc uygulamasını yüklüyoruz. Burada init_module
çalışarak proc umuzu oluşturur.
4)
C kodundan görülebileceği gibi ‘procekrankarti’ isminde proc dizini
içinde proc uygulamamız oluştu. Aynı zamanda #ls komutu ile oluşup oluşmadığını da görebiliriz.
5)
Tüm proc dizinini görüntülüyerek de oluşan ‘procekrankarti’ isimli
uygulamamızı görebiliriz.
6)
Bu noktadan sonra yapmamız gereken proc uygulamamızı #cat komutuyla çalıştırarak okumamızdır ve bu uygulamayı #cat komutu ile çalıştırdığımızda
terminale bilgisayarımız ekran kartı bilgilerini doğru olarak yazmaktadır.
7)
‘procekranti’ adlı proc umuzun doğru bir şekilde çalıştığını gördük.
En son olarak #rmmod komutu
ile ‘procekrankarti’ uygulamamızı siliyoruz.
Bu komut ile cleanup_module çalışarak proc u siler.
8)
Proc uygulamamızı sildikten sonra da proc dizininde #ls komutu ile tüm procları listelediğimizde ‘procekranti’ isimli
proc umuzun olmadığı görülecektir.
-
prc.c
Dosyası Kodları:
#include
#include
#include
#include Kütüphaneleri include ettik
#include
#define max_ length 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 );
-
Sabit bir uzunluk ve okuma yazma
fonksiyonlarının protatype’ini tanımladık.
static struct proc_dir_entry *proc_entry;
static char *info;
static int write_index;
static int read_index;
static char *info;
static int write_index;
static int read_index;
-
Yine gerekli değişkenleri ,pointer ve
yapıları tanımladık.
int init_module( void )
{
int ret = 0;
info = (char *)vmalloc(max_ length);
memset( info, 0, max_ length);
proc_entry = create_proc_entry( "procekrankarti”, 0644, NULL );
info = (char *)vmalloc(max_ length);
memset( info, 0, max_ length);
proc_entry = create_proc_entry( "procekrankarti”, 0644, NULL );
-
Make komutu init_module fonksiyonunu
çalıştıracak.Burada procekrankarti ismini,0644 dosya açılma biçimini,null ise
oluşturduğumuz dosyanın root olduğunu
göstermektedir.Böylece Init_module fonksiyonu içinde, ‘create_proc_entry’
fonksiyonuyla ‘procekrankarti’ isimli yeni bir proc yaratmış olduk.
if (proc_entry ==
NULL)
{
ret = -1;
vfree(info);
printk(KERN_INFO "procekrankarti olusturulamadi\n");
}
{
ret = -1;
vfree(info);
printk(KERN_INFO "procekrankarti olusturulamadi\n");
}
else {
write_index =
0;
read_index = 0;
proc_entry->read_proc = read_info;
proc_entry->write_proc = write_info;
printk(KERN_INFO "procekrankarti olusturuldu.\n");
}
return ret;
}return ret;
-
Procekrankarti oluşması ve
oluşturulamaması durumlarında gerekli olan bilgilendirmenin yapılmasını
sağladık.
-
remove için yazılan rmmod komutu ile
derlenmesi sağlanan fonksiyon :
void cleanup_module( void )
{
remove_proc_entry("procekrankarti", proc_entry);
printk(KERN_INFO "procekrankarti kaldirildi.\n");
vfree(info);
}
- Full proc uygulamasında olması gereken open,close kısımlarını tamamladık,şimdide gerekli olan read ve write fonksiyonlarını yine pointerlar yardımıyla yazıyoruz.
{
remove_proc_entry("procekrankarti", proc_entry);
printk(KERN_INFO "procekrankarti kaldirildi.\n");
vfree(info);
}
- Full proc uygulamasında olması gereken open,close kısımlarını tamamladık,şimdide gerekli olan read ve write fonksiyonlarını yine pointerlar yardımıyla yazıyoruz.
-
‘read_info’ ve ‘write_info’
fonksiyonları, proc dosyasının okunması ve yazılması sırasında kullanılır.
-
write_info’ fonksiyonun içinde, eğer
buffer içine yazabilecek alan varsa, ‘copy_from_user’ fonksiyonu kullanıcı alanında bulunan String’i,kernel
modülünün ayrılmış bellek bufferına kopyalamak için kullanılır.
ssize_t write_info( struct file *filp, const char __user
*buff, unsigned long len, void *data )
{
int capacity = (max_ length-write_index)+1;
int capacity = (max_ length-write_index)+1;
if (len > capacity)
{
printk(KERN_INFO "procekrankarti icinde space kullanmayin!\n");
return -1;
}
if (copy_from_user( &info[write_index], buff, len ))
{
return -2;
}
write_index += len;
info[write_index-1] = 0;
return len;
}
{
printk(KERN_INFO "procekrankarti icinde space kullanmayin!\n");
return -1;
}
if (copy_from_user( &info[write_index], buff, len ))
{
return -2;
}
write_index += len;
info[write_index-1] = 0;
return len;
}
-
‘read_info’ fonksiyonu, bufferda mevcut
bulunan bilgiyi kullanıcı alanına geri gönderir.
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;
}
extern const struct seq_operations procekrankarti_ac;
static int procekrankarti_open(struct inode *inode, struct file *file)
{
return seq_open(file, &cpuinfo_ac);
}
static const struct file_operations proc_procekrankarti_operations = {
.open = procekrankarti_open,
.read = seq_read,
.llseek = seq_lseek,
.release = seq_release,
};
module_init(proc_procekrankarti_init);
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;
}
extern const struct seq_operations procekrankarti_ac;
static int procekrankarti_open(struct inode *inode, struct file *file)
{
return seq_open(file, &cpuinfo_ac);
}
static const struct file_operations proc_procekrankarti_operations = {
.open = procekrankarti_open,
.read = seq_read,
.llseek = seq_lseek,
.release = seq_release,
};
module_init(proc_procekrankarti_init);
-
Bu fonksiyon ise yarattığımız
procekrankarti dosyasını okumamızı ve böylece ekran kartı bilgilerini cat ile
konsola yazdırmamızı sağlar.
-
Makefile Dosyası Kodları:
obj-m += prc.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
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
-
Make file dosyası genelde aynı
kodlardan oluşmaktadır.All derlemeyi, clean derleme sonrası gereksiz dosyaların
temizlenmesini sağlar.
Hiç yorum yok:
Yorum Gönder