总结部分:

用户态和内核态:

前提知识:cpu有几种不同指令执行的级别

用户态:代码的掌控范围受限制

内核态:高级别,代码课执行特权指令,访问任意物理地址。

权限设置的意义:没有的话,系统容易啊崩溃,应用程序代码没有内核代码可靠

Linux有两种执行级别:0级(内核态)3级(用户态)

Cs寄存器的最低两位表明当前代码的特权级别(一共可以表示四种)

CPU每条指令的读取都是通过当前CS:eip这两个寄存器

逻辑地址空间,可以显著地分开用户态和内核态

0xc0000000以上只有内核态

0x00000000~0xbfffffff用户态和内核态

中断处理:用户态进入内核态的主要方式

用户也可以通过系统调用陷入内核,系统调用是特殊的中断。

寄存器上下文

用户切换到内核,必须保存用户态的寄存器上下文

中断int指令会在堆栈上保存:

用户态栈顶地址,当时的状态字,当时的cs:eip值

内核态栈顶地址,当时的状态字,中断处理程序入口。

中断服务程序:

首先保护现场(SAVE_ALL:保存需要用到的寄存器数据)。

退出恢复现场(RESTORE_ALL:退出中断程序,恢复保存寄存器的数据)。

用户态进程和硬件设备的交互:系统调用

  1. 把用户态从底层的硬件设备编程中解放出来
  2. 极大地提升了系统安全性
  3. 有利于程序的可移植性

应用程序接口API :仅是函数定义

系统调用:是进程明确的请求

每一个系统调用对应一个封装例程,封装例程再被API引用。但是API和系统调用没有明确的对应关系,可能一对一,一对多,多对多,多对一。

系统调用“三层皮”

  API

  中断向量

  中断服务程序

当用户态进程调用一个系统调用时,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个的情况下,使用某一个寄存器作为指针,进入内核态之后可以访问所有的地址空间,通过某一片区域传递参数。

实验部分:

我选取了50号函数getegid

首先查看它包含的库和返回值

/*getegid1.c*/

#include<unistd.h>

#include<stdio.h>

int main()

{

gid_t gid;

gid = getegid ();

printf(“the group ID is %d”,gid);

return 0;

}

运行结果

该程序的嵌入式汇编代码版

/*getegid2.c*/

#include<unistd.h>

#include<stdio.h>

int main()

{

gid_t gid;

gid = getegid ();

asm volatile(

“mov $0x32,%%eax\n\t”//50号系统调用用eax传递

“int $0x80\n\t”//中断向量,执行中断服务程序

“mov %%eax,%0\n\t”//返回值保存在gid中

:”=m”(gid)

);

printf(“the group ID is %d”,gid);

return 0;

}

运行结果

分析:

系统调用的过程:先将系统调用号放在%eax里,相当于API和中断服务程序连接的桥梁,然后执行中断指令int$0x80,在堆栈上保存用户态栈顶地址,当时的状态字,当时的cs:eip值;内核态栈顶地址,当时的状态字,中断处理程序入口。然后系统调用的函数开始在内核执行,执行的结果(返回值)保存在%eax里,再由%eax传入gid,然后弹栈恢复现场。

