扒开系统调用的三层皮(上)

                                                                            扒开系统调用的三层皮(上)  

                                                                                                        20135109 高艺桐

                                                                                                        《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 


一、用户态、内核态和中段


 1.1 用户态、内核态和中段处理过程

  

(1)系统调用:库函数把系统调用封装起来。

(2)用户态:低级别执行条件下,执行语句。(3级)cs,eip只能0x-0xbffff的地址空间.。

(3)内核态:高的执行条件下,代码执行特权指令,访问任意物理地址,CPU的执行级别对相内核态。(0级)访问cs,eip的值,任意的地址(逻辑地址),0xc以上的只能内核访问。

(4)为什么有级别划分:为了让系统更稳定,用户态不会让系统崩溃。

(5)中段处理:是从用户态进入到内核态的主要方式。系统调用知识一种特殊的中断。中段发生后的第一件事就是保存现场。中段处理结束前的最后一件事是恢复现场。

(6)从用户态到内核态的转变过程:

用户态栈顶地址、当前文字、当时cs:eip的值保存。

内核态栈顶地址、当前文字、当时cs:eip的值激活。

(7)保存现场就是进入中断程序,保存需要保存的寄存器数据。恢复现场就是退出中断程序,恢复保存寄存器的数据。

(8)中段处理的过程:

首先保存cs:eip的值;保存当前堆栈段、栈顶、标志寄存器;加载系统调用或者系统调用的中段服务历程入口。

之后执行内核代码、完成中断服务、发生进程调度。


 二、系统调用概述


 2.1 系统调用概述和系统调用的三层皮

  

 


 

  


 (1)系统调用意义

由操作系统管理硬件,防止用户态进程把系统搞崩溃。

用户程序和具体的硬件接口替代,不会和硬件有太多的关系。

(2)操作系统提供的API和系统调用的关系

把系统调用封装成API,API只是一个函数,

Libc发布系统调用。定义一些API引用封装例程。

(3)一个单独的API可能调用几个系统调用,不同的API可能调用一个系统调用。

(4)系统调用的三层皮:xyz(应用程序封装接口API)、system_call(内核代码中断向量对应的入口起点)和sys_xyz(内核态)。

(5)系统调用号:使用eax寄存器进行传递;系统调用参数传递:每个参数长度不超过寄存器长度,参数长度不超过6个,超过6个把某一个寄存器设为指针作为内存进行传递。


 三、使用库函数API和C代码中嵌入汇编代码触发同一个系统调用


 3.1使用库函数调用系统的时间

 

自己的实验截图:

 

3.3 使用C代码中嵌入汇编代码触发系统调用获得系统当前时间

自己实验截图:

  


四、实验总结


   通过本次实验过程我理解了linux系统调用的三层的具体概念。对内核态,用户态的相关概念也进一步熟悉。系统调用的三层皮是xyz(应用程序封装接口API)、system_call(内核代码中断向量对应的入口起点)和sys_xyz(内核态)。系统调用通过系统调用号使用eax寄存器进行传递。系统调用通过访问eax寄存器中的地址进行调用当前时间。

   实验过程期初因为无法找到视频中文件内容而遇到了困难,后来通过上网查资料等途径顺利完成了实验,希望下次实验能更加沉着冷静,完成的更好。

  

  

posted on 2016-03-15 12:21  20135109  阅读(344)  评论(2编辑  收藏  举报