【linux内核设计与实现-章节代码学习系列-系统调用】ubuntu 12.03 下系统调用实现

来源:互联网 发布:小数据时代的随机采样 编辑:程序博客网 时间:2024/04/28 01:11

【接下来的一段时间将会陆陆续续把我学习《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;}


0 0