`
jxsrhsb
  • 浏览: 16380 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

理解Linux系统调用(转载)

阅读更多
一、 什么是系统调用
    在Linux的世界里,我们经常会遇到系统调用这一术语,所谓系统调用,就是内核提供的、功能十分强大的一系列的函数。这些系统调用是在内核中实现的,再通过一定的方式把系统调用给用户,一般都通过门(gate)陷入(trap)实现。系统调用是用户程序和内核交互的接口。

二、 系统调用的作用
    系统调用在Linux系统中发挥着巨大的作用.如果没有系统调用,那么应用程序就失去了内核的支持。
    我们在编程时用到的很多函数,如fork、open等这些函数最终都是在系统调用里实现的,比如说我们有这样一个程序:
#include <unistd.h>
#include <stdio.h>

int main()
{
    fork();
    exit(0);
}
 
    这里我们用到了两个函数,即fork和exit,这两函数都是glibc中的函数,但是如果我们跟踪函数的执行过程,看看glibc对fork和exit函数的实现就可以发现在glibc的实现代码里都是采用软中断的方式陷入到内核中再通过系统调用实现函数的功能的。具体过程我们在系统调用的实现过程会详细的讲到。
    由此可见,系统调用是用户接口在内核中的实现,如果没有系统调用,用户就不能利用内核。

三、 系统调用的现实及调用过程
    详细讲述系统调用的之前也讲一下Linux系统的一些保护机制。
    Linux系统在CPU的保护模式下提供了四个特权级别,目前内核都只用到了其中的两个特权级别,分别为“特权级0”和“特权级3”, 级别0也就是我们通常所讲的内核模式,级别3也就是我们通常所讲的用户模式。划分这两个级别主要是对系统提供保护。内核模式可以执行一些特权指令和进入用户模式,而用户模式则不能。
    这里特别提出的是,内核模式与用户模式分别使用自己的堆栈,当发生模式切换的时候同时要进行堆栈的切换。

    以上这段代码里定义了两个非常重要的宏,即SAVE_ALL和RESTORE_ALL
    SAVE_ALL先保存用户模式的寄存器和堆栈信息,然后切换到内核模式,宏__SWITCH_KERNELSPACE实现地址空间的转换RESTORE_ALL的过程过SAVE_ALL的过程正好相反。
    在内核原代码里有一个系统调用表:(entry.S的文件里)

    在2.6.5的内核里,有280多个系统调用,这些系统调用的名称全部在这个系统调用表里。在这个原文件里,还有非常重要的一段。

    这一段完成系统调用的执行。
    system_call函数根据用户传来的系统调用号,在系统调用表里找到对应的系统调用再执行。从glibc的函数到系统调用还有一个很重要的环节就是系统调用号。系统调用号的定义在include/asm-i386/unistd.h里。

    每一个系统调用号都对应有一个系统调用。

分享到:
评论

相关推荐

    一周内学会linux系统管理

    4. **文件系统与文件管理**:理解Linux下的目录结构,如/home、/etc、/usr、/var等,学习如何创建、删除、移动、复制和修改文件及目录。掌握文件权限与所有权,理解chmod和chown命令。 5. **用户与组管理**:理解...

    Linux字符设备驱动(转载)

    Linux字符设备驱动是操作系统内核与硬件交互的重要组成部分,它允许应用程序通过标准的文件操作接口与特定的硬件设备进行通信。...理解并掌握字符设备驱动的原理和实现方法,对于进行系统级编程和硬件开发至关重要。

    linux—select详解(转载).pdf

    《Linux select系统调用详解》 在Linux操作系统中,`select`系统调用是一个非常重要的I/O多路复用机制,它允许程序同时监控多个文件描述符(file descriptor,简称句柄)的状态变化,以便在任何句柄准备好进行读写...

    Linux shell编程

    10. **解释器原理**:“Shell编程入门:Linux解释器原理”可能涵盖了Shell如何读取、解析脚本,以及如何调用系统内核执行命令的基础知识。 学习Linux Shell编程不仅能提高工作效率,还能让你更好地理解操作系统的...

    UNIX高级编程

    这本书的第三版,对于深入理解UNIX系统的工作原理和编写高效、可靠的UNIX/Linux程序有着极大的帮助。以下是该书可能涉及的一些核心知识点: 1. **UNIX系统概述**:介绍UNIX的历史、版本和其对现代操作系统的影响,...

    使用gcc和glibc来优化程序 转载 (2).pdf

    GCC(GNU Compiler Collection)和glibc(GNU C Library)是Linux和类Unix系统中广泛使用的工具,它们提供了丰富的功能来帮助开发者优化程序。这篇文章主要探讨了使用GCC编译器和glibc库进行程序优化的几种策略。 1...

    内核编译配置选项简介

    本文档旨在介绍Linux 2.6.19.x内核编译时的各种配置选项及其含义,帮助开发者更好地理解和定制自己的内核。作者金步国是一位自由软件爱好者,遵循GPL协议发布本文档,鼓励大家自由使用、转载和分发,但需保留原文档...

    使用gcc和glibc来优化程序 转载.pdf

    glibc作为Linux系统的标准C库,包含了许多优化过的函数实现,如快速字符串操作和数学运算。利用glibc的特性,比如使用`strncpy`代替`strcpy`以防止缓冲区溢出,或者使用`memcpy`而非手写的内存复制,可以提高程序的...

    [转载]迭代算法 1.0

    5. 操作系统调度:如Linux中的CFS( Completely Fair Scheduler)调度器,使用红黑树和时间片的迭代更新来实现进程调度。 四、迭代算法的实现方式 1. 循环结构:使用for、while等基本循环语句实现迭代过程。 2. ...

    串口通信编程大全COM

    6. **编程接口**:在编程中,通常需要使用特定的API或库来操作串口,如Windows的`CreateFile`、`WriteFile`、`ReadFile`函数,或者Linux的`open`、`write`、`read`等系统调用。 7. **编程语言支持**:各种编程语言...

    001--OpenGL 快速入门案例解析.pdf

    在Mac系统下,通常包含GLUT库的头文件为`&lt;GLUT.h&gt;`,而在Windows和Linux系统上,则需包含`&lt;glut/glut.h&gt;`的头文件,并使用freeglut的静态库版本。这一步骤对于初学者而言是至关重要的,因为正确配置开发环境是编写和...

    TCP-IP-Network-Note:博客:http

    笔者目前使用Linux平台,因此本笔记只包括Linux部分。如果本笔记对您有用,别忘了点一个star。转载请注明出处,谢谢。运行环境操作系统: Ubuntu 18.04.5 LTSgcc 8.4.0 (Ubuntu 8.4.0-1ubuntu1~18.04)g++ 8.4.0 ...

    FIBOCOM G500 OpenCPU 编程应用设计说明_V1.0.1.pdf

    模块应用了OpenCPU技术,这可能意味着该模块内部具有一个开放的操作系统(例如Linux),能够在标准的CPU环境下执行用户编写的程序。OpenCPU概念下,用户可以利用模块提供的编程接口(APIs)定制程序,并在设备上运行...

    GPU深度发掘(一)GPGPU数学基础教程

    本文通过一个简单的`saxpy()`函数示例,系统地介绍了GPGPU编程的基本概念和技术,包括数组与纹理的映射、着色器的编写与调用、渲染作为计算操作以及数据在GPU与CPU之间的传递机制。这些概念和技术构成了GPGPU编程的...

    百度地图毕业设计源码-TCP-IP-NetworkNote::blue_book:《TCP/IP网络编程》(韩-尹圣雨)学习笔记

    ,转载请注明出处,谢谢。 我的环境是:Ubuntu18.04 LTS 编译器版本:g++ (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0 和 gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0 所以本笔记中只学习有关于 Linux 的部分。 本项目在 ...

    基于SIP开发软件电话的一些资源(转自YOUTOO)

    熟悉后再一个函数一个函数地深入学习exosip提供的接口函数,就可以深入理解osip 了,达到间接学习oSIP的目的,同时也能从eXoSIP中学习到正确使用oSIP的良好的编程风格和语法格式。 而要成功编译...

Global site tag (gtag.js) - Google Analytics