万子惠 + 原创作品转载请注明出处 + 《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. logstash filter grok 用法

    在elk+filebeat都安装好,且明白了基本流程后,主要的就是写logstash的filter了,以此来解析特定格式的日志 logstash的filter是用插件实现的,grok是其中一个,用来解 ...

  2. python学习笔记七 初识socket(进阶篇)

    socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. sock ...

  3. OpenCV安装配置的简单记录

    在ubuntu16.04下安装OpenCV 2.4.11的简单记录 1. 安装cmake,执行$apt-get install cmake即可,cmake -version验证 2. 下载OpenCV ...

  4. Tiles & SiteMesh

    Tiles & SiteMesh 这两天在给公司的新项目搭框架,在配tiles框架的时候发现一个小问题:    比如开发团队一共5人,每人10个页面,如果按照简单的tiles框架配置方法,每个 ...

  5. oracle物化视图

    物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的.普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询. 这样对整 ...

  6. [jetbrains系列] 外链第三方库+代码补全设置

    jetbrains系列的IDE真的是太好用了,有种相见恨晚的感觉. 在开发过程中第三方库是必不可少的,在开发的时候如果有一个可以补全的IDE可以节省查文档的时间. 举个例子:给pycharm配pysp ...

  7. C#MVC使用二进制流显示图片

    关于显示图片的最好方法当然是img 的src直接指向地址,简单实用.但是有时候也会使用到使用图片流显示图片的方法.实现也比较简单(在C# mvc中,java的不了解).具体如下: 1.前台cshtml ...

  8. Eclipse 修改API

    真机调试时报错,提示application api 21,device api 10 Automatic Target Mode: Unable to detect device compatibil ...

  9. 使用新版Android Studio检测内存泄露和性能

    内存泄露,是Android开发者最头疼的事.可能一处小小的内存泄露,都可能是毁于千里之堤的蚁穴.  怎么才能检测内存泄露呢?网上教程非常多,不过很多都是使用Eclipse检测的, 其实1.3版本以后的 ...

  10. MySQL默认数据库

    欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...