• linux内核分析 第5章读书笔记


    第五章 系统调用

    一、与内核通信

    系统调用在用户控件进程和硬件设备之间添加了一个中间层,作用有:

    为用户空间提供了一种硬件的抽象接口
    
    系统调用保证了系统的稳定和安全
    
    每个进程都运行在虚拟系统中,而在用户控件和系统的其余部分提供这样一层公共接口
    

    在Linux中,系统调用是用户控件访问内核的唯一手段;除异常和陷入外,他们是内核唯一的合法入口。

    二、API、POSIX和C库

    系统调用与API的不同在于运行级别的切换。
    
    POSIX-Unix世界中最流行的应用编程接口是给予POSIX标准的。
    
    Linux的系统调用作为C库的一部分提供。
    
    C库实现了Unix系统的主要API,包括标准C库函数和系统调用接口,即POSIXdM大部分API。
    
    Unix的接口设计——“提供机制而不是策略”
    

    三、系统调用

    1. 系统调用

       通常通过C库中定义的函数调用来进行系统调用。
      
    2. 几种常见机制:

       通过返回一个long型的返回值来表示成功或者错误
       用一个负的返回值来表明错误
       返回0代表成功
       系统调用出现错误的时候会把错误码写入errno全局变量
       通过perror()库函数可以把该变量翻译成用户可以理解的错误字符串
      
    3. 定义系统调用:

       asmlingkage,这是一个编译指令,通知编译器仅从栈中提取该函数的参数。所有的系统调用都需要这个限定词。
      
       返回值long。
       为了保证32位和64位系统的兼容,系统调用在用户空间返回值int,内核空间long
      
    4. 系统调用号

       每个系统调用号独一无二,一旦分配就不能再有任何变更。
      
       执行系统调用时,通过系统调用号指明,进程不会提及系统调用的名称。
      

    四、系统调用处理程序

    因为用户控件不能直接执行内核代码,需要切换内核态,它需要用某种方式告知内核,自己需要执行一个系统调用,请求切换到内核态,这个通知内核的机制是软中断。
    ——通过引发一个异常来促使系统切换到内核态中去执行异常处理程序,即系统调用处理程序system_call()。
    

    五、系统调用的实现

    1. 实现系统调用
      决定它的用途、不提倡采用多用途的系统调用、确定参数、返回值、错误码、力求简洁、越通用越好,不做错误假设、时刻注意可移植性和健壮性

    2. 参数验证

       必须检查每个参数,保证他们不但合法有效,而且正确。
      

    六、系统调用上下文

    1. 上下文切换

       内核在执行系统调用时处于进程上下文。
      
    2. 休眠

       说明系统调用可以使用内核提供的绝大部分功能
      
       可以被抢占
      
       要求保证该系统调用是可重入的。、
  • 相关阅读:
    javascript取最小值方法 apply
    c# 通过字符串获取与字符串同名的变量的值
    访问者地图 地址收藏
    自定义Dialog(一)
    android应用多主题
    maven setting 文件
    手动安装cloudera cdh4.2 hadoop + hbase + hive(三)
    手动安装cloudera cdh4.2 hadoop + hbase + hive(一)
    使用Hive读取Hbase中的数据
    手机共享电脑网络
  • 原文地址:https://www.cnblogs.com/whyfarrell/p/5313474.html
Copyright © 2020-2023  润新知