linux 内核 第四周 扒开系统调用的三层皮 上
姬梦馨
原创作品
http://mooc.study.163.com/course/USTC-1000029000
一、用户态、内核态和中断处理过程
用户通过库函数与系统调用联系起来:库函数帮我们把系统调用封装起来。
1.内核态
高级别执行,可以使用特权指令,访问任意的物理地址。
在高执行级别下,代码可以执行特权指令,访问任意的物理地址。
2.用户态:
用户态:低级别执行,代码范围受到限制。 对应x86 3级(x86CPU有0-3四个级别)intel x86 CPU有四个权限分级,0-3。 Linux 有两种,0是内核态,3是用户态区分权限级别使得系统更加稳定。
如何区分用户态与内核态?
cs:eip。[代码段选择寄存器:偏移量寄存器]
通过cs寄存器的最低两位,表示当前代码的特权级:
【针对逻辑地址】
0xc0000000以上的空间只能在内核态下访问
0x00000000-0xbfffffff两种状态下都可以访问
3.中断
中断处理是从用户态进入内核态的主要方式。
寄存器上下文从用户态切换到内核态时,必须保存用户态的寄存器上下文到内核堆栈中,同时会把当前内核态的一些信息加载,例如cs:eip指向中断处理程序入口。
中断发生后的第一件事就是保存现场 - SAVE_ALL
中断处理结束前最后一件事是恢复现场 - RESTORE_ALL
二、系统调用概述
1. 系统调用的意义:
操作系统为用户态进程与硬件设备进行交互提供了一组接口,就是系统调用。
- 提高系统安全性
- 用户程序可移植
- 远离底层硬件编程
2. API - 应用编程接口
与系统调用区别:
API只是一个函数定义
系统调用是通过软中断向内核发出一个明确的请求。
一般每个系统调用对应一个封装例程,库再用这些封装例程定义出用户的API,方便用户使用。
也就是说,API与系统调用不是一一对应的:
API:
直接提供用户态服务单独的API可能调用几个系统调用不同的API可能调用了同一个系统调用
返回值: 大部分封装例程返回一个整数
1表示失败,不能满足请求
errno 特定出错码
3.所谓“扒开系统调用的三层皮”
- API(xyz)
- 中断向量(system_call)
- 中断服务程序(sys_xyz)
- 用户态进程调用系统调用时,CPU切换到内核态执行内核函数
4.系统调用的参数传递
进程指明需要哪个系统调用,传递系统调用号,使用eax传递
- 系统调用号将xyz与sys_xyz关联起来
- system_call是linux中所有系统调用的入口点,每个系统调用至少有一个参数,即系统调用号。
用户态到内核态: 寄存器传递。
每个参数长度不能超过32位,个数不能超过6个。
若超过,使某个寄存器中存储指针,指向内存,内存中存储参数。
实验:
使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
1.使用库函数API获取系统当前时间
使用time(),结果如下:

2.使用C代码中嵌入汇编代码触发系统调用获取系统当前时间
结果如下:

3:选择mkdir这个系统调用,其系统调用号为39,即0x27。

mkdir.c的运行结果如下:

运行完mkdir可执行文件,产生了新的文件夹test,改编成汇编代码调用:

执行结果如图:

