linux内核分析——扒开系统调用的三层皮
万子惠 + 原创作品转载请注明出处 + 《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内核分析——扒开系统调用的三层皮的更多相关文章
- linux内核分析——扒开系统调用的三层皮(上)
20135125陈智威 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 系统调用 ...
- Linux内核分析— —扒开系统调用的三层皮(上)
实验部分 根据系统调用表,选取一个系统调用.我选得是mkdir这个系统调用,其系统调用号为39,即0x27 由于mkdir函数的原型为int mkdir (const char *filename, ...
- linux内核分析——扒开系统调用的三层皮(下)
20135125陈智威 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ” 实验 ...
- Linux内核分析— —扒开系统调用的三层皮(下)
课程主要内容有三点: 在MenuOS中通过添加代码增加自定义的系统调用命令 使用gdb跟踪调试内核 简单分析system_call代码了解系统调用在内核代码中的处理过程 实验——分析system_ca ...
- 20135239 益西拉姆 linux内核分析 扒开系统调用的三层皮(下)
一. 给MenuOS增加time-asm命令 代码解释 1.-rf:强制删除 2.clone :重新克隆 3.time-asm:显示系统时间的汇编形式 给MenuOS增加time和time-asm命令 ...
- 《Linux内核分析》第四周 扒开系统调用的“三层皮”
[刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK FOUR( ...
- 《Linux内核分析》第五周 扒开系统调用的三层皮(下)
[刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK FIVE( ...
- LINUX内核分析第五周学习总结——扒开系统调用的“三层皮”(下)
LINUX内核分析第五周学习总结--扒开系统调用的"三层皮"(下) 标签(空格分隔): 20135321余佳源 余佳源 原创作品转载请注明出处 <Linux内核分析>M ...
- 《Linux内核分析》第五周学习总结 扒开系统调用的三层皮(下)
扒开系统调用的三层皮(下) 郝智宇 无转载 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.给Men ...
随机推荐
- android小知识之fragment中调用startActivityForResult(Intent intent,int requestcode)所遇到的问题
大家都知道对于Activity和Fragment都可以注册OnActivityResult()方法,但是要注意几点: a.当activity和fragment都注册了OnActivityResult( ...
- 从零开始学iPhone开发(1)——工具的使用
前提:已经具备了苹果电脑或者iMac,或者安装好了x86苹果而且已经联网. 苹果系统版本要求是:Max OS X Lion,或者 Mountain Lion 我们对iPhone进行使用的工具是XCod ...
- 大分享-hibernate,springmvc,easyui简要介绍
近期公司一直在做项目,主要用到了springMVC,eseayui,hibernate几大框架.近一个月的时间,个人就目前自我知识给予分享. 很多公司使用mybatis产品,综合所述其最大优点是全SQ ...
- GITHUB使用简介
前提:本地开通SSH服务 我是Ubuntu OS,其他OS自行查找,不难目的:利用Github的免费托管服务,创建自己的repo或者fork别人的repo.步骤:·安装客户端 安装如下两个git ...
- SPI总线(同步)
一.SPI总线简介 串行外围设备接口SPI(serial peripheral interface)总线技术是Motorola公司推出的一种同步串行接口.SPI 用 于CPU与各种外围器件进行全双工. ...
- c语言指针占几个字节
指针即为地址,指针几个字节跟语言无关,而是跟系统的寻址能力有关,譬如以前是16为地址,指针即为2个字节,现在一般是32位系统,所以是4个字节,以后64位,则就为8个字节. 可以在自己的电脑上测试下: ...
- TCP短连接TIME_WAIT问题解决方法大全
tcp连接是网络编程中最基础的概念,基于不同的使用场景,我们一般区分为“长连接”和“短连接”,长短连接的优点和缺点这里就不详细展开了,有心的同学直接去google查询,本文主要关注如何解决tcp短连接 ...
- 获得省市 json 后台代码
string connString = ConfigurationManager.ConnectionStrings["connStr"].ToString(); SqlConne ...
- 由两点坐标如何画出直线 matlab
由两点坐标如何画出直线 方法1:利用直线方程 斜率加截距 方法2:数据拟合 %由两点坐标得数据拟合直线与画线 x = [,]; y = [,]; k = ((-)/(-));% 由两点坐标得到直线斜 ...
- 常用linux命令积累
------------------------------不定时更新------------------------------------------------- 1.Ubuntu关机:shut ...