万子惠 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

实验部分

选择24号getuid

/getuid/

#include <unistd.h>
#include <stdio.h> int main()
{
pid_t uu;
uu=getuid();
printf("uu = %d \n", uu);
return 0;
}

执行情况:

/getuid_asm/

#include <unistd.h>
#include <stdio.h> int main()
{ pid_t uu;
uu = getuid();
asm volatile(
"mov $0x24,%%eax\n\t"
"int $0x80\n\t"
"mov %%eax,%0\n\t"
:"=m"(uu)
);
printf("uu = %d \n",uu);
return 0; }

执行情况:

分析汇编代码调用系统调用的工作过程:

将系统调用号放在eax中,之后使用int 0x80 进行中断。中断时保存现场,用户态栈顶地址,当时的状态字,cs:eip...然后调用相应函数,执行结果保存在%eax中,之后传入uu。


总结部分

part1

高执行级别下,代码可以执行特权指令,访问任意的物理地址——内核态

intel x86 CPU 有四种执行级别0-3级别,Linux只使用其中0和3表示内核态和用户态

最大区别 :

地址空间访问:内核态:0xc000000以上可以访问
用户态:0x0000000-0xbfffffff

中断处理是从用户态到内核态的主要方式(系统调用是中断的一种特殊形式)

寄存器上下文:

从用户态切换到内核态:1)必须保存用户态的寄存器上下文

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

(中断第一件事就是保存现场:#define SAVE_ALL )

中断结束之后会有:RESTORE_ALL/恢复现场/

Iret:与中断信号(包括int指令)发生时的CPU的做的动作真好相反。

中断的完整过程:

1)inter	rupt(ex: int 0x80)_save
cs:eip/ss:eip(当前栈顶)/eflcgs(标志寄存器)(current) to kernel stack ,
then load cs:eip lentry of a specific ISR (加载新入口内核信息))
and ss:eip (point to kernel stack)
2)SAVE_ALL
|
/*进程调度(不是必经)*/
|
3)RESTORE_ALL(内核代码完成中断服务,发生进程调度)
4)iret

系统调用的具体执行:

意义:为用户进程与硬件设备交互一组接口【提供用户程序可可移植性】

API:应用编程(只是个函数)

系统调用软中断向内核发送一个明确请求

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

		1)一个系统调用对应一个封装例程
2)库再用这些封装例程定义用户的API

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

API可能直接提供用户态的服务
一个单独的API可能调用几个系统调用
不同的API可能调用了同一个系统调用

关于返回值:

大部分封装例程返回一个整数,其值的含义依赖于相应的系统调用
-1在多数情况下表示内核不能表示内核满足进程的请求
Libc中定义errno变量包含特定的出错码

三层皮:

1)API
2)中断向量
3)中断服务程序

系统调用服务过程:

I:用户态调用一个调用时,内核态切换并开始执行一个内核函数
LInux中通过执行int $0x80 来执行系统调用(指向向量的128的编程异常) II:传参(使用eax)
限制 1)参数不能超过6个(超出的时候在某个寄存器中来使用指针解决)
2)每个参数的长度不超过寄存器(6个)

Linux中,系统调用号将API xyz和中断服务程序sys_xyz关联起来

part2

我对“系统调用的工作机制”的理解:

首先系统调用的重要性不必赘述,想必很多工作都无法开展,内核安全也是一团糟吧?自从有了系统调用,就在用户与内核之间建立了安全便捷的抽象接口。除了异常和陷入外,它们是唯一的合法入口,使每个进程都运行在虚拟系统中,保证了系统的稳定和安全。

linux内核分析——扒开系统调用的三层皮的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Codeforces Round #356 (Div. 2)

    A. Bear and Five Cards time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  2. Ubuntu 14.04下安装功能强大的屏幕截图软件 Shutter

    [注释]试用了一下,果然很强大,牛逼 一款功能强大的屏幕截图软件——Shutter,Shutter最基本的就是截图功能了,在设计上可以自由选定区域,同时选定之 后依然可以通过上下左右四个地方来改变选区 ...

  3. centos jenkins

    wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo rpm --import htt ...

  4. jQuery核心之DOM操作的常用方法

    参考jQuery官网API文档 1..attr() 获取 :  ); 3.选择器与常用方法: ) .html( "new text for the third h3!" ) .en ...

  5. fifter过滤器

    package fifter; import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterCh ...

  6. 读<jquery 权威指南>[2]-事件

    1.  事件冒泡 阻止事件冒泡的两种方式: event.stopPropagation(); return false ; 2. 绑定事件——bind(type,[data],function) ty ...

  7. PHP数组去重..............过滤字段

    $test_data = M('hot'); //实例化数据表 $data = $test_data->Distinct(true)->field('descriprion')->o ...

  8. NOIP2014提高组 酱油记

    NOIP考到哪里我就写到哪里好了. 2014/10/12 初赛 下午两点半开始考,我两点就到了.然后看到了QYL,NYZ,CZR等大神,先Orz了再说. 考试开始前,发现考场竟然没几个我认识的,不是按 ...

  9. Java: IO 字节流

    FileReader是InputStreamReader的子类,InputStreamReader是Reader的子类.Reader系列是输入字符流. 1.一个字符一个字符的读取 import jav ...

  10. 使用 Hive 作为 ETL 或 ELT 工具

    用来处理数据的 ETL 和 ELT 工具的概述 数据集成和数据管理技术已存在很长一段时间.提取.转换和加载(ETL)数据的工具已经改变了传统的数据库和数据仓库.现在,内存中转换 ETL 工具使得提取. ...