20135320赵瀚青LINUX第五章读书笔记

第五章——系统调用

5.1 与内核通信

作用

  • 1.为用户空间提供一种硬件的抽象接口
  • 2.保证系统稳定和安全
  • 3.除异常和陷入,是内核唯一的合法入口。

API、POSIX和C库

关于Unix接口设计:提供机制而不是策略

5.3 系统调用

5.3.1系统调用号

  • 当用户空间的进程执行一个系统调用,就用系统调用号指明到底执行哪个系统调用。
  • sys_ni_syscall():错误号,负责“填补空缺”,返回-ENOSYS,专门针对无效的系统调用。
  • 存在sys_call_table。

5.3.2系统调用的性能

  • 设计原则:简洁、高效
  • 原因:很短的上下文切换时间

5.4系统调用处理程序

  • 通知内核的机制是软中断实现的:通过引发一个异常来促使系统切换到内核态去指向异常处理程序,而此时的异常处理程序就是系统调用的处理程序。
  • x86系统上的软中断是由int $0x80指令触发128号软中断。

5.4.1指定恰当的系统调用

eax寄存器传递系统调用号给内核。

5.4.2参数传递

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

5.5系统调用处理程序

通知内核

  • 用户程序无法直接执行内核代码,由于内核驻留在受保护的地址空间上,不能直接调用内核空间中的函数。
  • 应用程序以某种方式通知系统,告诉内核自己需要执行一个系统调用,希望系统切换到内核态,内核就可以代表应用程序在内核空间执行系统调用。
  • 通知内核的机制是靠软中断实现的:通过引发异常来粗来系统切换内核态执行异常处理程序(系统调用处理程序)。
  • 用户空间引起异常或陷入内核

指定恰当的系统调用

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

参数传递

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

5.6 系统调用上下文64

5.6.1 绑定一个系统调用的最后步骤

  • 首先,在系统调用表的最后加入一个表项。每种支持该系统调用的硬件体系都必须做这样的工作
  • 对于所支持的各种体系结构,系统调用号都必须定义于<asm/unistd.h>中。

5.6.2 从用户空间访问系统调用

  • 通常,系统调用靠C库支持。
    Linux本身提供了一组宏。

5.6.3 为什么不通过系统调用的方式实现

建立一个新的系统调用的好处

  • 系统调用创建容易且使用方便。
  • Linux系统调用的高性能显而易见。

心得与体会

本周的学习内容是系统调用,在网易云课堂中这门课分为了两个部分,所以对这一章的理解也比较容易,系统调用基本上就分为三个部分,总的来说就是靠中断实现系统调用,三个部分为,API,中断向量,中断服务程序。这门课也进行了一半了,基本上也找到了模式,希望以后能够更加顺利地进行学习

posted @ 2016-03-21 21:08  20135320赵瀚青  阅读(148)  评论(0编辑  收藏  举报