添加一个Linux系统调用汇编.pdfVIP

  • 3
  • 0
  • 约7.51千字
  • 约 7页
  • 2021-12-08 发布于福建
  • 举报
添加一个 Linux 系统调用 添加一个新系统调用主要是一些程序性的操作, 但应该注意几件事情。 本节将介 绍几个系统调用的构造,从而展示它们的实现和用户空间应用程序对它们的使 用。 向内核中添加新系统调用,需要执行 3 个基本步骤: 1. 添加新函数。 2. 更新头文件。 3. 针对这个新函数更新系统调用表。 注意: 这个过程忽略了用户空间的需求,我将稍后介绍。 最常见的情况是,您会为自己的函数创建一个新文件。不过,为了简单起见,我 将自己的新函数添加到现有的源文件中。清单 1 所示的前两个函数,是系统调 用的简单示例。清单 2 提供了一个使用指针参数的稍微复杂的函数。 清单 1. 系统调用示例的简单内核函数 asmlinkage long sys_getjiffies ( void ) { return (long)get_jiffies_64(); } asmlinkage long sys_diffjiffies ( long ujiffies ) { return (long)get_jiffies_64() - ujiffies; } 在清单 1 中,我们为进行 jiffies 监视提供了两个函数。(有关 jiffies 的 更多信息,请参看侧栏 “Kernel jiffies ”)。第一个函数会返回当前 jiffy , 而第二个函数则返回当前值与所传递进来的值之间的差值。 注意 asmlinkage 修 饰符的使用。 这个宏 (在 linux/include/asm-i386/linkage.h 中定义)告诉编 译器将传递栈中的所有函数参数。 清单 2. 系统调用示例的最后内核函数 asmlinkage long sys_pdiffjiffies ( long ujiffies, long __user *presult ) { long cur_jiffies = (long)get_jiffies_64(); long result; int err = 0; if (presult) { result = cur_jiffies - ujiffies; err = put_user ( result, presult ); } return err ? -EFAULT : 0; } 清单 2 给出了第三个函数。这个函数使用了两个参数:一个 long 类型,以及 一个指向被定义为 __user 的 long 的指针。 __user 宏简单告诉编译器(通过 noderef )不应该解除这个指针的引用 (因为在当前地址空间中它是没有意义的) 。 这个函数会计算这两个 jiffies 值之间的差值,然后通过一个用户空间指针将 结果提供给用户。 put_user 函数将结果值放入 presult 所指定的用户空间位 置。如果在这个操作过程中出现错误, 将立即返回, 您也可以通知用户空间调用 者。 对于步骤 2 来说,我对头文件进行了更新:在系统调用表中为这几个新函数安 排空间。对于本例来说,我使用新系统调用号更新了 linux/include/asm/unistd.h 头文件。更新如清单 3 中的黑体所示。 清单 3. 更新 unistd.h 文件为新系统调用安排空间 #define __NR_getcpu 318 #define __NR_epoll_pwait 319 #define __NR_getjiffies

文档评论(0)

1亿VIP精品文档

相关文档