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等)。


    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    Centos 7 zabbix 实战应用
    Centos7 Zabbix添加主机、图形、触发器
    Centos7 Zabbix监控部署
    Centos7 Ntp 时间服务器
    Linux 150命令之查看文件及内容处理命令 cat tac less head tail cut
    Kickstart 安装centos7
    Centos7与Centos6的区别
    Linux 150命令之 文件和目录操作命令 chattr lsattr find
    Linux 发展史与vm安装linux centos 6.9
    Linux介绍
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4837829.html
Copyright © 2011-2022 走看看