linux及安全第四周总结——20135227黄晓妍的更多相关文章

  1. linux及安全第二周总结——20135227黄晓妍

    实验部分: 首先运行结果截图 代码分析: Mypcb.h /* *  linux/mykernel/mypcb.h * *  Kernel internal PCB types * *  Copyri ...

  2. linux及安全期中总结——20135227黄晓妍

    Linux及安全期中总结 黄晓妍 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ...

  3. Linux基础入门学习笔记20135227黄晓妍

    学习计时:共24小时 读书:1小时 代码:8小时 作业:3小时 博客:12小时 一.学习目标 1. 能够独立安装Linux操作系统   2. 能够熟练使用Linux系统的基本命令   3. 熟练使用L ...

  4. linux及安全《Linux内核设计与实现》第四章——20135227黄晓妍

    第四章 进程调度 进程调度程序是一个内核子系统 分配有限的处理器时间和资源 最大限度利用时间的原则(只要有可执行的进程,那么总会有进程执行) 基本工作:从一组处于等待(阻塞)状态的可执行进程中选择一个 ...

  5. linux及安全《Linux内核设计与实现》第三章——20135227黄晓妍

    第三章 (由于linux不区分进程和线程,所以它们在linux中被称为task,也叫任务) 总结:本章主要包括进程以及线程的概念和定义,Linux内核如何管理每个进程,他们在内核中如何被列举,如何创建 ...

  6. linux及安全第八周总结——20135227黄晓妍

    实验部分 实验环境搭建 -rm menu -rf git clone https://github.com/megnning/menu.git cd menu make rootfs qemu -ke ...

  7. linux及安全第七周总结——20135227黄晓妍

    实验部分 首先clone最新的menu 我们可以看到,test.c里多了一个exec的功能,它的代码和fork基本一致,多了一项加载hello rootfs也有一些变化 执行一下exec 让我们启动一 ...

  8. linux及安全第六周总结——20135227黄晓妍

    总结部分: 操作系统内核三大功能: 进程管理,内存管理,文件系统 最核心的是进程管理 为了管理,首先要对每一个进程进行描述.进程描述符提供了所有内核需要了解的信息. 进程控制模块:task_struc ...

  9. linux及安全第五周总结——20135227黄晓妍

    (注意:本文总结备份中有较多我手写笔记的图片,其中重要的部分打出来了.本文对分析system_call对应的汇编代码的工作过程,系统调用处理过程”的理解,以及流程图都写在实验部分.) 实验部分 使用g ...

随机推荐

  1. 微信开放平台全网发布时,检测失败 —— C#

    主要就是三个:返回API文本消息,返回普通文本消息,发送事件消息   --会出现失败的情况 (后续补充说明:出现检测出错,不一定是代码出现了问题,也有可能是1.微信方面检测时出现服务器请求失败,2.我 ...

  2. JS AJAX传递List数组到后台(对象)

    今天在写代码的时候,碰到的问题,百度了一下,发现原来AJAX传递List数据是可以的,之前还一直用JSON序列化(new Array()数组设置)进行传值的. var _list = {}; //等价 ...

  3. 记一次开发:Qt简单电话本程序

    前言 断断续续学习C++一年了,现在要做课设,觉得控制台界面实在太难看,于是用Qt做一个图形化的程序出来. 学习Qt也没有多久,只是了解了个大概,这次开发基本上是啃了2天的官方帮助文档,然后利用各种Q ...

  4. 在ubuntu14.04上漏洞环境vulndocker的DOCKER搭建

    一.下载git包以及安装: git clone https://github.com/leveryd/vulndocker.git cd vulndocker apt-get install uwsg ...

  5. ios获取设备手持方向——电子罗盘

    转:http://book.51cto.com/art/201411/457105.htm 2014-11-15 19:07 张亚飞/崔巍 中国铁道出版社 字号:T | T 综合评级: 想读()  在 ...

  6. Android动态添加布局

    //1.利用LayoutInflater的inflate动态加载XML mLinearLayout = (LinearLayout)findViewById(R.id.LinearLayout_ID) ...

  7. C++中的const的用法

    const对象.指向const对象的指针.const指针(通过一个面试题来了解)   1.const对象 (1)关于const,很多企业的笔试.面试都会出现,很简单,就问你“const的含义?”. 我 ...

  8. 玩转Javascript this用法

    在web项目中Javascript是一门必须要掌握的动态语言,基于Javascript的框架大多离不开不了最基础的Javascript的用法和原理.本文主要是总结一下Javascript中那万恶的th ...

  9. .net各版本framework官方下载地址

    版本 链接 说明 Microsoft .NET Framework 4(独立安装程序) https://www.microsoft.com/zh-cn/download/details.aspx?id ...

  10. 使用log4net做应用程序全局日志记录保存在数据库中

    几乎所有的大型应用都会有自己的用于跟踪调试的API.因为一旦程序被部署以后,就不太可能再利用专门的调试工具了.然而一个管理员可能需要有一套强大的日志系统来诊断和修复配置上的问题.经验表明,日志记录往往 ...