zoukankan      html  css  js  c++  java
  • Linux核心设计依据(七)系统调用

    我理解的系统调用,用户进程和内核是内核提供了一个接口进行交互。除了异常和下降外。内核系统调用是唯一合法入境。像/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 中 /proc/meminfo 的含义
    Linux OOM-killer(内存不足时kill高内存进程的策略)
    java反射
    IDEA 创建Web项目
    centos7 源码安装php7
    linux 基本原则和常用命令
    ls file less
    centos7安装nginx1.10.1
    mysqlworkbench访问远程服务器
    redis 简单的注册
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4837829.html
Copyright © 2011-2022 走看看