读书笔记(chapter5)

系统调用

5.1与内核通信

  1.系统调用在用户空间进程和硬件设备之间添加一个中间层。作用有三个:它为用户空间提供了一种硬件的抽象接口;系统调用保证了系统的稳定和安全;系统调用是用户空间访问内核的唯一手段;

  **除异常和陷入外,它们是内核唯一的合法入口;

 

5.2API、POSIX、和C库

  1.应用程序通过在用户空间实现的应用编程接口(API)而不是直接通过系统调用来编程;内核只跟系统调用打交道;

 

5.3系统调用

  1.系统调用在用户空间和内核空间有不同的返回值类型,在用户空间为int,在内核空间为long

  2.系统调用号sys_ni_syscall(),除了返回,这个错误号就是专门针对无效的系统调用而设的

  3.系统调用表中的所有注册过的系统调用的列表,存储在sys_call_table中,都明确的定义了这个表,在x86-64中,它定义于arch/i386/kernel/syscall 64.c

  4.系统调用的性能:linux上下文切换时间是一个重要的原因,进出内核都被优化的简洁高效;另一个原因是系统调用处理程序和每个系统调用本身也很简洁

 

5.4系统调用处理程序

  1.通知内核的机制是靠软中断实现的:通过引发一个异常来促使系统切换到内核态去执行异常处理程序(也就是系统调用处理程序),中断号是128,通过int $0x80指令触发该中断

  2.系统调用号是通过eax寄存器传递给内核的

  3.参数传递:把这些参数也存放在寄存器里;用单独的寄存器存放指向所有这些参数在用户空间地址的指针

 

5.5系统调用的实现

  1.实现系统调用:注意可移植性和健壮性

  2.参数验证:与文件I/O相关的系统调用必须检查文件描述符是否有效;与进程相关的函数必须检查提供的PID是否有效;还有就是检查用户提供的指针是否有效(接收指针之前必须保证:指针指向的内存区域属于用户空间;指针指向的内存区域在进程的地址空间里;进程决不能绕过内存访问控制);

  3.copy_to_users和copy_from_users()都有可能引起阻塞;进程就会休眠,直到缺页处理程序将该页从硬盘重新换回物理内存

 

5.6系统调用上下文

  1.内核在执行系统调用的时候处于进程上下文,current指针指向当前任务(也就是引发系统调用的那个进程);在进程上下文中,内核可以休眠

  2.绑定一个系统调用最后步骤:首先,在系统调用表的最后加入一个表项;再者,系统调用号都必须定义于<asm/unitsd.h>;系统调用编译成内核映象

  3.从用户空间访问系统调用

  

 

posted on 2016-03-25 13:44  20135325  阅读(101)  评论(0编辑  收藏  举报

导航