《Linux内核分析》第四周学习总结 扒开系统调用的三成皮(上)

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

郝智宇 无转载 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

一、用户态、内核态和中断处理过程

1.我们与系统调用打交道是通过库函数的方式

2.一般现代CPU都有几种不同的指令执行级别

因为如果所有程序员写的代码都可以有特权指令的话,系统就会很容易崩溃。

《Linux内核分析》第四周学习总结  扒开系统调用的三成皮(上)    《Linux内核分析》第四周学习总结  扒开系统调用的三成皮(上)

3.中断处理是从用户态进入内核态主要的方式

从用户态切换到内核态时,,必须保存用户态的寄存器上下文

中断/int指令会在堆栈上保存一些寄存器的值

4.系统调用只是一种特殊的中断

5.中断发生后第一件事就是保存现场

6.中断处理结束前最后一件事就是恢复现场

《Linux内核分析》第四周学习总结  扒开系统调用的三成皮(上)

二、系统调用概述和系统调用的三层皮

1.系统调用的意义:

操作系统为用户态进程与硬件设备进行交互提供了一组接口——系统调用:

把用户从底层的硬件编程中解放出来;极大的提高了系统的安全性;使用户程序具有可移植性。

2.API和系统调用:

(1)API:应用程序编程接口

(2)一般每个系统调用对应一个封装例程,库再用这些封装例程定义出给用户的API。

3.系统调用的三层皮:

xyz,sysytem_call和sysytem_xyz

(1)中断向量0x80与system_call绑定起来

(2)系统调用号将xyz与sys_xyz关联起来了(使用eax)

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

1.使用库函数API获取系统当前时间

2.C代码中嵌入汇编代码的写法:

_asm_(

汇编语句模板:

输出部分:

输入部分:

破坏描述部分);

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

《Linux内核分析》第四周学习总结  扒开系统调用的三成皮(上)

任务

(我选择的是2号系统调用fork)

使用库函数API:

《Linux内核分析》第四周学习总结  扒开系统调用的三成皮(上)

编译运行结果:

《Linux内核分析》第四周学习总结  扒开系统调用的三成皮(上)

内嵌汇编:

《Linux内核分析》第四周学习总结  扒开系统调用的三成皮(上)

编译运行结果:

《Linux内核分析》第四周学习总结  扒开系统调用的三成皮(上)

 总结:系统调用的工作机制

诸多系统调用可以看作按照序号排好顺序的黑箱,知道了一个系统调用的号,按照其API或者汇编格式的调用方法,

就可以使用这个黑箱的功能,完成一定的任务。而黑箱的内容正是系统给我们提供的服务,帮我们从硬件操作中抽

离出来,提高系统的安全性。

上一篇:CSS3实现水位充满文字特效


下一篇:Nginx-多服务绑定80端口及映射域名