2 Mart 2016 Çarşamba

procfs ve tmpfs

tmpfs nedir?
tempfs bellekte yaratılan dosya sistemidir. Bilgisayar kapanınca tüm dosyalar silinir.

uname
uname - unix name anlamına geliyor - ile sistemin adı öğrenilebilir. Örnek:


#include <sys/utsname.h>

struct utsname name;

int result = uname(&name);
if (result == 0)
    printf("OS: %s\n", name.sysname);

procfs nedir?
procfs, linux tarafından sağlanan çeşitli dosya sistemlerinden bir başkası. En önemli görevi, kernel ile programlar arasında bilgi akışını sağlamak.

Procfs'ten Okuma
Bu dosya sistemini parse ederek okumak her zaman güvenilir olmayabilir. Eğer dosya sistemi tekrar tekrar okunacaksa, en güvenli yol dosyayı açma, okuma ve kapama şeklinde olmalı.

Procfs'e Yazma
Yazma işlemini şöyle yaparız.
#include<fcntl.h>

main()
{
    int fd=open("/proc/MY_PROC_FILE", O_RDWR);
    write(fd, "linux is awesome", 16);
    return 0;
}
Basit bir procfs modülü
Şöyle yaparız.
int open_callback(struct inode *p, struct file *q)
{
  ...
  return 0;
}

ssize_t write_callback(struct file *p, const char __user *buffer, size_t len,
                       loff_t *s)
{
  ...
  return 0;
}

static struct proc_dir_entry *my_proc_entry;

static struct file_operations fs={
    .open=open_callback,
    .read=read_callback,
    .write=write_callback,
    .release=release_callback
};

static int start(void)
{
  my_proc_entry=proc_create(file_name, 0, NULL, &fs);
  ...
  return 0;
}

static void stop(void)
{
    remove_proc_entry(file_name, NULL);
    printk(KERN_ALERT "proc module unregistered\n");
}

module_init(start);
module_exit(stop);
MODULE_LICENSE("GPL");



Sistem Hakkında Bilgi Veren Dizinler

/proc/bus/usb
Bu dizin ile usb cihazlarının bilgisine erişmek mümkün. lsusb komutu bu dizini okuyor.

/proc/cpuinfo
İşlemcilerin bilgisine ulaşmak için cat /proc/cpuinfo komutunu çalıştırmak yeterli. lscpu komutu cat komutunun alternatifi olarak kullanılabilir.

Bu komutun çıktısı olan "stepping" güç tasarrufu için kullanılan ve işlemcinin frekansını değiştiren o anki katsayıyı gösterir. Intel işlemcilerinde SpeedStep yazısına bakabilirsiniz.

/proc/devices
Bu dizin ile yüklenmiş olan aygıt sürücülerini görmek mümkün. Aygıtlar karakter ve blok olanlar olmak üzere iki ana gruba ayrılıyorlar.

/proc/meminfo
/proc/meminfo yazısına taşıdım

/proc/net/wireless
Sinyal gücünü gösterir.

/proc/uptime
Sistemin ne kadar zamandır ayakta olduğunu gösterir. Uptime başlıklı yazıda uptime komutu ve /proc/uptime dosyası açıklanmış.

/proc/stats
Bu konuyu yazmak lazım.

/proc/timer_list ve /proc/timer_stats
Bu dizinde yaratılmış timer'ların bilgisine erişmek mümkün.

Uygulama Hakkında Bilgi Veren Dizinler

Bu dosya sisteminde kendi uygulamamıza ait bilgilere erişmek için /proc/self/... altındaki dizinlere erişmek gerekir. Eğer bir başka uygulamaya ait bilgilere erişmek istiyorsak /proc/$pid/... altındaki dizinlere erilmeli.

/proc/$pid/fd
File descriptor'lar hakkında bilgi verir. std out akımının /dev/null'a yönlendirildiğin şöyle anlarız.
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>

int main (void)
{
    char link[256];
    ssize_t rval;
    rval = readlink("/proc/self/fd/1", link, sizeof(link));
    link[rval] = '\0';

    if (!strcmp(link, "/dev/null")) {
        assert(!"Redirect to /dev/null not allowed!");
    } else {
        printf("All OK\n");
    }

    return 0;
}

/proc/$pid/exe
Çalışan exe'nin nerede olduğunu gösterir.

/proc/$pid/maps
Bu dizinde mmap ile uygulamanın adres alanına getirilmiş virtual memory ile ilgili bilgiler var.
Bu alanı okuyunca verilen sütunların açıklaması ise burada bulunabilir. Benzer bir açıklama burada.

/proc/$pid/smaps
/proc/$pid/maps'in biraz daha genişletilmiş hali. Burada Private_Dirty alanında sadece uygulama tarafından kullanılan, shared memory olmayan bellek miktarının gösterildiği anlatılmış.
7ffffffe7000-7ffffffff000 rw-p 00000000 00:00 0                          [stack]
Size:                100 kB
Rss:                  20 kB
Pss:                  20 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:        20 kB
Referenced:           20 kB
Anonymous:            20 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB

/proc$pid/status
Vm ile başlayan sütunlarda virtual memory ile ilgili bilgiler sunulur. VmPeak ve VmSize şimdiye kadar en çok ne kadar virtual memory kullanıldığı, ve şu an ne kadar kullanıldığı bilgisini kilobyte birimiyle gösterir.
~$ cat /proc/1782/status | grep Vm
  VmPeak:     935584 kB
  VmSize:     898484 kB
  VmLck:           0 kB
  VmHWM:      257608 kB
  VmRSS:      186812 kB
  VmData:     394328 kB
  VmStk:         220 kB
  VmExe:          44 kB
  VmLib:       61544 kB
  VmPTE:        1224 kB
  VmSwap:          0 kB


Hiç yorum yok:

Yorum Gönder