- 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
您可能关注的文档
最近下载
- 2026开封市第三届职业技能大赛汽车技术(世赛选拔)项目技术工作文件.pdf VIP
- 站用交直流电源系统技术规范第3部分:直流电源系统.pdf VIP
- 2024年初级会计职称《经济法基础》精讲课件.pptx VIP
- 2025年湖南机电职业技术学院单招职业技能测试题库及参考答案.docx VIP
- 2025年浙江机电职业技术学院单招(语文)测试试卷.docx VIP
- 泰国和中国合同模板(3篇).docx VIP
- 2025年湖南机电职业技术学院单招职业技能测试题库参考答案.docx VIP
- (2026春新版)人教版二年级数学下册《第三单元 万以内数的认识》教案.docx VIP
- 四年级小学下书法设计教案.doc VIP
- 烟气余热利用的热管式换热器设计(毕业论文).docx VIP
原创力文档

文档评论(0)