姓名:何伟钦

学号: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 (中断服务程序)

    1. 当用户态进程调用一个系统调用时,CPU切换到内核态并开始执行一个内核函数。

    2. Linux中是通过执行int $0x80来执行系统调用,这条汇编指令产生向量为128的编程异常 —— 即中断向量0x80与System_call绑定起来。

    3. 系统调用号将函数xyz()和中断服务程序sys_xyz关联起来。

   (五) 参数传递

  1. 内核实现了很多不同的系统调用,进程用系统调用号这个参数指明需要哪个系统调用。

  2. system_call是linux中所有系统调用的入口点,每个系统调用至少有一个参数,使用eax寄存器传递系统调用号。

  3. 寄存器传递参数的限制:

    ①每个参数的长度不能超过寄存器的长度,即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内核分析》课程第四周学习总结的更多相关文章

  1. 《Linux内核分析》第四周学习笔记

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

  2. 《Linux内核分析》第四周学习总结

    <Linux内核分析>第四周学习总结                         ——扒开系统调用的三层皮 姓名:王玮怡  学号:20135116 理论总结部分: 第一节 用户态.内核 ...

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

    第四周 扒开系统调用的三层皮(上) 郝智宇 无转载 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一. ...

  4. linux内核分析 课程总结

    Linux内核分析 链接汇总 Linux内核分析第一周学习总结--计算机是如何工作的 Linux内核分析第二周学习总结--操作系统是如何工作的 Linux内核分析第三周学习总结--构造一个简单的Lin ...

  5. Linux内核分析课程总结

    Linux内核分析课程总结 By 20135203齐岳 知识梳理 (思维导图地址http://mindmap.4ye.me/mkxM0cFh/1) 从start _ kernel构造一个新的Linux ...

  6. LINUX内核分析第七周学习总结:可执行程序的装载

    LINUX内核分析第七周学习总结:可执行程序的装载 韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/cours ...

  7. LINUX内核分析第八周学习总结——进程的切换和系统的一般执行过程

    LINUX内核分析第八周学习总结——进程的切换和系统的一般执行过程 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/c ...

  8. LINUX内核分析第七周学习总结——可执行程序的装载

    LINUX内核分析第六周学习总结——进程的描述和进程的创建 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/cours ...

  9. LINUX内核分析第六周学习总结——进程的描述与创建

    LINUX内核分析第六周学习总结--进程的描述与创建 标签(空格分隔): 20135321余佳源 余佳源 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc ...

  10. LINUX内核分析第五周学习总结——扒开系统调用的“三层皮”(下)

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

随机推荐

  1. 【Ansible 文档】【译文】配置文件

    这里说明一下配置文件的内容,原文地址:http://docs.ansible.com/ansible/latest/intro_configuration.html 这个与[Ansible 文档]配置 ...

  2. JQuery 为radio赋值问题

    今天用jquery 为radio赋值,从百度查了一下方法: $("input[name='radioName'][value=2]").attr("checked&quo ...

  3. libco协程库上下文切换原理详解

    缘起 libco 协程库在单个线程中实现了多个协程的创建和切换.按照我们通常的编程思路,单个线程中的程序执行流程通常是顺序的,调用函数同样也是 “调用——返回”,每次都是从函数的入口处开始执行.而li ...

  4. UART, SPI, IIC的详解及三者的区别和联系

    UART.SPI.IIC是经常用到的几个数据传输标准,下面分别总结一下: UART(Universal Asynchronous Receive Transmitter):也就是我们经常所说的串口,基 ...

  5. Jquery回到顶部功能

    问题描述: 在网页中,我们经常会由于网页内容过长,而需要在浏览网页时有一个快速回到网页顶部的功能,在浏览网页内容离顶部有一段距离时,出现快速回到网页顶部的工具,从而能使我们的网页更人性化. 问题的产生 ...

  6. fabric简单案例

    1  执行一个简单的task任务,显示两台机器的/home/guol/目录下的文件 from fabric.api import * env.users='root' env.port=22 env. ...

  7. CAN总线学习系列之— CAN总线特点介绍

    CAN总线学习系列之— CAN总线特点介绍 CAN 总线作为一种工业界的流行总线广泛应于工业自动化.多种控制设备.交通工具.医疗仪器以及建筑.环境控制等各个行业中,它是是一种多主机局域网,所以这样 一 ...

  8. 大数据入门第十四天——Hbase详解(三)hbase基本原理与MR操作Hbase

    一.基本原理 1.hbase的位置 上图描述了Hadoop 2.0生态系统中的各层结构.其中HBase位于结构化存储层,HDFS为HBase提供了高可靠性的底层存储支持, MapReduce为HBas ...

  9. OWASP移动安全漏洞Top 10

    •脆弱的服务器端安全控制 在OWASP排第一的漏洞是“脆弱的服务器端安全控制”,顾名思义,就是没有以一个安全的方式从移动应用程序向服务器端发送数据,或在发送数据时暴露了一些敏感的API.例如,考虑对一 ...

  10. 20155207 EXP6 信息搜集与漏洞扫描

    20155207 EXP6 信息搜集与漏洞扫描 基础问题回答 1)哪些组织负责DNS,IP的管理. ICANN统一管理全球根服务器 全球根域名服务器(13台) 地区性注册机构(5个)ARIN RIPE ...