如何在内核空间正确使用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 Ubuntu 16.04

答案1

您无法sys_read()使用内核中的缓冲区进行调用,它需要第二个参数的用户虚拟地址。

有一个内核API,kernel_read(),您可以从内核空间使用它。

相关内容