我理解的系统调用,用户进程和内核是内核提供了一个接口进行交互。除了异常和下降外。内核系统调用是唯一合法入境。像/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等)。


版权声明:本文博主原创文章,博客,未经同意不得转载。

Linux核心设计依据(七)系统调用的更多相关文章

  1. Linux核心设计依据(六)该块I/O一层

    块设备是能随机存取装置固定大小的数据表设备.如硬盘:字符设备(如串口和键盘)它是按照字符流进入有序进行.不同之处在于是否足够的随机存取数据--这时候,你可以随心所欲地从一个位置跳到访问设备和位置.复杂 ...

  2. Linux系统——常见的系统调用

    本文列出了大部分常见的Linux系统调用,并附有简要中文说明. 以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数.这可能是你在互联网上所能看到的唯一一篇中文注释的 ...

  3. Linux学习笔记(七) 查询系统

    1.查看命令 (1)man 可以使用 man 命令名称 命令查看某个命令的详细用法,其显示的内容如下: NAME:命令名称 SYNOPSIS:语法 DESCRIPTION:说明 OPTIONS:选项 ...

  4. Linux核心命令

    Linux核心命令 strace(查看系统调用的一个过程) 例:strace cat /test.txt netstat perf top pidstat mpstat dstat vmstat sl ...

  5. [转帖]Linux分页机制之分页机制的演变--Linux内存管理(七)

    Linux分页机制之分页机制的演变--Linux内存管理(七) 2016年09月01日 20:01:31 JeanCheng 阅读数:4543 https://blog.csdn.net/gatiem ...

  6. 20135302魏静静——linux课程第七周实验及总结

    linux课程第七周实验及总结 实验及学习总结 1. 编译链接的过程和ELF可执行文件格式(以hello为例) GNU编译系统编译源码: 首先,运行C预处理器(cpp),将.c文件翻译成.i文件——g ...

  7. linux内核基础(系统调用,简明)

    内核基础(系统调用) 在说系统调用之前.先来说说内核是怎么和我们交互的.或者说是怎么和我们产生交集的. 首先,内核是用来控制硬件的仅仅有内核才干直接控制硬件,所以说内核非常重要,假设内核被控制那么电脑 ...

  8. 举例说,Linux核心名单(两)

    使用列表 我认为最好的方式,成为熟悉的核心列表功能是看一些简单的例子,素材去更好的理解链表. 以下是一个样例.包括创建.加入.删除和遍历链表. <span style="font-si ...

  9. 给Linux内核增加一个系统调用的方法(转)

    作者:chenjieb520 给Linux内核增加一个系统调用的方法    为了更加好地调试linux内核,笔者的实验均在mini6410的arm板上运行的.这样做的原因,第一是因为本人是学嵌入式的, ...

随机推荐

  1. [Python网络编程]gevent httpclient以及网页编码

    之前看到geventhttpclient这个项目,https://github.com/gwik/geventhttpclient,官方文档说非常快,因为响应使用了C的解析,所以我一直想把这玩意用到项 ...

  2. 【牛刀小试2】password保

    ]password保 主要知识: 1.        while循环 2.        do-while循环 3.        if-else 4.        strcmp()函数 [充电一下 ...

  3. SSH证书登录方式(无password验证登录)

    经常在工作中须要在各个Linux机间进行跳转,每次password的输入成了麻烦,并且也不安全.在实际使用中,在windows下常使用secureCRT工具或teraterm工具进行SSH登录.以及实 ...

  4. uva 10817 Headmaster&#39;s Headache 出发dp 位计算

    出发dp,用在一些议题的操作非常~  给出s个课程.m个教师.n个求职者,教师必须招聘.然后招聘一些求职者,使得每一门课都至少有两个老师能教.问题就转换成了招聘哪些求职者使得花费最少.由于s范围小于8 ...

  5. 使用form的target属性屏蔽url跳

    target: 指定公开赛, action URL. 关键点: 让target指向隐藏的iframe demo: form.jsp <%@ page language="java&qu ...

  6. json学习初体验--第三者jar包实现bean、List、map创json格式

    1.的需要jar包裹json-lib.jar 下载链接: http://sourceforge.net/projects/json-lib/files/json-lib/ 此包还须要下面的依赖包, c ...

  7. fcitx

    安装完成后首先面对的问题是全英文无法显示汉字和输入汉字的问题.需要找到光盘上的2个中文支持字体包安装上即可.文件名如下,注意不同版本文件明后面数字部分可能会不同,其代表版本号.下面是Red Hat E ...

  8. POJ 3177 Redundant Paths - from lanshui_Yang

    Description In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numb ...

  9. 它们的定义dialog

    (1)你需要准备自己的自定义对话框样式,是一个布局文件 <?xml version="1.0" encoding="utf-8"? > <Li ...

  10. JavaScript变量作用域和内存问题(二)

    执行环境是js中特别重要的概念,是指变量或者函数可以访问其他数据,定义自己的行为.每个执行环境都有一个与之相对应的变量对象,执行环境中定义的所有变量和函数都保存在这个变量中,我们看不到这个变量,但是后 ...