环境:ubuntu11.04
工具:vim
内核源码:linux-2.6.38.8
Linux向内核添加系统调用其实并不难,简单地来说就是修改内核源码中的一些文件,编译并安装内核,然后写个用户程序调用它验证验证就OK了~~
步骤一:修改3个内核源码文件
第一个文件:/usr/src/linux-2.6.38.8/kernel/sys.c
修改:在最后面添加
asmlinkageintsys_foo(intx)
{
printk("thenunberis:%d!\n",x);
returnx;
}
这个函数就是要添加进内核的系统调用了,功能很简单,仅仅实现的是将传进来的参数打印出来并且返回,注意了,这里用的是printk,不是printf,printk可以说是内核版的printf吧,呵呵~~所以输出的信息不在终端上,而是在系统日志上,使用“dmesg”命令就可查看
第二个文件:/usr/src/linux-2.6.38.8/arch/x86/kernel/syscall_table_32.S
修改:在最后面添加
.longsys_XXX
所以我这里就添加.longsys_foo了
第三个文件:/usr/src/linux-2.6.38.8/arch/x86/include/asm/unistd_32.h
这个文件包含了系统调用号,所以要为我们自己添加的系统调用取一个号(num)放在里面,格式为:“#define__NR_XXXnum”,这个号可不是乱取的,必须是紧接着该列表最后一项取值,比如我的:
修改前:
#define__NR_fanotify_init338
#define__NR_fanotify_mark339
#define__NR_prlimit64340
#ifdef__KERNEL__
#defineNR_syscalls341
#define__ARCH_WANT_IPC_PARSE_VERSION
#define__ARCH_WANT_OLD_READDIR
#define__ARCH_WANT_OLD_STAT
修改后:
#define__NR_fanotify_init338
#define__NR_fanotify_mark339
#define__NR_prlimit64340
#define__NR_foo341
#ifdef__KERNEL__
#defineNR_syscalls342
#define__ARCH_WANT_IPC_PARSE_VERSION
#define__ARCH_WANT_OLD_READDIR
#define__ARCH_WANT_OLD_STAT
注意了,那个号是在#defineNR_syscalls342之前,#define__NR_prlimit64340之后的
步骤二:编译并安装内核
详细步骤请看:http://blog.csdn.net/xuyuanfan77/article/details/7088854
步骤三:写一个用户程序调用该系统调用
#include<linux/unistd.h>
#include<stdio.h>
intmain(){
printf("Thenumberis%d\n",syscall(341,100));
return0;
}
其中syscall的第一个参数“341”就是foo的系统调用号,第二个参数“100”是传进去的参数。接下来编译并运行之。
步骤四:验证的时刻到了
第一个验证:
linuxer@ubuntu:~/Desktop$./foo
Thenumberis100
第二个验证:
linuxer@ubuntu:~/Desktop$dmesg
[1963.829598]thenunberis:100!
分享到:
相关推荐
以linux2.4内核为基础添加用户自己的系统调用。该文档详细介绍了添加系统调用的过程。
linux内核添加系统调用的方法, 含详细过程 操作系统课程设计
题目内容:添加一个系统调用,实现对指定进程的nice值得修改或读取功能,并返回进程最新的nice值及优先级prio。 考察的知识点:在系统中根据需要添加新的系统调用。 问题的关键点:添加的系统调用实现对指定进程的...
介绍了通过添加新文件、或修改源文件的方法添加一个新的系统调用。 本文有添加及编译的详细步骤截图与分析,可作为操作系统课程设计。
Linux内核汉化大揭秘——基于Linux核心的汉字显示.pdf
讲述如何为linux内核添加新的系统调用 内核版本是linux3.4.4 平台是以arm11为核心的S3C6410
linux编译时向内核添加新设备(linux内核编译时向内核添加新设备)
操作系统实验: 通过实验,熟悉Linux 操作系统的使用,掌握构建与...1.向Linux 内核增加新的系统调用,系统调用名称和功能自行定义 2.Linux 新内核的编译、安装和配置 3.编写应用程序以测试新的系统调用并输出测试结果
在linux 2.6.30中添加系统调用,认识linux系统调用运行原理。
Linux® 系统调用 —— 我们每天都在使用它们。不过您清楚系统调用是如何在用户空间和内核之间执行的吗?本文将探究 Linux 系统调用接口(SCI),学习如何添加新的系统调用(以及实现这种功能的其他方法),并介绍与...
在Linux中添加新的系统调用,涉及到Linux内核,以及添加系统调用后的重新编译内核,最后对新的系统调用的测试,本人课程设计亲自实现了!
实验目标:在Linux内核中增加一个系统调用,并编写对应的linux应用程序。利用该系统调用能够遍历系统当前所有进程的任务描述符,并按进程父子关系将这些描述符所对应的进程id(PID)组织成树形结构显示。 实验环境:...
“计算机操作系统”是一门非常重要的专业课程,本教材所介绍的“基于Linux内核的操作系统实验体系”可引导学生与操作系统内核交互以理解其原理。 此资源为操作系统实验指导的教学PPT,内含部分实验代码···
为了在内核态下运行,本实验针对Linux的内核进行修改,增加自定义系统调用函数实现用户态程序对任意进程的nice值进行修改或者读取来进行测试。详细介绍参考:...
实验2 Linux内核编译及系统调用添加.doc
Linux内核实验报告——实验4.pdfLinux内核实验报告——实验4.pdfLinux内核实验报告——实验4.pdfLinux内核实验报告——实验4.pdfLinux内核实验报告——实验4.pdfLinux内核实验报告——实验4.pdfLinux内核实验报告...
提供了linux-2.26-32内核版本的编译及添加系统调用方法
操作系统同步研究——Linux内核同步机制.pdf
linux2.4.16内核升级到2.6.18
操作系统实验——用户态与内核态