《Linux内核分析》课程第四周学习总结
姓名:何伟钦
学号:20135223
( *原创作品转载请注明出处*)
( 学习课程:《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
学习内容:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
一、用户态、内核态和中断
与系统调用打交道的方式:通过库函数,把系统调用给封装起来
1、用户态vs内核态:
(1)一般现代CPU都有几种不同的指令执行级别:在高级别的状态下,代码可以执行特权指令,访问任意的物理地址,这种CPU执行级别对应着内核态;
在相应的低级别执行状态下,代码的掌控范围会受到限制,只能在对应级别允许的范围内活动
(2)为什么有权限级别的划分:为了防止系统崩溃以及恶意代码的入侵,通过划分权限级别来让系统更稳定
举例:Intel x86 CPU有四种不同的执行级别0-3,Linux只使用了其中的0级和3级分别来表示内核态和用户态
区分:在Linux中,地址空间是一个显著的标志:
0xc0000000以上的地址空间只能在内核态下访问
0x00000000-0xbfffffff的地址空间在两种状态下都可以访问
注意:地址空间指的是逻辑地址而不是物理地址
2、中断
(1)中断处理是从用户态进入内核态主要的方式,系统调用只是一种特殊的中断
(2)当用户态切换到内核态时,必须保存用户态的寄存器上下文
(3)中断/int指令会在堆栈上保存一些寄存器的值,如:
①用户态栈顶地址; ②当时的状态字; ③当时的cs:eip的值
(4)中断发生后第一件事:保存现场(进入中断程序,保存需要用到的寄存器的数据)
SAVE_ALL:把其他的寄存器的值给push到内核堆栈里边去
中断处理结束前最后一件事:恢复现场(退出中断程序,恢复保存寄存器的数据)
RESTOTRE_ALL:把用户态保存的寄存器再popl出来
(5)Iret指令与中断信号(包括int指令)发生时的CPU做的动作相反
二、系统调用
(一) 系统调用的意义
(二)API和系统调用:API与系统调用不是一一对应的
(三)应用程序,封装程序,系统调用处理程序及系统调用服务例程之间的关系
(四)系统调用的三层皮:
①xyz(API)
②system_call(中断向量对应的中断服务程序),
③sys_xyz (中断服务程序)
当用户态进程调用一个系统调用时,CPU切换到内核态并开始执行一个内核函数。
Linux中是通过执行int $0x80来执行系统调用,这条汇编指令产生向量为128的编程异常 —— 即中断向量0x80与System_call绑定起来。
系统调用号将函数
xyz()
和中断服务程序sys_xyz
关联起来。
(五) 参数传递
内核实现了很多不同的系统调用,进程用系统调用号这个参数指明需要哪个系统调用。
system_call是linux中所有系统调用的入口点,每个系统调用至少有一个参数,使用eax寄存器传递系统调用号。
寄存器传递参数的限制:
①每个参数的长度不能超过寄存器的长度,即32位
②在系统调用号(eax)之外,参数的个数不能超过6个(ebx,ecx,edx,esi,edi,ebp)
③超过6个的情况下,使用某一个寄存器作为指针,进入内核态之后可以访问所有的地址空间,通过某一片区域传递参数。
三、使用库函数API和C代码中嵌入汇编代码触发同一个系统调用
(一)使用库函数API获取系统当前时间
代码:
运行结果:
(二) 使用嵌入式汇编代码获取系统当前时间
代码如下:
运行结果:
用户态向内核态传递了一个系统调用号和传递了参数 ,系统调用返回值使用eax存储,参数用ebx存储
(三)进行C语言代码实例编写:
代码如下:
运行结果:
(四)编写嵌入式汇编代码
代码如下:
运行结果:
通过内嵌汇编代码可以清晰的看出调用系统调用的工作过程:
①将ebx寄存器清零,表示无参数传入。
②将需要调用的系统调用号赋值给eax寄存器
③执行int 0x80来执行系统调用。
④eax寄存器保存了返回值,将它分别赋值给输出uid或gid变量。
(在Linux系统中是通过激活0x80中断来触发系统调用的,需要调用的系统调用号实现赋值给eax存储器,如果有传入参数可赋值给ebx寄存器,如果多于1个则按顺序赋值给ebx、ecx、edx、esi、edi、ebp,如果超过6个则通过指针变量指向另一片堆栈区,如果无参数传入则赋值为0)
《Linux内核分析》课程第四周学习总结的更多相关文章
- 《Linux内核分析》第四周学习笔记
<Linux内核分析>第四周学习笔记 扒开系统调用的三层皮(上) 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.c ...
- 《Linux内核分析》第四周学习总结
<Linux内核分析>第四周学习总结 ——扒开系统调用的三层皮 姓名:王玮怡 学号:20135116 理论总结部分: 第一节 用户态.内核 ...
- 《Linux内核分析》第四周学习总结 扒开系统调用的三成皮(上)
第四周 扒开系统调用的三层皮(上) 郝智宇 无转载 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一. ...
- linux内核分析 课程总结
Linux内核分析 链接汇总 Linux内核分析第一周学习总结--计算机是如何工作的 Linux内核分析第二周学习总结--操作系统是如何工作的 Linux内核分析第三周学习总结--构造一个简单的Lin ...
- Linux内核分析课程总结
Linux内核分析课程总结 By 20135203齐岳 知识梳理 (思维导图地址http://mindmap.4ye.me/mkxM0cFh/1) 从start _ kernel构造一个新的Linux ...
- LINUX内核分析第七周学习总结:可执行程序的装载
LINUX内核分析第七周学习总结:可执行程序的装载 韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/cours ...
- LINUX内核分析第八周学习总结——进程的切换和系统的一般执行过程
LINUX内核分析第八周学习总结——进程的切换和系统的一般执行过程 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/c ...
- LINUX内核分析第七周学习总结——可执行程序的装载
LINUX内核分析第六周学习总结——进程的描述和进程的创建 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/cours ...
- LINUX内核分析第六周学习总结——进程的描述与创建
LINUX内核分析第六周学习总结--进程的描述与创建 标签(空格分隔): 20135321余佳源 余佳源 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc ...
- LINUX内核分析第五周学习总结——扒开系统调用的“三层皮”(下)
LINUX内核分析第五周学习总结--扒开系统调用的"三层皮"(下) 标签(空格分隔): 20135321余佳源 余佳源 原创作品转载请注明出处 <Linux内核分析>M ...
随机推荐
- 网络编程_UDP协议_聊天程序
发送端:(将数据源改为键盘录入) import java.io.BufferedReader; import java.io.IOException; import java.io.InputStre ...
- js面对对象编程(二):属性和闭包
上篇博客中解说了一些js对象的基本概念和使用方法.这篇博客解说一下js属性方面的:公有属性.私有属性,特权方法. 假设学过java.公有属性.私有属性,特权方法(即能够訪问和设置私有属性的方法)一定非 ...
- 性能问题案例01——sybase数据库内存问题
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/xuepiaohan2006/article/details/30064399 近期现场反馈问 ...
- CJOJ 【DP合集】最长上升序列2 — LIS2
题面 已知一个 1 ∼ N 的排列的最长上升子序列长度为 K ,求合法的排列个数. 好题(除了我想不出来我应该找不到缺点), 想一想最长上升子序列的二分做法, 接在序列后面或者替换. 所以对于每一个位 ...
- springmvc与ajax交互常见问题
这是我个人再编写博客系统的时候,因个人疏忽犯下的低级错误. 不过犯错是一件好事,有助于总结. 1.关于参数前加@RequestBody 如果是使用ajax交互时,必须要加上这个contentType: ...
- tomcat:8080/返回404;/etc/hosts(identifier-Namespace-scope)
我以为 就oracle 的 oracle db ,weblogic喜欢和 hostname 死磕: 没想到开源的tomcat也是如出一辙,名不正则言不顺,为什么,“名”的力量这么大呢?命名空间. 有个 ...
- 在nodeJS中操作文件系统(二)
在nodeJS中操作文件系统(二) 1. 移动文件或目录 在fs模块中,可以使用rename方法移动文件或目录,使用方法如下: fs.rename(oldPath,newPath,call ...
- js 对于jquery each 多层循环的问题和原生js多层循环问题
一.在jquery中,我们使用循环的时候,提供两种方式:jquery.each 和(循环体).each 两种方式不是同. 对于return 在作用这两个的函数的时候需要注意: 首先我们需要知道我们的 ...
- linux 文件夹和文件操作
1.统计目录有多少个文件数 find ./company -type f | wc -l 2.删除文件夹中的文件 rm -f * #最经典的方法,删除当前目录下的所有类型的文件 rsync --del ...
- vxlan 简单理解 vs calico 网络模型
1.vxlan(virtual Extensible LAN)虚拟可扩展局域网,是一种overlay的网络技术,使用MAC in UDP的方法进 行封装,共50字节的封装报文头. 2.VTEP为虚拟机 ...