例说linux内核与应用数据通信(一):加入一个系统调用
应用不能訪问内核的内存空间。为了应用和内核交互信息,内核提供一组接口,通过这组接口。应用能够发送请求,内核能够响应处理该请求,这组接口就是系统调用。
关于内核系统调用的实现查看本博客中这篇文章:
$ uname -a
Linux localhost 2.6.32 #1 SMP Sat Jun 13 23:55:06 CST 2015 i686 i686 i386 GNU/Linux
......
.long sys_preadv
.long sys_pwritev
.long sys_rt_tgsigqueueinfo /* 335 */
.long sys_perf_event_open
.long sys_shallnet
这样。通过这个独一无二的号就能够关联系统调用。当用户空间的进程运行一个系统调用的时候,这个系统调用号就被用来指明究竟是要运行哪个系统调用。在文件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。
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"
能够看到我们新加的系统调用运行成功了。
linux系统应当尽量避免每出现一个新的抽象就增加一个新的系统调用,通常有其它的方法能够取代系统调用,比方说实现一个设备节点等。
例说linux内核与应用数据通信(一):加入一个系统调用的更多相关文章
- 例说linux内核与应用数据通信系列【转】
转自:http://blog.csdn.net/shallnet/article/details/47865169 版权声明:本文为博主原创文章,未经博主允许不得转载.如果您觉得文章对您有用,请点击文 ...
- 例说linux内核与应用数据通信系列
[版权声明:尊重原创.转载请保留出处:blog.csdn.net/shallnet.文章仅供学习交流,请勿用于商业用途] 本系列通过源代码演示样例解说linux内核态与用户态数据通信的各种方式: 例说 ...
- 例说linux内核与应用数据通信(三):读写内核设备驱动文件
[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet.文章仅供学习交流.请勿用于商业用途] 读写设备文件也就是调用系统调用read()和write(),系 ...
- 例说linux内核与应用数据通信(四):映射设备内核空间到用户态
[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet.文章仅供学习交流,请勿用于商业用途] 一个进程的内存映象由以下几部分组成:代码段.数据段.BSS段和 ...
- 例说Linux内核链表(一)
介绍 众所周知,Linux内核大部分是使用GNU C语言写的.C不同于其它的语言,它不具备一个好的数据结构对象或者标准对象库的支持. 所以能够借用Linux内核源代码树的循环双链表是一件非常值得让人高 ...
- 例说Linux内核链表(三)
经常使用的linux内核双向链表API介绍 linux link list结构图例如以下: 内核双向链表的在linux内核中的位置:/include/linux/list.h 使用双向链表的过程,主要 ...
- Linux内核设计第三周——构造一个简单的Linux系统
Linux内核设计第三周 ——构造一个简单的Linux系统 一.知识点总结 计算机三个法宝: 存储程序计算机 函数调用堆栈 中断 操作系统两把宝剑: 中断上下文的切换 进程上下文的切换 linux内核 ...
- 《Linux内核分析》 第四节 扒开系统调用的三层皮(上)
<Linux内核分析> 第四节 扒开系统调用的三层皮(上) 张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com ...
- 《Linux内核分析》 第五节 扒开系统调用的三层皮(下)
<Linux内核分析> 第五节 扒开系统调用的三层皮(下) 20135307 一.给MenusOS增加time和time-asm命令 给MenuOS增加time和time-asm命令需要 ...
随机推荐
- 学习NLP:《自然语言处理原理与技术实现(罗刚)》PDF+代码
自然语言处理技术已经深入我们的日常生活.我们经常用到的搜索引擎就用到了自然语言理解等自然语言处理技术.自然语言处理是一门交叉学科,涉及计算机.数学.语言学等领域的知识. <自然语言处理原理与技术 ...
- Windows系统的关机、休眠和睡眠状态究的区别
原文:Windows系统的关机.休眠和睡眠状态究的区别 相信有些小伙伴跟我一样,对电脑的一些常用操作或名词不太熟悉,今天我们就简单来聊聊电脑的关机.休眠和睡眠状态究竟有何区别吧! 如果你在电脑左下角的 ...
- LoadRunner使用教程
1.了解Loadrunner 1.1 LoadRunner 组件有哪些? LoadRunner 包含下列组件: ➤ 虚拟用户生成器用于捕获最终用户业务流程和创建自动性能测试脚本(也称为虚拟用户脚本). ...
- Maintaining processor resources during architectural events
In one embodiment of the present invention, a method includes switching between a first address spac ...
- Erlang简单并行server
Erlang简单并行服务器 (金庆的专栏) Erlang并行服务器为每一个Tcp连接创建相应的连接进程,处理client数据. 參考 Erlang程序设计(第2版)17.1.3 顺序和并行服务器 并行 ...
- python Tricks —— list 镜像复制与 list comprehension 列表解析的顺序
0. 对 list 镜像复制,a = [1, 2, 3] ⇒ [1, 2, 3, 3, 2, 1] a*2 ⇒ a = [1, 2, 3, 1, 2, 3] a.extend(reversed(a)) ...
- IOS应用在ios7(iPhone5/iPhone5s)上不能全屏显示
前言 [IOS应用在iOS7系统或者iPhone5/iPhone5s上不能全屏显示,应用画面上下各有1条黑色,但是在其他系统或者型号的手机上却是正常显示 Paste_Image.png Paste_I ...
- Sparse Autoencoder(一)
Neural Networks We will use the following diagram to denote a single neuron: This "neuron" ...
- Kinect 开发 —— 控制PPT播放
实现Kinect控制幻灯片播放很简单,主要思路是:使用Kinect捕捉人体动作,然后根据识别出来的动作向系统发出点击向前,向后按键的事件,从而使得幻灯片能够切换. 这里的核心功能在于手势的识别,我们在 ...
- 源码安装 ipython
https://blog.csdn.net/huobanjishijian/article/details/51470898