• 《LINUX内核设计与实现》第五章学习总结


     

    一、与内核通信

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

    系统调用的三个主要作用:

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

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

     

    二、APIPOSIXC


    POSIX-Unix世界中最流行的应用编程接口是给予POSIX标准的。
    Linux的系统调用作为C库的一部分提供。
    C库实现了Unix系统的主要API,包括标准C库函数和系统调用接口,即POSIXdM大部分API。

    Unix的接口设计——“提供机制而不是策略”

    三、系统调用

    (一)要访问系统调用(syscall),通常通过C库中定义的函数调用来进行系统调用。

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

    (三)定义系统调用:asmlinkage long sys_getpid(void)  (asmlingkage是一个编译指令,通知编译器仅从栈中提取该函数的参数。所有的系统调用都需要这个限定词。 其次, 返回值long。 为了保证32位和64位系统的兼容,系统调用在用户空间返回值int,内核空间long 。最后,注意系统调用getpid()在内核中被定义成sys_getpid().

    系统调用号:

    每个系统调用号独一无二,一旦分配就不能再有任何变更。
    执行系统调用时,通过系统调用号指明,进程不会提及系统调用的名称。
    未实现系统调用——sys_ni_syscall(),返回-ENOSYS,针对无用的系统调用。

    系统调用的性能:

    设计原则:简洁、高效

    原因:

    • 上下文切换时间短
    • 系统调用处理程序和每个系统调用本身都很简洁

    四、系统调用处理程序

    通知内核的机制是软中断:通过引发一个异常来促使系统切换到内核态中去执行异常处理程序,即系统调用处理程序system_call()。

    中断号128,指令如下:int 128 或者 int 0x80 退出是iret

    (一)指定恰当的系统调用

    • eax寄存器:将系统调用号传递给内核
    • system_call():与NR_syscall比较,检查有效性
    • call *sys_call_table(,%rax,8):执行相应的系统调用

    (二)参数传递

    • x86系统,ebx,ecx,edx,esi,edi按顺序存放前五个参数。
    • 需要6个及以上参数,应用一个单独的寄存器存放指向这些参数在用户空间地址的指针。
    • 返回值存放在eax。

     

  • 相关阅读:
    快速学习javaSE基础4---面向对象的编程
    eclipse 小技巧,设置输入任何字母都有快捷提示.
    快速学习javaSE基础3-java必须了解的基本语法2(熟记)
    快速学习javaSE基础3-java必须了解的基本语法1(熟记)
    数据可视化之导入数据
    pandas读取Excel文件
    pandas进阶
    给定地球上两点的经纬度,求两点之间沿地球表面最短的弧线距离
    06异常
    05设计模式
  • 原文地址:https://www.cnblogs.com/20135223heweiqin/p/5300215.html
Copyright © 2020-2023  润新知