【版权声明:尊重原创。转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途】

        应用不能訪问内核的内存空间。为了应用和内核交互信息,内核提供一组接口,通过这组接口。应用能够发送请求,内核能够响应处理该请求,这组接口就是系统调用。

关于内核系统调用的实现查看本博客中这篇文章:

http://blog.csdn.net/shallnet/article/details/47113753
本文章以x86-32为例:
$ uname -a
Linux localhost 2.6.32 #1 SMP Sat Jun 13 23:55:06 CST 2015 i686 i686 i386 GNU/Linux
第一步,在系统调用表中加入一个表项。表中为每个有效的系统调用指定了惟一的系统调用号。系统调用表位于arch/x86/kernel/syscall_table_32.S文件里,在该文件里最后一行加入自己的系统调用表项。例如以下:

        ......
.long sys_preadv
.long sys_pwritev
.long sys_rt_tgsigqueueinfo /* 335 */
.long sys_perf_event_open
.long sys_shallnet

尽管没有明白指定编号,但该系统调用已经按次序分配了337这个系统调用号,接下来就应该加入系统调用号。
第二步,加入系统调用号。在Linux中,每一个系统调用被赋予一个系统调用号。

这样。通过这个独一无二的号就能够关联系统调用。当用户空间的进程运行一个系统调用的时候,这个系统调用号就被用来指明究竟是要运行哪个系统调用。在文件arch/sh/include/asm/unistd_32.h该列表中加入一行#define
__NR_shallnet   337

......
#define __NR_inotify_init1 332
#define __NR_preadv 333
#define __NR_pwritev 334
#define __NR_rt_tgsigqueueinfo 335
#define __NR_perf_event_open 336 #define __NR_shallnet 337 //#define NR_syscalls 337
#define NR_syscalls 338
......

在内核源文件里该行为#define
NR_syscalls 337,在系统调用运行的过程中。system_call()函数会依据该值来对用户态进程的有效性进行检查。假设这个号大于或等于NR_syscalls,系统调用处理程序终止。所以应该将原来的#define NR_syscalls 337改动为#define NR_syscalls 338。


第三步,实现shallnet系统调用。在文件kernel/sys.c最后加入例如以下函数:

SYSCALL_DEFINE0(shallnet)SYSCALL_DEFINE1(shallnet, int, arg)
{
printk(KERN_ALERT"My blog address: \"http://blog.csdn.net/shallnet\"");
return arg + arg;
}

第四步,又一次编译内核。依次运行:

make oldconfig
make bzImage
make modules
make modules_install
make install

第五步,又一次启动系统然后进入刚新编译的系统,编写測试代码例如以下:

#include <stdio.h>
#include <unistd.h>
#include <sys/syscall.h> #define __NR_shallnet 337 int main(int argc, const char *argv[])
{
int ret; ret = syscall(337, 99); printf("shallnet() return: %d\n", ret);
return 0;
}

编译运行该程序例如以下:

$ ./target_bin
shallnet() return: 198 $ demsg
......
My blog address: "http://blog.csdn.net/shallnet"

能够看到我们新加的系统调用运行成功了。

可见建立一个新的系统调用还是非常easy的,可是不提倡这么做,系统调用须要一个系统调用号,须要改动内核代码,改动之后须要又一次编译内核。

linux系统应当尽量避免每出现一个新的抽象就增加一个新的系统调用,通常有其它的方法能够取代系统调用,比方说实现一个设备节点等。

