【接下来的一段时间将会陆陆续续把我学习《linux内核设计与实现》的部分章节的代码拿来分享,书上的内容就不说了,主要就是结合代码理解一下,编一编玩一玩。欢迎大家共同学习进步】
ubuntu下加系统调用出奇的奇怪,你按照书上的以及网上做法保证你找不到相应的文件,其实实现并不难,但是就是找不到应该修改的系统文件,让人头疼。。
首先说明的是,实现一个系统调用需要修改的部分有三个。
1.、kernel/sys.c 下添加你的系统调用的函数内容
2. 在unistd.h中定义你的系统调用的系统调用号
3. 在syscall.h中写下你的系统调用函数声明
下面慢慢来讲解,加上图片就会看到具体的修改文件的路径在哪里了:
1.系统调用函数需要写到核心的内核映像中,这里大部分选择的是kernel/sys.c,但是如果功能与调度有关加入kernel/sched.c 所以根据自己需要加入函数内容。看下图,具体的文件路径看清楚喽。
2.在unistd.h中,这个文件的具体位置是根据你的计算机体系结构有关,一般电脑就是x86结构。看一下就知道这里根据你电脑的32、64位选择不同的文件修改,楼主的是64位。
在这个最后面加入你的函数名字,例如__NR_spiritcall,前面要固定的加入__NR_,和sys根据他的规则写~不啰嗦了。
3.在syscall.h中加入函数声明
函数前面加入asmlinkage 返回值根据自己的函数写,一般系统调用返回类型是long。
ok,系统调用需要重新编译内核,并且在编译内核之前需要下载内核源码,这些工作是你最开始应该做的。这些楼主就不多啰嗦了~~
给你们一个网站,参考一下
http://www.linuxidc.com/Linux/2013-06/85335.htm
然后编译好了之后就是在你的程序中调用你的系统调用了~
#include<stdio.h>
#inlcude<unistd.h>
int main()
{
printf(“%d\n%d\n”,syscall(341,1),syscall(341,0));//341就是系统调用号,之后的是函数参数,最多5个
return 0;
}