【发布时间】:2019-08-17 00:43:41
【问题描述】:
所以我的任务是在 linux 中编写我自己的系统调用。此系统调用将采用指向字符数组的指针并将所有 o 替换为 0。系统调用将返回执行的替换次数。如果字符串大小大于 128 字节,则返回 -1。所以我已经实现了一个不同的系统调用,按照这个链接中的步骤完全可以正常工作。 https://medium.com/anubhav-shrimal/adding-a-hello-world-system-call-to-linux-kernel-dad32875872 。我已经仔细检查了一切,一切似乎都很好,所以我相信我编写的系统调用或测试它时有问题。假设是这种情况,我的系统调用有什么问题吗?我认为这可能与字符指针或类似的东西有关。
这是我的系统调用。
#include <linux/kernel.h>
asmlinkage int sys_my_syscall2(char * string){
if(sizeof(string) > 128){
return -1;
}
int x, count = 0;
for(x = 0; x < sizeof(string); x++){
if(string[x] == 'o'){
string[x] = '0';
count++;
}
}
return count;
}
这是我的测试文件。
#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
int main() {
int syscall2 = syscall(333, "Hello World");
printf("Syscall 333 printed %d", syscall2);
return 0;
}
333 是我的系统调用的编号。运行测试文件后,它会暂停很长时间,并且似乎冻结了。即使在尝试控制-C 之后,程序似乎仍然可以运行。这些文件有问题吗?
【问题讨论】:
-
sizeof(string)并没有按照你的想法去做。 -
您正在将 const 字符串传递给将修改您的内存的系统调用。您是否尝试过使用可写内存缓冲区?
-
您有三个问题:第一个是指针的
sizeof给出了指针 的大小,而不是它指向的内容。第二个问题是您要迭代的数据(字符串)在用户空间中,需要复制到内核空间(尽管我不确定)。第三个问题是文字字符串是只读字符数组,不能修改。
标签: c linux system-calls