有趣的是,我在网上找不到任何简单的例子。你能分享一个简单的例子吗?我试图通过分析一个例子来理解以下内容。
⦁ Typically,
⦁ a number associated with each system call
⦁ Number used as an index to a table: System Call table
⦁ Table keeps addresses of system calls (routines)
⦁ System call runs and returns
⦁ Caller does not know system call implementation
⦁ Just knows interface
答案 0 :(得分:6)
这取决于您要为其添加系统调用的体系结构,或者是否要为所有体系结构添加系统调用。我将解释一种为ARM添加系统调用的方法。
mysyscall
。 选择一个系统调用号码。 在arch/arm/include/asm/unistd.h
中,记下每个系统调用如何分配特定号码(__NR__SYSCALL_BASE+<number>
)它。为系统调用选择一个未使用的号码。让我们选择系统调用号码223.然后添加:
#define __NR_mysyscall (__NR_SYSCALL_BASE+223
其中索引223将位于该头文件中。这会将数字223分配给ARM体系结构上的系统调用。
修改特定于体系结构的系统调用表 。在linux/arch/arm/kernel/calls.S
中,将与syscall 223对应的行更改为:
CALL(sys_mysyscall)
添加您的函数原型。 假设您要添加非体系结构特定的系统调用。编辑文件:include/linux/syscalls.h
并添加系统调用的原型:
asmlinkage long sys_mysyscall(struct dummy_struct *buf);
如果您想专门为ARM添加它,请执行以下操作,但在此文件中除外:arch/arm/kernel/sys_arm.c
。
在某处实施您的系统调用。 随时创建一个文件。例如,在kernel/
目录中。你至少需要:
#include <linux/syscalls.h>
...
SYSCALL_DEFINE1(mysyscall, struct dummy_struct __user *, buf)
{
/* Implement your syscall */
}
请注意宏SYSCALL_DEFINE1
。末尾的数字应与系统调用的输入参数对应。在这种情况下,我们的系统调用只有1个参数,因此您使用SYSCALL_DEFINE1
。如果它有两个参数,您可以使用SYSCALL_DEFINE2
等。
不要忘记将对象(.o)文件添加到您放置目录的Makefile中。
mysyscall()
调用系统调用。您需要使用syscall()
函数,该函数将系统调用号作为其第一个参数:struct dummy_struct *buf = calloc(1, sizeof(buf));
int res = syscall(223, buf);
请注意,这是针对ARM的。其他架构的流程非常相似。
编辑:不要忘记将您的系统调用文件添加到kernel /中的Makefile中。