扒开系统调用的三层皮(上)
扒开系统调用的三层皮(上)
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寄存器中的地址进行调用当前时间。
实验过程期初因为无法找到视频中文件内容而遇到了困难,后来通过上网查资料等途径顺利完成了实验,希望下次实验能更加沉着冷静,完成的更好。