扒开系统调用的三层皮           20135311傅冬菁

一、内容分析

寄存器上下文(从用户态切换到内核态)

中断/int指令会在堆栈上保存一些寄存器的值(用户态栈顶地址、、当时的状态字、当下的cs:eip的值)

系统调用概述

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

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

应用编程接口和系统调用的关系:

API只是一个被封装好的函数定义

系统调用通过软中断(trap)向内核发出一个明确的请求

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

ibc库定义的API使得程序员不用去以汇编代码进行系统调用而是直接以函数调用的形式。

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

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

API可能直接提供用户态的服务

一个单独的API可能调用几个系统调用

不同的API可能调用了同一个系统调用

关于返回值

大部分封装例程返回一个整数,其值的含义依赖于相应的系统调用

返回值-1在多数情况下表示内核不能满足进程的请求,Libc中定义的errno变量包含特定的出错码

系统调用的三层皮:xyz,system_call,sys_xyz。即:API,中断向量,服务程序。

xyz()函数是系统调用对应的API,这个应用程序编程接口里面封装了一个系统调用,这个系统调用会触发一个int0x80的中断,产生向量为128的编译异常,0x80这个中断向量对应着system_call这个内核代码的起点,这个内核代码里面会有SAVE_ALL,然后执行到sys_xyz()中断服务程序,进入程序里面处理,在中断服务程序执行完之后会ret_from_sys_call,在return的过程中可能会发生进程调度,如果没有进程调度,就会iret,回到用户态接着执行。

内核实现了很多不同的系统调用, 进程必须指明需要哪个系统调用,这需要传递一个名为系统调用号的参数

system_call是linux中所有系统调用的入口点,每个系统调用至少有一个参数,即由eax传递的系统调用号。具体过程如下:

1.一个应用程序调用fork()封装例程,那么在执行int $0x80之前就把eax寄存器的值置为2(即__NR_fork)。
2.这个寄存器的设置是libc库中的封装例程进行的,因此用户一般不关心系统调用号
3.进入sys_call之后,立即将eax的值压入内核
堆栈

寄存器传递参数也有相应的限制:

1.每个参数长度不能超过寄存器的长度(32位)

2.在eax外,参数的个数不能超过6个(ebx,ecx,edx,esi,edi,ebp),超过6个就使用指针调用某一个块的内存。

二、实验过程

这是我选择系统调用号为20的例子,getpid()函数有返回值。

该例子中,getpid()函数的参数为零,所以ebp寄存器中压入的是0这个数;

int $80 是中断指令,调用前一条指令中eax寄存器中所保留的$14(即编号为20的系统调用getpid);

最后再将getpid函数的返回值放在寄存器eax中,以便最后的输出。

除此之外,我还用了exit()这个编号为1的系统调用(该函数无返回值),可是在嵌入式汇编程序中没有编译成功。求各位大神能帮忙指点迷津!!!

三、学习总结

通过自己动手做实验,虽然一直失败,但是至少让我明白了系统调用从用户态到内核态的过程。在调用某个封装好的API时,系统从用户态切换到内核态,并保持当前的进程的上下文,将状态栈顶指针,cs:eip等信息压入栈。之后再调用中断向量/指令,类似于异常中断的过程,进入到内核态,通过系统调用号调用函数,之后再保存当前的返回值,并回到原来的进程当中,完成一次系统调用。

《Linux内核分析》--扒开系统调用的三层皮 20135311傅冬菁的更多相关文章

  1. linux内核分析——扒开系统调用的三层皮(上)

    20135125陈智威 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 系统调用 ...

  2. linux内核分析——扒开系统调用的三层皮

    万子惠 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验部分 选择2 ...

  3. Linux内核分析— —扒开系统调用的三层皮(上)

    实验部分 根据系统调用表,选取一个系统调用.我选得是mkdir这个系统调用,其系统调用号为39,即0x27 由于mkdir函数的原型为int mkdir (const char *filename, ...

  4. linux内核分析——扒开系统调用的三层皮(下)

    20135125陈智威 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ” 实验 ...

  5. Linux内核分析— —扒开系统调用的三层皮(下)

    课程主要内容有三点: 在MenuOS中通过添加代码增加自定义的系统调用命令 使用gdb跟踪调试内核 简单分析system_call代码了解系统调用在内核代码中的处理过程 实验——分析system_ca ...

  6. 20135239 益西拉姆 linux内核分析 扒开系统调用的三层皮(下)

    一. 给MenuOS增加time-asm命令 代码解释 1.-rf:强制删除 2.clone :重新克隆 3.time-asm:显示系统时间的汇编形式 给MenuOS增加time和time-asm命令 ...

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

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

  8. 《Linux内核分析》第五周 扒开系统调用的三层皮(下)

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

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

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

随机推荐

  1. BZOJ5018:[SNOI2017]英雄联盟(背包DP)

    Description 正在上大学的小皮球热爱英雄联盟这款游戏,而且打的很菜,被网友们戏称为「小学生」.现在,小皮球终于受不了网友们的嘲讽,决定变强了,他变强的方法就是:买皮肤! 小皮球只会玩N个英雄 ...

  2. Git branch -r 无法获取远程分支,ui可以看见分支但是git 命令无法查看解决方案

    zhc@hongchangfirst$ git checkout -b hongchangfirst origin/hongchangfirst 出现: fatal: Cannot update pa ...

  3. Chrome插件(扩展)开发全攻略

    [干货]Chrome插件(扩展)开发全攻略:https://www.cnblogs.com/liuxianan/p/chrome-plugin-develop.html

  4. k8s mongodb 集群配置

    service.yaml apiVersion: v1 kind: Service metadata: name: mongo labels: name: mongo spec: ports: - p ...

  5. MP实战系列(九)之集成Shiro

    下面示例是在之前的基础上进行的,大家如果有什么不明白的可以参考MP实战系列的前八章 当然,同时也可以参考MyBatis Plus官方教程 建议如果参考如下教程,使用的技术为spring+mybatis ...

  6. pip install Yellowfin失败的问题

    上面的方法简单有效 https://blog.csdn.net/quqiaoluo5620/article/details/80608474

  7. jq中each的中断

    最近在做项目中,遇到jq的each方法中的回调函数里面的break不生效,即通过 jquery 的循环方法进行数组遍历,但是当不符合条件时,怎么跳出当前循环,我们经常会习惯JS中的break和cont ...

  8. SQL 登录名 用户 角色

    参考博客:http://www.cnblogs.com/ChineseMoonGod/p/5860449.html,非常感谢博主的知识分享. 1.创建一个登录名,完全操作数据库权限,步骤为:创建登录名 ...

  9. java.lang.NoClassDefFoundError: org.androidpn.client.PersistentConnectionListener

    在运行AndroidpnClient项目时出现了java.lang.NoClassDefFoundError: org.androidpn.client.PersistentConnectionLis ...

  10. TCP和UDP套接字编程 (java实现)

    在了解网络编程之前,我们先了解一下什么叫套接字 套接字即指同一台主机内应用层和运输层之间的接口 由于这个套接字是建立在网络上建立网络应用的可编程接口 因此也将套接字称为应用程序和网络之间的应用程序编程 ...