IT이야기

Linux 커널 모듈 내의 파일 읽기/쓰기

cyworld 2022. 7. 25. 22:44
반응형

Linux 커널 모듈 내의 파일 읽기/쓰기

커널에서 파일을 읽고 쓰지 않는 이유에 대한 모든 논의를 알고 있습니다.그 대신 /proc 또는 netlink를 사용하여 파일을 읽는 방법을 알고 있습니다.어쨌든 읽고 쓰고 싶다.Driving Me Nuts - 커널에서 절대 해서는 안 되는 것들도 읽었습니다.

문제는 이 수출되지 입니다.sys_read()오히려 로 싸여 있다.SYSCALL_DEFINE3모듈에서 사용하면 다음과 같은 경고가 나타납니다.

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

론. 뻔. obviously. obviously.insmod링크가 올바르게 실행되지 않기 때문에 모듈을 로드할 수 없습니다.

질문:

  • 커널 (여기서 2.6.22는 / 쓰기)sys_read()/sys_open()(export)
  • SYSCALL_DEFINEn()맹이안??? ??

커널 4. 이후 버전 4.14vfs_read ★★★★★★★★★★★★★★★★★」vfs_write함수는 더 이상 모듈에서 사용하기 위해 내보내지 않습니다.대신 커널의 파일 액세스 전용 기능이 제공됩니다.

# Read the file from the kernel space.
ssize_t kernel_read(struct file *file, void *buf, size_t count, loff_t *pos);

# Write the file from the kernel space.
ssize_t kernel_write(struct file *file, const void *buf, size_t count,
            loff_t *pos);

ㅇㅇㅇㅇ.filp_open사용자 공간 문자열을 더 이상 받아들이지 않기 때문에 커널에 직접 액세스하기 위해 사용할 수 있습니다(와 함께 춤을 추지 않고).set_fs를 참조해 주세요.

가능하면 Linux 커널 내에서 파일 I/O를 사용하지 않도록 해야 합니다.주요 아이디어는 시스템 핸들러가 아닌 VFS 수준의 함수를 직접 호출하는 것입니다.

내용:

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

파일 열기(열기와 유사):

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;
}

파일 닫기(닫기와 유사):

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

파일에서 데이터 읽기(사전 광고와 유사):

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;
}   

파일에 데이터 쓰기(pwrite와 유사):

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;
}

동기화에 의해 파일이 변경됩니다(fsync와 유사).

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

[편집] 원래 새로운 커널 버전에서는 없어진 file_fsync를 사용할 것을 제안했습니다.변화를 제안했지만 거절당한 가난한 사람 덕분이다.제가 검토하기도 전에 편집이 거부되었습니다.

언급URL : https://stackoverflow.com/questions/1184274/read-write-files-within-a-linux-kernel-module

반응형