例说linux内核与应用数据通信(一):加入一个系统调用的更多相关文章

  1. 例说linux内核与应用数据通信系列【转】

    转自:http://blog.csdn.net/shallnet/article/details/47865169 版权声明:本文为博主原创文章,未经博主允许不得转载.如果您觉得文章对您有用,请点击文 ...

  2. 例说linux内核与应用数据通信系列

    [版权声明:尊重原创.转载请保留出处:blog.csdn.net/shallnet.文章仅供学习交流,请勿用于商业用途] 本系列通过源代码演示样例解说linux内核态与用户态数据通信的各种方式: 例说 ...

  3. 例说linux内核与应用数据通信(三):读写内核设备驱动文件

    [版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet.文章仅供学习交流.请勿用于商业用途]         读写设备文件也就是调用系统调用read()和write(),系 ...

  4. 例说linux内核与应用数据通信(四):映射设备内核空间到用户态

    [版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet.文章仅供学习交流,请勿用于商业用途]         一个进程的内存映象由以下几部分组成:代码段.数据段.BSS段和 ...

  5. 例说Linux内核链表(一)

    介绍 众所周知,Linux内核大部分是使用GNU C语言写的.C不同于其它的语言,它不具备一个好的数据结构对象或者标准对象库的支持. 所以能够借用Linux内核源代码树的循环双链表是一件非常值得让人高 ...

  6. 例说Linux内核链表(三)

    经常使用的linux内核双向链表API介绍 linux link list结构图例如以下: 内核双向链表的在linux内核中的位置:/include/linux/list.h 使用双向链表的过程,主要 ...

  7. Linux内核设计第三周——构造一个简单的Linux系统

    Linux内核设计第三周 ——构造一个简单的Linux系统 一.知识点总结 计算机三个法宝: 存储程序计算机 函数调用堆栈 中断 操作系统两把宝剑: 中断上下文的切换 进程上下文的切换 linux内核 ...

  8. 《Linux内核分析》 第四节 扒开系统调用的三层皮(上)

    <Linux内核分析> 第四节 扒开系统调用的三层皮(上) 张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com ...

  9. 《Linux内核分析》 第五节 扒开系统调用的三层皮(下)

    <Linux内核分析> 第五节 扒开系统调用的三层皮(下) 20135307 一.给MenusOS增加time和time-asm命令 给MenuOS增加time和time-asm命令需要 ...

随机推荐

  1. rpm2cpio---如何不安装但是获取rpm包中的文件

    如何不安装但是获取rpm包中的文件 使用工具rpm2cpio和cpio rpm2cpio xxx.rpm | cpio -idmv 参数i表示提取文件.v表示指示执行进程,d和make-directo ...

  2. CODEVS——T 1404 字符串匹配

    http://codevs.cn/problem/1404/ 时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解  查看运行结果     题目描述 Desc ...

  3. ShopNC【B2B2C】多用户电商平台系统,带WAP,微商城,圈子,门户

    <ShopNC[B2B2C]多用户电商平台系统,带WAP,微商城,圈子,门户> 早上发了套ShopNC B2B2C多用户商城2014商业版,带微商城,但不带圈子.WAP.圈子和门户,如今发 ...

  4. Linux中配置网桥

    使用kvm虚拟机时,有时候需要自己添加网桥供guest使用. 不使用libvirt来管理的话,可以使用以下方法创建网桥并绑定到物理网卡(RHEL6/Fedora已实验): 1.创建网桥配置文件ifcf ...

  5. 改动GDAL库支持RPC像方改正模型

    近期在做基于RPC的像方改正模型.方便对数据进行測试,改动了GDAL库中的RPC纠正模型,使之能够支持RPC像方改正參数. 以下是RPC模型的公式,rn,cn为归一化之后的图像行列号坐标,PLH为归一 ...

  6. java正則表達式总结

    近期用到的正則表達式 因为近期在做一个android的新闻client.多次用到了正則表達式.因此总结下. 1.使用正則表達式获取Rss资源内的文章内容的图片url 由于在每条新闻浏览的listVie ...

  7. ubuntu下eclipse java ee首次打开提示找不到jdk的问题

    最近想搭建一个本地服务器,方便写一些网络请求相关的demo,遂下载了eclipse  ee版 ( IDEA证书好贵,暂时不想买-=-),下载---解压 一切正常,但是当在terminal下打开ecli ...

  8. Unity 3D 开发 —— 脚本编程

    Unity 相关资源 Unity 官网 :http://www.unity3D.com Unity 论坛 : http://forum.unity3d.com/forum.php Unity 问答 : ...

  9. Kinect 开发 —— 骨骼追踪(下)

    Kinect 连线游戏 在纸上将一些列数字(用一个圆点表示)从小到大用线连起来.游戏逻辑很简单,只不过我们在这里要实现的是动动手将这些点连起来,而不是用笔或者鼠标. 在开始写代码之前,需要明确定义我们 ...

  10. C# XML类学习整理(待补)

    一.读取xml文件内容: #region "获取xml文件内容" //将xml文件加载进来 XDocument xdoc = XDocument.Load("F:\\6. ...