我理解的系统调用就是内核提供的一组用户进程与内核进行交互的接口。除异常和陷入外,系统调用是内核唯一的合法入口。像/proc也是通过系统调用进行访问的。
系统调用的意义:
- 让用户进程受限地访问硬件设备
- 为用户空间提供一种硬件的抽象接口
- 提供了创建新进程并与已有进程进行通信的机制
- 提供了申请操作系统其他资源的能力
- 保证系统稳定可靠,避免应用程序恣意妄为
系统调用的基本原理:
系统调用通常的入口是C库中定义的函数,也可以是自定义的函数(通过syscall进行调用)。每个系统调用被赋予一个系统调用号,通过这个独一无二的号就可以关联系统调用。如果一个系统调用被删除,它所占用的系统调用号也不允许被回收利用,否则,以前编译过的代码会调用这个系统调用,但事实上却调用另一个系统调用。内核中用sys_call_table记录所有已注册过的系统调用。
既然系统调用要从用户空间切换到内核态,那应用程序是如何通知内核的?软中断。通过引发一个异常来促使系统切换到内核态去执行异常处理程序,不过这里异常处理程序就是系统调用的处理程序。在x86上用int 0x80进行软中断的触发,执行第128号异常处理程序system_call()。
系统调用添加过程:
- 实现自定义的系统调用并编译进内核映像,可以放在kernel/sys.c文件中,也可以依据具体功能放在相关的文件中。实现格式如下:
asmlinkage long sys_mysyscall(void)
{
...
}
- 在系统调用表(entry.S)的最后加入一个表项,本例中为.long sys_mysyscall,其对应的系统调用号(338)为其在文件中的次序。
- 对于所支持的各种体系结构,系统调用号都必须定义于asm/unistd.h中——#define __NR_mysyscall 338。
从用户空间访问系统调用
拿系统调用open()来说,
我们可以借助C库,以
long open(const char *filename, int flags, int mode);
的形式调用此系统调用。也可以不靠库支持:
#define NR_open 5
_syscall3(long, open, const char*, filename, int, flags, int, mode);
用宏的方式,这样在我们的程序中,不用引入C头文件,直接使用open()即可。
常用系统调用
- exec
- fork
- open
- reboot
- getpid
- read
- write
- ioctl
与一般函数的区别
- 系统调用由操作系统核心提供,运行于内核状态,而库函数或自定义函数由用户调用,运行于用户态。
- 部分libc库函数的实现借助系统调用(如printf调用了write这样的系统调用),而另一些则不会使用系统调用(如strlen, strcat, memcpy等)。
分享到:
相关推荐
以linux2.4内核为基础添加用户自己的系统调用。该文档详细介绍了添加系统调用的过程。
操作系统实验: 通过实验,熟悉Linux 操作系统的使用,掌握构建与...1.向Linux 内核增加新的系统调用,系统调用名称和功能自行定义 2.Linux 新内核的编译、安装和配置 3.编写应用程序以测试新的系统调用并输出测试结果
Linux内核中增加一个系统调用.pdfLinux内核中增加一个系统调用.pdfLinux内核中增加一个系统调用.pdfLinux内核中增加一个系统调用.pdfLinux内核中增加一个系统调用.pdfLinux内核中增加一个系统调用.pdf
在Linux中添加新的系统调用,涉及到Linux内核,以及添加系统调用后的重新编译内核,最后对新的系统调用的测试,本人课程设计亲自实现了!
介绍了通过添加新文件、或修改源文件的方法添加一个新的系统调用。 本文有添加及编译的详细步骤截图与分析,可作为操作系统课程设计。
实验目标:在Linux内核中增加一个系统调用,并编写对应的linux应用程序。利用该系统调用能够遍历系统当前所有进程的任务描述符,并按进程父子关系将这些描述符所对应的进程id(PID)组织成树形结构显示。 实验环境:...
讲述如何为linux内核添加新的系统调用 内核版本是linux3.4.4 平台是以arm11为核心的S3C6410
在 Linux 内核中增加一个系统调用,并编写对应的 Linux 应用程序。利用该系统调用能够遍历系统当前 所有进程的任务描述符,并按进程父子关系将这些描述符所对应的进程 id(PID)组织成树形结构显示。 整个程序的构思...
linux内核知识系列:系统调用 华嵌智能提供 www.embedded-cn.com http://embedded-cn.taobao.com
在linux 2.6.30中添加系统调用,认识linux系统调用运行原理。
题目内容:添加一个系统调用,实现对指定进程的nice值得修改或读取功能,并返回进程最新的nice值及优先级prio。 考察的知识点:在系统中根据需要添加新的系统调用。 问题的关键点:添加的系统调用实现对指定进程的...
主要描述linux内核 描述linux内核 方便调用linux内核
linux系统调用 和 进程 pdf 文档
linux内核添加系统调用的方法, 含详细过程 操作系统课程设计
为了在内核态下运行,本实验针对Linux的内核进行修改,增加自定义系统调用函数实现用户态程序对任意进程的nice值进行修改或者读取来进行测试。详细介绍参考:...
Linux命令行与shell脚本编程、Linux C库函数及系统调用编程、Linux内核分析即应用、Debian(Ubuntu、Deepin)操作系统爬坑.zip Linux命令行与shell脚本编程、Linux C库函数及系统调用编程、Linux内核分析即应用、...
北大计算机系考研资料 增补资料3:北大操作系统大题最长考内容——之中断和系统调用,一般的教材不包括,但重要且常考
此例为linux 内核模块相互调用实例,亲自编写,开发linux 驱动理解内核工作原理必备
Linux命令行与shell脚本编程、Linux C库函数及系统调用编程、Linux内核分析即应用、Debian(Ubuntu、Deepin)操作系统爬坑.zip Linux命令行与shell脚本编程、Linux C库函数及系统调用编程、Linux内核分析即应用、...
Linux® 系统调用 —— ...不过您清楚系统调用是如何在用户空间和内核之间执行的吗?本文将探究 Linux 系统调用接口(SCI),学习如何添加新的系统调用(以及实现这种功能的其他方法),并介绍与 SCI 有关的一些工具。