SORU
26 Temmuz 2009, Pazar


Nasıl okuma/yazma Linux çekirdek modülü içindeki dosyaları?

Bir okumak için bir neden ile ilgili tüm tartışmalar /proc veya bağlantısı yapmak için kullanmayı çekirdek dosyaları, yerine/yazma biliyorum. Neyse yazmak/okumak istiyorum. Ayrıca okudum Driving Me Nuts - Things You Never Should Do in the Kernel.

Ancak, sorun 2.6.30 sys_read() vermez. SYSCALL_DEFINE3 sarılmış değil. Eğer benim modül kullanıyorum, uyarılarını şu olsun:

WARNING: "sys_read" [xxx.ko] undefined!
WARNING: "sys_open" [xxx.ko] undefined!

Açıkçası insmod bağlantı doğru olmaz çünkü modülü yüklenemiyor.

Soru:

  • /Okumayı 2.6.22sys_read()/sys_open() verilmez) sonra çekirdek içinde yazıyorsun?
  • Çekirdek içinde sistem çağrıları makro SYSCALL_DEFINEn() sarılmış kullanmak için nasıl genel olarak?

CEVAP
26 Temmuz 2009, Pazar


Dosya kaçınmalıdır mümkün olduğunda g/Ç bilmelidir. Ana fikri, "derin" ve VFS level functions yerine sistem çağrısını doğrudan işleyicisi çağrı: . seviye gitmektir

İçerir:

#include <linux/fs.h>
#include <asm/segment.h>
#include <asm/uaccess.h>
#include <linux/buffer_head.h>

Bir dosya (open benzer) açılış:

struct file* file_open(const char* path, int flags, int rights) {
    struct file* filp = NULL;
    mm_segment_t oldfs;
    int err = 0;

    oldfs = get_fs();
    set_fs(get_ds());
    filp = filp_open(path, flags, rights);
    set_fs(oldfs);
    if(IS_ERR(filp)) {
        err = PTR_ERR(filp);
        return NULL;
    }
    return filp;
}

Yakın bir dosya (yakın benzer):

void file_close(struct file* file) {
    filp_close(file, NULL);
}

Bir dosya (pread benzer) veri okuma:

int file_read(struct file* file, unsigned long long offset, unsigned char* data, unsigned int size) {
    mm_segment_t oldfs;
    int ret;

    oldfs = get_fs();
    set_fs(get_ds());

    ret = vfs_read(file, data, size, &offset);

    set_fs(oldfs);
    return ret;
}   

Bir dosya (pwrite benzer) için veri yazma:

int file_write(struct file* file, unsigned long long offset, unsigned char* data, unsigned int size) {
    mm_segment_t oldfs;
    int ret;

    oldfs = get_fs();
    set_fs(get_ds());

    ret = vfs_write(file, data, size, &offset);

    set_fs(oldfs);
    return ret;
}

Senkronize bir dosya değişiklikleri (fsync benzer):

int file_sync(struct file* file) {
    vfs_fsync(file, 0);
    return 0;
}

[Değiştir] Aslında, ben daha yeni çekirdek sürümlerinde gitmiş olan file_fsync kullanarak önerdi. Zavallı adam değişikliği önerin için teşekkürler, ama kimin değişikliği reddedildi. Düzenleme yeniden gözden geçirebilirim önce reddedildi.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • kidrauhl

    kidrauhl

    15 Ocak 2007
  • Stanislav Petrov

    Stanislav Pe

    7 ŞUBAT 2009
  • TheDigiCraft

    TheDigiCraft

    25 NİSAN 2011