1.什么是系统调用

系统调用,指的是操作系统提供给用户程序调用的一组特殊接口,用户程序可以根据这组接口获得操作系统内核的服务。它规定了用户进程陷入内核的具体位置,或者说规划了用户访问内核的路径,只能从固定位置进入内核。

2.linux的系统调用

对于现代操作系统来说,系统调用是用户空间和内核通讯的普遍手段,linux也不例外。按照功能区域,linux系统调用大致分为进程控制,文件访问,系统控制,存储管理,网络管理,进程通讯等,详细说明可以通过man 2 syscalls命令查看manpage说明。

系统调用,仅仅通过软中断机制向内核提交请求,进入系统调用对应服务。linux提供的用户编程接口遵循了POSIX标准,这套标准除了定义一些标准的C函数外,提供了一套封装例程将系统调用封装供用户编程使用。不过封装并非必须的,如果你愿意直接调用,linux内核也提供了一个syscall()函数来实现调用。通过下面一个例子了解C库调用和直接调用的区别。

/*
** file: demo.c
** author: eric.xu ** date: 2016-02-25 */ #include <syscall.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h> int main(void)
{
long id1, id2; /* system call no 20, __NR_getpid equal to SYS_getpid */
id1 = syscall(__NR_getpid);
printf("sys_call getpid %ld\n", id1); /* libc getpid */
id2 = getpid();
printf("libc getpid %ld\n", id2); return 0;
}

编译运行,可以看到两者结果一致。

sys_call getpid 2899
libc getpid 2899

3.linux系统调用实现

当用户态的进程调用一个系统调用时,CPU切换到内核态并开始执行内核函数。因为内核中每个系统调用都有唯一的标号,所以用户态调用必须传递一个系统调用号的参数来确定具体的系统调用函数。所有的系统调用函数都是整数,在内核中,整数和0表示系统调用成功结束,负数则表示出错条件,而这个错误值会存放在errno变量中作为出错码返回给应用程序。

linux系统调用使用软中断实现,在x86架构中调用int $0x80汇编指令,这条指令会产生向量为128的异常。而在arm架构中通过SWI指令进入内核空间,下面看下这条指令的格式:

SWI {cond} immed24;其中immed24表示24位立即数

SWI异常中断处理程序需要通过读取引起软件中断的SWI指令,取得24位立即数。基本步骤是在SWI异常产生后,访问SPSR寄存器判断该指令是ARM指令还是Thumb指令,然后通过访问LR寄存器得到整条指令地址,紧接着拿到该条指令,获取最低24位立即数。

(未完待续)

理解Linux系统调用的更多相关文章

  1. [Linux]系统调用理解(1)

    本文是Linux系统调用专栏系列文章的第一篇,对Linux系统调用的定义.基本原理.使用方法和注意事项大概作了一个介绍,以便读者对Linux系统调用建立一个大致的印象. 什么是系统调用? Linux内 ...

  2. [Linux]Linux系统调用列表

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

  3. 别出心裁的Linux系统调用学习法

    别出心裁的Linux系统调用学习法 操作系统与系统调用 操作系统(Operating System,简称OS)是计算机中最重要的系统软件,是这样的一组系统程序的集成:这些系统程序在用户对计算机的使用中 ...

  4. 关于Linux系统调用,内核函数【转】

    转自:http://blog.csdn.net/ubuntulover/article/details/5988220 早上听人说到某个程序的一部分是内核态,另一部分是用户态,需要怎么怎么.当时突然想 ...

  5. Linux系统调用(转载)

    目录: 1. Linux系统调用原理 2. 系统调用的实现 3. Linux系统调用分类及列表 4.系统调用.用户编程接口(API).系统命令和内核函数的关系 5. Linux系统调用实例 6. Li ...

  6. 深入理解linux网络技术内幕读书笔记(三)--用户空间与内核的接口

    Table of Contents 1 概论 1.1 procfs (/proc 文件系统) 1.1.1 编程接口 1.2 sysctl (/proc/sys目录) 1.2.1 编程接口 1.3 sy ...

  7. 理解 Linux 配置文件分类和使用

    理解 Linux 配置文件分类和使用 本文说明了 Linux 系统的配置文件,在多用户.多任务环境中,配置文件控制用户权限.系统应用程序.守护进程.服务和其它管理任务.这些任务包括管理用户帐号.分配磁 ...

  8. UNIX环境高级编程——Linux系统调用列表

    以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数.这可能是你在互联网上所能看到的唯一一篇中文注释的Linux系统调用列表,即使是简单的字母序英文列表,能做到这么完 ...

  9. Linux系统调用列表(转)

    以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数.这可能是你在互联网上所能看到的唯一一篇中文注释的Linux系统调用列表,即使是简单的字母序英文列表,能做到这么完 ...

随机推荐

  1. cocos2d-x 的api

    最近,在学习cocos2d-x,发现没有一个很好的api手册.因为起初我们学习一些例子之类的内容,会很容易使用,也很容易明白,但是当我们需要用新的api的时候,第一就会疑问有没有这个api,比如:你使 ...

  2. AutoHotkey调用VBA实现批量精确筛选数据透视表某字段内容。

    如上图,想在数据透视表中只显示红色区域的内容,手动勾选就比较繁琐. 实现思路: 先复制红色的内容. 鼠标停留在数据透视表[型号]列的任意数据上(通过该单元格可以获取数据透视表和字段) 由于数据透视表的 ...

  3. February 13 2017 Week 7 Monday

    Don't trouble trouble until trouble troubles you. 不要自寻烦恼. It is the best way to live an easy life if ...

  4. U-Mail邮件群发如何过滤无效地址?

    U-Mail邮件群发平台可以自动过滤掉无效和重复地址,过滤效果如下图 U-Mail邮件群发平台会将客户已经确认好是无效地址的加入无效地址库,下次再导入改无效地址就直接拒绝.邮件格式不正确的也会直接过滤 ...

  5. vim使用常看

    原网址http://www.runoob.com/linux/linux-vim.html 补充参考https://blog.csdn.net/w178191520/article/details/8 ...

  6. Codeforces Round #436 (Div. 2)【A、B、C、D、E】

    Codeforces Round #436 (Div. 2) 敲出一身冷汗...感觉自己宛如智障:( codeforces 864 A. Fair Game[水] 题意:已知n为偶数,有n张卡片,每张 ...

  7. Java虚拟机1:开篇

    1.前言 由于后期学习需要用到大量的JVM底层的东西,所有本人调整了一下学习计划,打算先从JVM入手,了解整个JAVA的运行机制,内存模型,编译原理等等一些底层的东西,这样在学习 后面的东西,会有一种 ...

  8. ListView实现下拉刷新(二)隐藏头布局

    一.问题分析 在上一篇中,我们将头布局加到了ListView上.但是没有隐藏他.你可能会想,隐藏还不简单,直接给它设置为GONE属性不就可以了吗,在需要的时候再设定为可见.没错,这正是ListView ...

  9. 使用ViewPager和FragmentPagerAdapter实现Tab

    前面我们分别利用ViewPager和Fragment实现了Tab效果.但是使用Fragment实现的Tab不能够左右滑动.如果我们既想使用Fragment又想让Tab能够滑动,那么怎么办呢?这 就是今 ...

  10. 在UML系统开发中有三个主要的模型

    http://www.cnblogs.com/Yogurshine/archive/2013/01/14/2859248.html 在UML系统开发中有三个主要的模型: 功能模型: 从用户的角度展示系 ...