我编写了一个系统调用来搜索文件中的给定输入。但我的代码无法正常工作,因为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()
,您可以从内核空间使用它。