커널 공간에서 sys_read()를 올바르게 사용하는 방법

커널 공간에서 sys_read()를 올바르게 사용하는 방법

주어진 입력에 대해 파일을 검색하기 위해 시스템 호출을 작성했습니다. 하지만 내 코드가 sys_read()제대로 작동하지 않아서 작동하지 않습니다.

#include <linux/kernel.h>
#include <linux/unistd.h>
#include <asm/unistd.h>
#include <linux/fcntl.h>
#include <linux/syscalls.h>

asmlinkage long sys_search_phrase(int fd, char *phrase, char *buffer, int line)
{
    printk("Search was here\n");
    char arr[] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
    char *temp = arr;
    int i = 0;
    int temp_line = 1;

    while(sys_read(fd, &temp[i], 1) == 1){
        if(temp[i] == '\n' || temp[i] == 0x0 || temp[i] == '\0'){
            temp[i] = 0;
            if(i != 0){
                //buffer now has a line
                if(line <= 0 && contains(temp, phrase)) {
                    copy(buffer, temp);
                    return temp_line;
                }
                else if(line == temp_line && contains(temp, phrase)) {
                    copy(buffer, temp);
                    return temp_line;
                }
                temp_line++;
            }
            i=0;
            continue;
        }
        i++;
    }
    return -1;
}

그래서 디버그 코드를 사용해 보았는데 printk()내 프로그램이 while루프에 들어가지 않는다는 것을 발견했습니다.

커널 v4.4.202 우분투 16.04

답변1

sys_read()커널의 버퍼를 사용하여 호출 할 수 없으며 두 번째 인수로 사용자 가상 주소가 필요합니다.

커널 API가 있습니다.kernel_read(), 커널 공간에서 사용할 수 있습니다.

관련 정보