万子惠 + 原创作品转载请注明出处 + 《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. HDU3333 Turing Tree 树状数组+离线处理

    Turing Tree Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  2. sql视图实例

    一个视图是一个或一组SQL语句,存储在数据库中相关的名称.一个视图实际上是一个预定义的SQL查询中的表的形式组成. 一个视图可以包含一个表的所有行,或选择表中的行.从一个或多个表上写SQL查询创建一个 ...

  3. Java 集合 - ArrayList

    源码分析 属性 // 默认的初始化容量 private static final int DEFAULT_CAPACITY = 10; // 用于无参构造中初始化一个空数组 private stati ...

  4. eclipse + maven 搭建springMVC+Spring+mybatis 系统

    首先需要下载maven 安装maven插件.自行百度. 1: 创建maven系统 http://huxiaoheihei.iteye.com/blog/1766986 2:添加pom依赖: pom.x ...

  5. hbm配置文件 generator节点各种解释

    今天犯了个错误 generator节点class属性有这么几个值(主键生成策略方案): assigned:由用户指定主键值 sequence:由oracle序列生成 increment:对类型为lon ...

  6. 学习mongo系列(十)MongoDB 备份(mongodump)与恢复(mongorerstore) 监控(mongostat mongotop)

    一.备份 在Mongodb中我们使用mongodump命令来备份MongoDB数据.该命令可以导出所有数据到指定目录中. mongodump命令可以通过参数指定导出的数据量级转存的服务器. mongo ...

  7. 编写高效且优雅的 Python 代码

    http://python.jobbole.com/86808/ http://python.jobbole.com/86869/?utm_source=blog.jobbole.com&ut ...

  8. springMVC,mybatis配置事务

    首先应该对context:include-filter和context:exclude-filter有一个了解,include是包含这个,而不是只包含,下面会有例子看看: 这是我最开始配置的MVC的配 ...

  9. Deep Learning 7_深度学习UFLDL教程:Self-Taught Learning_Exercise(斯坦福大学深度学习教程)

    前言 理论知识:自我学习 练习环境:win7, matlab2015b,16G内存,2T硬盘 练习内容及步骤:Exercise:Self-Taught Learning.具体如下: 一是用29404个 ...

  10. UIApplication sharedApplication详细解释-IOS

    iPhone应用程序是由主函数main启动,它负责调用UIApplicationMain函数,该函数的形式如下所示: int UIApplicationMain ( int argc, char *a ...