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

系统调用是用户通过库函数方式:库函数帮我们把系统调用封装起来。

内核态:高级别执行,可以使用特权指令,访问任意的物理地址。

用户态:低级别执行,代码范围受到限制。

CS寄存器的最低两位表明了当前代码的特权级。

在linux中,0xc0000000以上的地址空间只能在内核态下访问,0x00000000-0xbfffffff的地址空间两种状态下都可以使用。(逻辑地址)

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

从用户态进入内核态:必须保存用户态的寄存器上下文

中断/int指令在堆栈上保存寄存器的值:用户态/内核态栈顶地址(ss:esp)、状态字(eflags)、cs:eip值(内核态时指向中断服务程序入口)

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

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

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

三、系统调用概述

1、系统调用的意义

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

用户不管硬件编程

提高系统安全性

用户程序可移植

2、API和系统调用

API:应用编程接口,是一个函数定义

系统调用:通过软中断向内核发出明确请求

Libc库定义的一些API引用了封装例程(唯一目的就是发布系统调用)

一般每个系统调用对应一个封装例程

库用封装例程定义出给用户的API

不是每个API都对应一个特定的系统调用

API可直接提供用户态服务,如数学函数

一个API可调用几个系统调用

不同API可调用同一系统调用

3、返回值:

封装例程返回一个整数,含义依赖与相应系统调用

-1表示内核不能满足进程的要求

Libc定义的errno变量包含特定出错码

四、系统调用三层皮:

API(xyz)

中断向量(system_call)

中断服务程序(sys_xyz)

用户态进程调用系统调用时,CPU切换到内核态执行内核函数(Linux中通过执行int $128来执行系统调用,产生向量为128的编程异常)

五、传参:

进程指明需要哪个系统调用,传递系统调用号,使用eax传递

系统调用号将xyz与sys_xyz关联起来

system_call是linux中所有系统调用的入口点,每个系统调用至少有一个参数,即系统调用号。

寄存器传递参数的限制:

每个参数长度不能超过寄存器长度即32位

在系统调用号eax之外,个数不能超过6个

超过6的话:某个寄存器中存储指针,指针会指向一个内存空间,存储参数

系统调用传递第一个参数使用ebx。

六、实验

1.选择20号系统调用,getpid来获取当前进程的pid

2.实验内容:

使用库函数API方式:

使用C代码中嵌入汇编代码方式:

linux内核分析 第四周 扒开系统调用的三层皮(上)的更多相关文章

  1. 20135327郭皓--Linux内核分析第四周 扒开系统调用的三层皮(上)

    Linux内核分析第四周 扒开系统调用的三层皮(上) 郭皓 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/U ...

  2. LINUX内核分析第四周——扒开系统调用的三层皮

    LINUX内核分析第四周--扒开系统调用的三层皮 李雪琦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course ...

  3. Linux内核分析 笔记五 扒开系统调用的三层皮(下) ——by王玥

    (一)给MenuOs增加time和time-asm命令 更新menu代码到最新版 在main函数中增加MenuConfig 增加对应的Ttime和TimeAsm函数 make rootfs (二)使用 ...

  4. linux 内核 第四周 扒开系统调用的三层皮 上

    姬梦馨 原创作品 http://mooc.study.163.com/course/USTC-1000029000 一.用户态.内核态和中断处理过程 用户通过库函数与系统调用联系起来:库函数帮我们把系 ...

  5. Linux内核及分析 第四周 扒开系统调用的三层皮(上)

    实验过程 选择20号系统调用getpid(取得进程识别码) 在网上查询getpid函数的C语言代码以及其嵌入式汇编语句 C语言代码: #include <stdio.h> #include ...

  6. Linux内核设计第四周——扒开系统调用三层皮

    Linux内核设计第四周 ——扒开系统调用三层皮 一.知识点总结 (一).系统调用基础知识 1.用户态和内核态 内核态:在高级别的状态下,代码可以执行特权指令,访问任意的物理地址: 用户态:在相应的低 ...

  7. 《Linux内核分析》第四周 扒开系统调用的“三层皮”

    [刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK FOUR( ...

  8. Linux内核分析——第四周学习笔记20135308

    第四周 扒开系统调用的“三层皮” 一.内核.用户态和中断 (一)如何区分用户态.内核态 1.一般现在的CPU有几种不同的指令执行级别 ①在高级别的状态下,代码可以执行特权指令,访问任意的物理地址,这种 ...

  9. LINUX内核分析第四周学习总结——扒开系统调用的“三层皮”

    LINUX内核分析第四周学习总结--扒开系统调用的"三层皮" 标签(空格分隔): 20135321余佳源 余佳源 原创作品转载请注明出处 <Linux内核分析>MOOC ...

随机推荐

  1. global中捕获异常

    前言:由于现在日志非常重要,但是在哪里打写日志比较好呢,我选择的是在global中,把错误代码网上抛,而不是在底层写大量的try catch然后在catch中来写日志,每个catch中的写日志这样就会 ...

  2. 关于Python的装饰器(2)

    Python中被装饰器修饰的函数,解析后会生成一个参数是被修饰函数的装饰器函数对象,可以调用,可以接受传参(如果被修饰的函数定义了参数),实际调用的时候,尽管代码里值写了被修饰的函数,被调用的却是最终 ...

  3. C# TTS-文本转语音

    System.Speech 命名空间包含支持语音识别的类型,你可以从Visual Studio很方便的添加相关组件的引用. System.Speech相关介绍:https://msdn.microso ...

  4. npp基本设置

    经过实践,本人发现Notpad++是一个很不错的软件,无论是用于文档的读取还是开发,都很赞,那么给软件做一些基本的设置,使用的时候更得心用手就显得尤为重要了. 本文主要介绍npp的基础设置,后期会不断 ...

  5. php文章tag标签的增删

    <?php session_start();   if($_POST){           $_SESSION['old']=array('one','two','three','four', ...

  6. VR电竞游戏在英特尔®架构上的用户体验优化

    作为人与虚拟世界之间的新型交互方式,VR 能够让用户在模拟现实中获得身临其境的感受.但是,鉴于 VR 的帧预算为每帧 11.1ms (90fps),实现实时渲染并不容易,需要对整个场景渲染两次(一只眼 ...

  7. Liunx expect 基础

    a script for study except #!/usr/bin/expect 声明文件内的语法使用 expect 的语法来执行. send send: 向进程发送字符串,用于模拟用户的输入. ...

  8. hadoop之mapper类妙用

    1. Mapper类 首先 Mapper类有四个方法: (1) protected void setup(Context context) (2) Protected void map(KEYIN k ...

  9. 3.Airflow使用

    1. airflow简介2. 相关概念2.1 服务进程2.1.1. web server2.1.2. scheduler2.1.3. worker2.1.4. celery flower2.2 相关概 ...

  10. Python 装饰器Decorator(二)

    对于上一篇“”Python闭包“”随笔中提到的make_averager()函数的如下实现,我们把历史值保存在列表里,每次计算平均值都需要重新求和,当历史值较多时,需要占用比较多的空间并且效率也不高. ...