总结:
系统调用是用户通过库函数方式:库函数帮我们把系统调用封装起来。还是很抽象的,需要结合实验和实践理解。
linux 内核 第四周 扒开系统调用的三层皮 上的更多相关文章
- 《Linux内核分析》--扒开系统调用的三层皮 20135311傅冬菁
扒开系统调用的三层皮 20135311傅冬菁 一.内容分析 寄存器上下文(从用户态切换到内核态) 中断/int指令会在堆栈上保存一些寄存器的值(用户态栈顶地址..当时的状态字.当下 ...
- Linux内核分析之扒开系统调用的三层皮(上)
一.原理总结 本周老师讲的内容主要包括三个方面,用户态.内核态和中断,系统调用概述,以及使用库函数API获取系统当前时间.系统调用是操作系统为用户态进程与硬件设备进行交互提供的一组接口,也是一种特殊的 ...
- Linux内核分析之扒开系统调用的三层皮(下)
一.实验内容 1. 通过内核的方式使用系统调用 需要使用的命令 rm menu -rf //强制删除当前menugit clone http://github.com/mengning/menu.gi ...
- 《Linux内核分析》-- 扒开系统调用的三层皮(下)之system_call中断处理过程 20135311傅冬菁
20135311傅冬菁 原创作品 <Linux内核分析>MOOC课程 分析system_call中断处理过程 内容分析与总结: 系统调用在内核代码中的工作机制和初始化 系统调用在用户态中 ...
- 20135327郭皓--Linux内核分析第四周 扒开系统调用的三层皮(上)
Linux内核分析第四周 扒开系统调用的三层皮(上) 郭皓 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/U ...
- LINUX内核分析第四周——扒开系统调用的三层皮
LINUX内核分析第四周--扒开系统调用的三层皮 李雪琦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course ...
- 《Linux内核分析》第四周 扒开系统调用的“三层皮”
[刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK FOUR( ...
- Linux内核及分析 第四周 扒开系统调用的三层皮(上)
实验过程 选择20号系统调用getpid(取得进程识别码) 在网上查询getpid函数的C语言代码以及其嵌入式汇编语句 C语言代码: #include <stdio.h> #include ...
- linux内核分析 第四周 扒开系统调用的三层皮(上)
一.用户态.内核态和中断处理过程 系统调用是用户通过库函数方式:库函数帮我们把系统调用封装起来. 内核态:高级别执行,可以使用特权指令,访问任意的物理地址. 用户态:低级别执行,代码范围受到限制. C ...
随机推荐
- PyQt5 的几个核心模块作用
QtCore 包含了核心的非GUI功能.此模块用于处理时间.文件和目录.各种数据类型.流.URL.MIME类型.线程或进程. QtGui 包含类窗口系统集成.事件处理.二维图形.基本成像.字体和文 ...
- 网站如何接入第三方登录,微信登录和QQ登录:注册认证篇
第三方登录平台接入 (QQ\微信登录) QQ登录接入 第一步成为QQ应用开发者,审核期限七天 一.所需材料 1.公司注册相关信息 2.营业执照扫描件 微信登录接入 第一步成为微信开发平台开发者,认证费 ...
- 微信jsapi退款操作
引自网络“ 前期准备:当然是搞定了微信支付,不然怎么退款,这次还是使用官方的demo.当然网上可能也有很多大神自己重写和封装了demo,或许更加好用简洁,但是我还是不提倡用,原因如下:(1)可能功能不 ...
- docker tomcat 已主机名为日志输出路径
目的:所有的日志输出到共享存储目录中 方法:将 tomcat 的日志放置到 /data/logs/主机名/ 下, 1. 修改tomcat/conf下的logging.properties [root ...
- pycharm 取消空格,逗号 等符号的自动补全
- javascript仿新浪微博图片放大缩小及旋转效果
javascript仿新浪微博图片放大缩小及旋转效果 经常看到新浪微博里有图片放大缩小旋转效果,感觉效果还不错,所以就想试着做一个类似的demo出来,至于旋转对于IE可以用滤镜来解决,标准的浏览器可以 ...
- kubernetes 禁用虚拟内存 swapoff -a ----- 顺便复习sed 命令
1.如果不关闭swap,就会在kubeadm初始化Kubernetes的时候报错,如下图: [ERROR Swap]: running with swap on is not supported. P ...
- day11有参装饰器,无参装饰器
今日内容 1.有参装饰器 2.无参装饰器 什么是装饰器? 用来为被装饰对象添加新功能的工具. 注:装饰器可以是任意可调用对象,被装饰对象也可以是任意可调用对象. 为何要用装饰器? 开放封闭原则:对修改 ...
- jqgrid 点击列头的超链接或按钮时,不触发列排序事件
接上篇文章:jqgrid 将列头设置为超链接或按钮 如果在列头设置了超链接或按钮,在点击超链接或按钮时会触发列的排序事件. 原由:点击超链接/按钮会触发排序的冒泡事件 解决方法:点击超链接/按钮时,阻 ...
- Java IO详解(七)------随机访问文件流
File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocea ...