简单系统调用实现示例?

时间:2015-01-24 13:53:43

标签: operating-system kernel system

有趣的是,我在网上找不到任何简单的例子。你能分享一个简单的例子吗?我试图通过分析一个例子来理解以下内容。

⦁   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

1 个答案:

答案 0 :(得分:6)

这取决于您要为其添加系统调用的体系结构,或者是否要为所有体系结构添加系统调用。我将解释一种为ARM添加系统调用的方法。

  1. 为您的系统调用选择一个名称。例如,mysyscall
  2. 选择一个系统调用号码。 arch/arm/include/asm/unistd.h中,记下每个系统调用如何分配特定号码(__NR__SYSCALL_BASE+<number>)它。为系统调用选择一个未使用的号码。让我们选择系统调用号码223.然后添加:

    #define __NR_mysyscall (__NR_SYSCALL_BASE+223

    其中索引223将位于该头文件中。这会将数字223分配给ARM体系结构上的系统调用。

  3. 修改特定于体系结构的系统调用表 。在linux/arch/arm/kernel/calls.S中,将与syscall 223对应的行更改为:

    CALL(sys_mysyscall)

  4. 添加您的函数原型。 假设您要添加非体系结构特定的系统调用。编辑文件:include/linux/syscalls.h并添加系统调用的原型:

    asmlinkage long sys_mysyscall(struct dummy_struct *buf);

    如果您想专门为ARM添加它,请执行以下操作,但在此文件中除外:arch/arm/kernel/sys_arm.c

  5. 在某处实施您的系统调用。 随时创建一个文件。例如,在kernel/目录中。你至少需要:

  6. #include <linux/syscalls.h>
    ...
    SYSCALL_DEFINE1(mysyscall, struct dummy_struct __user *, buf)
    {
        /* Implement your syscall */
    }
    

    请注意宏SYSCALL_DEFINE1。末尾的数字应与系统调用的输入参数对应。在这种情况下,我们的系统调用只有1个参数,因此您使用SYSCALL_DEFINE1。如果它有两个参数,您可以使用SYSCALL_DEFINE2等。

    不要忘记将对象(.o)文件添加到您放置目录的Makefile中。

    1. 编译新内核并进行测试。 您尚未修改C库,因此无法使用mysyscall()调用系统调用。您需要使用syscall()函数,该函数将系统调用号作为其第一个参数:
    2. struct dummy_struct *buf = calloc(1, sizeof(buf));   
      int res = syscall(223, buf);
      

      请注意,这是针对ARM的。其他架构的流程非常相似。

      编辑:不要忘记将您的系统调用文件添加到kernel /中的Makefile中。