我添加了一个简单helloworld
系统调用我的Linux内核。
sys_helloworld
#include <linux/kernel.h>
asmlinkage long sys_helloworld(void)
{
printk("Hello world\n");
return 0;
}
它只是打印出Hello world
内核日志。
我叫sys_helloworld
系统调用就像这样:
#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
int main()
{
long int a = syscall(314); // 314 is the line number of sys_helloworld in syscall table
printf("System call sys_helloworld returned %ld\n", a);
return 0;
}
上述程序成功打印Hello world
在内核日志。
我的问题 :
我如何获得的输出sys_hello
(它打印Hello world
内核日志)在我的计划?
您应该增加两个参数的系统调用:一个缓冲区写入,和它的大小。 然后你可以使用snprintf()
来打印你想要的任何字符串。 你一定要确保使用正确的系统调用定义宏。 因为你将要2个参数,我们需要SYSCALL_DEFINE2
在这里:
#include <linux/kernel.h> /* For snprintf() */
#include <sys/syscall.h> /* For SYSCALL_DEFINE* macros */
SYSCALL_DEFINE2(sys_helloworld, char *, buff, size_t, buff_sz)
{
snprintf(buff, buff_sz, "Hello world\n");
return 0;
}
为了完整,并根据上下文,你可能要改变返回值的东西,可以让你知道字符串是否被截断或没有。
用户代码可以这样称呼它:
#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
int main()
{
char buf[32];
long int a = syscall(314, buf, sizeof(buf));
printf("System call sys_helloworld returned %ld\n", a);
printf("buf = %s\n", buf);
return 0;
}
需要注意的是一般都比较好风格使用SYSCALL_DEFINE*
宏来定义你的系统调用,而不是手工输入的asmlinkage long ....
,即使是不带参数(你可以使用一个系统调用SYSCALL_DEFINE0
)。 这些宏定义中include/sys/syscall.h
,你应该使用它们。