万子惠 + 原创作品转载请注明出处 + 《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. python简单实现用户表单登录

    实现简单的用户表单验证登录 user="desperado" pwd=" s=0 for i in range(10): if s < 3: username = ...

  2. c++11中的for简化用法

    1.序列for循环 map<string,int> m{{"a",1},{"b",2},{"c",3}} for(auto p: ...

  3. Hadoop简介

    原来:计算效率低 现在:成本降低,能用PC机,就不用大型机和高端存储了:软件容错硬件故障视为常态,通过软件保证可靠性:简化并行分布式计算,无需控制节点同步和数据交换,但是谷歌只发表了相关技术论文,没有 ...

  4. iOS - CocoaPods 第三方开源框架管理

    1.CocoaPods CocoaPods 是一个负责管理 iOS 项目中第三方开源库的工具.CocoaPods 的项目源码在 Github 上管理.该项目开始于 2011 年 8 月 12 日,在这 ...

  5. java.lang.UnsupportedClassVersionError: org/apache/maven/cli/MavenCli : Unsupported major.minor version 51

    http://blog.csdn.net/e_wsq/article/details/52100234 一日换了一下MyEclipse,换成2016CI,结果从SVN上下载了一个工程后出现以下错误: ...

  6. C语言输出字符串

    在VS2012中,使用gets_s()方法,其中第二个参数可以用sizeof(...)代替.例子代码如下: #include <stdio.h> int main( ) { ]; gets ...

  7. Linux下安装国际版QQ (转)

    原文链接:http://www.linuxidc.com/Linux/2016-09/134923.htm 说明:一开始,我在Ubuntu 16.04下安装的QQ版本是Wineqq2013SP6-20 ...

  8. jquery插件开发基础入门

    jquery插件开发基础入门 入门 编写一个jquery插件开始于给jquery.fn加入新的功能属性,此处添加的对象属性的名称就是你的插件名称 jQuery.fn,myPlugin = functi ...

  9. jquery动画基础

    根据id改变字体大小的动画 <div class="speech">样式切换</div> <div id="switcher"&g ...

  10. Windows Store App 主题动画

    Windows 8系统的动画库中包含了丰富的主题动画,在开发Windows应用商店应用时,使用主题动画编写较少的代码即可实现所期望的动画效果.下面介绍一些常用的主题动画,读者可以根据每种主题动画提供的 ...