我理解的系统调用,用户进程和内核是内核提供了一个接口进行交互。除了异常和下降外。内核系统调用是唯一合法入境。像/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. Java 并发专题 : CyclicBarrier 打造一个安全的门禁系统

    继续并发专题~ 这次介绍CyclicBarrier:看一眼API的注释: /** * A synchronization aid that allows a set of threads to all ...

  2. 【夸QT在十五】ctkPluginFrameWork插件系统Windows编译器

    采用ctkPluginFramework作为一个插件系统开发框架确实有很多优点. 有些车站最近收到的一封信,每个人都想用ctkPluginFramework但我不知道如何建立,本教程对谈ctkPlug ...

  3. VS2010中使用CL快速 生成DLL的方法

    方案一: 1.命令行中输入cl example.cpp,生成example.obj和example.lib文件.有可能还会提示“没有入口点”的错误.这是因为我们的CPP中是要生成dll文件的,并没有m ...

  4. effective c++ 条款10 handle assignment to self operator =

    非强制性,但是个好习惯 当使用连锁赋值时很有用 x=y=z=10; class Window { public: Window& operator=(int size) { ... retur ...

  5. 原生javascript与jquery 的比较

    JavaScript的优点和缺点: 优点: 性能:由于JavaScript运行在客户端,节省了web服务器的请求时间和带宽 轻量级的脚本语言,比较容易学习 运行在用户机器上,运行结果和处理相对比较快. ...

  6. (五岁以下儿童)NS3样本演示:桥模块演示样品csma-bridge.cc凝视程序

    (五岁以下儿童)NS3:桥模块演示样品csma-bridge.cc凝视程序 1.Ns3 bridge模csma-bridge.cc演示示例程序的目光 // Network topology // // ...

  7. linux基于学习

    1.还有一个文件名前".",它代表的文件""隐藏文件". 2.chgrp:改变文件所属用户组 chown:改变文件全部者 chmod:改变文件的权限 ...

  8. 阿里2015回顾面试招收学历(获得成功offer)

    1. 引言 继上次"百度2015校园招聘面试题回顾录(成功拿到offer)"文章过后,大家都希望除了题目之外.最好能给出自己当时的回答情况,看看有没有什么回答技巧,这样更有參考价值 ...

  9. [原创].NET 分布式架构开发实战五 Framework改进篇

    原文:[原创].NET 分布式架构开发实战五 Framework改进篇 .NET 分布式架构开发实战五 Framework改进篇 前言:本来打算这篇文章来写DAL的重构的,现在计划有点改变.之前的文章 ...

  10. 每天进步一点点--&gt;函数fseek() 使用方法

    在阅读代码时,遇到了非常早之前用过的fseek(),非常久没实用了,有点陌生,写出来以便下次查阅. 函数功能是把文件指针指向文件的开头,须要包括头文件stdio.h fseek   函数名: fsee ...