zoukankan      html  css  js  c++  java
  • 系统调用初步

    系统调用 系统编程
    效率高,一般在服务器应用中使用。

    系统调用:操作系统提供的一组函数。内核函数,操作外部资源。
    系统调用正是内核提供给应用程序的接口,只有系统提供的函数,用户才可调用它,实现相应的功能,不提供的函数,操作系统不提供该功能。

    操作系统功能:1)管理硬件,2)抽象硬件。

    在系统调用部分主要有三内容:
    1)文件:文件I/O,文件系统。
    2)进程线程:进程,线程,IPC
    3)协议:TCP,UDP,Socket(本地)

    在linux下,程序有两种特权级:用户态和内核态。
    权级切换:内核态与用户态的转化,切换相当耗时。

    特权极参考:http://my.oschina.net/liubin/blog/27795

    以下转自:【学习&理解】Linux下的系统调用过程

    在应用程序中,很多时候都会调用到系统调用来完成一些操作,可是系统调用是在内核态下才能调用,用户态下的应用程序是无法直接调用到的,那么操作系统是怎么处理这一过程的呢?

    本文的环境是基于Linux 0.11,没有查证现代操作系统是否有所变化,不过基本思路应该差不多。

    过程:

    先来看一张图,有个大概的理解。

    首先,应用程序能直接调用的是系统提供的API,这个在用户态(Ring3)下就可做到。

    然后相应的API就会将相应的系统调用号保存到eax寄存器中(这一步通过内联汇编实现),之后就是使用int 0x80触发中断(内联汇编),进入到中断处理函数中(该函数是完全由汇编代码编写),这个时候就进入到了内核态(Ring0)了。

    在中断处理函数中就会调用与系统调用号相对应的那个系统调用。在这个函数中,会把ds、es这两个寄存器设置为指向内核空间。这样一来,我们无法把数据从用户态中传到内核态啊(如open(const char * filename, int flag, ...)中,filename指针指向的字符串的地址是在用户空间中的,在内核空间相应的地方取的话根本没有该字符串),这该怎么办呢?中断处理函数中的fs寄存器被设置为指向了用户空间,所以问题得以解决。

    在系统调用中就是进行相应的操作了,如打开文件、写文件等。

    处理完后,将会返回到中断处理函数,返回值保存在eax寄存器中。

    从中断处理函数中返回到API,依旧是把返回值保存到eax寄存器中。这个时候就从内核态恢复成用户态。

    在API中从eax中取出值,做相应的判断返回不同的值,用以表示操作完成情况。

    *附加:

    为什么使用int 0x80中断能调用那么多系统调用?

    在保护模式下,有各种各样的中断,而系统调用就和0x80号中断绑定。当要调用系统调用时,就触发int 0x80,中断处理函数就通过eax获知想要调用的是哪一个系统调用。这样做的原因是系统调用数量太多,中断号会不够用,所以用一个来集中管理。

    操作系统中有一个表,是用来保存各个系统调用函数的地址的。这个表是一个数组,所以通过下标就可以访问到不同函数的地址。故可以做到一个中断号+各样的系统调用号就管理多个系统调用。

  • 相关阅读:
    RHEL7.2安装及配置实验环境
    VMwareworkstation 12安装
    Iterator主要有三个方法:hasNext()、next()、remove()详解
    httpclient
    http接口测试——Jmeter接口测试实例讲解
    java获取Excel的导出
    java获取Excel的导入
    java的post请求
    java的get请求
    Python3 列表(List)基础
  • 原文地址:https://www.cnblogs.com/embedded-linux/p/5572816.html
Copyright © 2011-2022 走看看