《Linux内核分析》第五周笔记 扒开系统调用的三层皮(下)
扒开系统调用的三层皮(下)
一、给menuOS增加time和time-asm
通过内核调试系统调用。将上次做的实验加入到menusOS,变成menusOS里面的两个命令。
1 int Getpid(int argc , char * argv[])
2{
3 int pid;
4 pid=getpid();
5 printf("pid=%d\n",pid);
6 return 0;
7 }
8
9 int Getpidasm(int argc , char *argv[])
10 {
11 int pid;
12 asm volatile(
13 "mov $0,%%ebx\n\t"
14 "mov $0x14,%%eax\n\t"
15 "int $0x80\n\t"
16 "mov %%eax, %0\n\t"
17 :"=m"(pid)
18 );
19 printf("pid = %d\n",pid);
20 return 0;
21 }
/*强制删除当前的menuOS*/
/*克隆一个menu*/
/*运行脚本*/
这次的menuOS支持的命令增加,增加了time和time-asm两条命令。
二、使用gdb跟踪系统调用内核函数sys_time
/*13号time对应的内核处理函数sys_time*/
/*启动到menuOS,执行time命令系统调用,停在system time函数的位置*/
如果一直按n单步执行会进入schedule函数。
sys_time返回后进入汇编代码处理gdb无法继续跟踪。
执行0x80之后cpu自动跳转到system_call.
三、系统调用在内核代码中的处理过程
1、系统调用在内核代码中的工作机制和初始化
从int 0x80触发一个系统调用到执行系统调用处理的函数sys time,到返回用户态的整个过程是很重要的。进程调度的时机非常关键。
system call系统调用的处理过程:
初始化中断向量的过程中将0x80与system call联系起来。
通过系统调用号将system call与sys_xyz联系起来。
返回用户态之前有一个调度时机,从systime退出后会跟踪到schedule。
系统调用机制的初始化:
2、简化后便于理解的system call伪代码
系统调用是特殊的中断
system call handler stub ENTRY(system_call)
RING0_INT_FRAME
ASM_CLAC pushl_cfi %eax
SAVE_ALL /*宏*/
GET_THREAD_INFO(%ebp)
testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp)
jnz syscall_trace_entry
cmpl $(NR_syscalls), %eax
jae syscall_badsys
syscall_call: call *sys_call_table(,%eax,4) /*根据系统调用号查sys_call_table表里的位置,调用处理函数*/
syscall_after_call:
movl %eax,PT_EAX(%esp)
syscall_exit: LOCKDEP_SYS_EXIT
DISABLE_INTERRUPTS(CLBR_ANY)
TRACE_IRQS_OFF
movl TI_flags(%ebp), %ecx
testl $_TIF_ALLWORK_MASK, %ecx
jne syscall_exit_work /*检测当前任务处理jne syscall_exit_work*/
syscall_exit_work: /*如果不处理任务就结束了*/
testl $_TIF_WORK_SYSCALL_EXIT, %ecx
jz work_pending /*处理信号*/
TRACE_IRQS_ON
ENABLE_INTERRUPTS(CLBR_ANY)
movl %esp, %eax
call syscall_trace_leave
jmp resume_userspace /*恢复用户空间 */
END(syscall_exit_work)
work_pending: testb $_TIF_NEED_RESCHED, %cl
jz work_notifysig work_resched: call schedule /*重新调度*/
在系统调用返回之前有可能发生进程调度(call schedule)
在当前进程有信号发生进程间通讯他会处理当前进程
进程调度过程中会发生进程上下文切换
将内核抽象成很多个中断处理的集合
3、分析system_call到iret的过程
四、总结
这次实验我学习到从int 0x80触发一个系统调用到执行系统调用处理的函数sys time,到返回用户态的整个过程。学习到了进程调度的时机非常关键。system call系统调用的处理过程是:初始化中断向量的过程中将0x80与system call联系起来。通过系统调用号将system call与sys_xyz联系起来。返回用户态之前有一个调度时机,从systime退出后会跟踪到schedule。这次课程使我对系统调用的过程有了更深的了解。
《Linux内核分析》第五周笔记 扒开系统调用的三层皮(下)的更多相关文章
- 《Linux内核分析》第四周笔记 扒开系统调用的三层皮(上)
扒开系统调用的三层皮(上) 一.用户态.内核态和中断 库函数将系统调用封装起来. 1.什么是用户态和内核态 一般现代CPU都有几种不同的指令执行级别. 在高执行级别下,代码可以执行特权指令,访问任意的 ...
- LINUX内核分析第四周学习总结——扒开系统调用的“三层皮”
LINUX内核分析第四周学习总结--扒开系统调用的"三层皮" 标签(空格分隔): 20135321余佳源 余佳源 原创作品转载请注明出处 <Linux内核分析>MOOC ...
- 《Linux内核分析》 第四节 扒开系统调用的三层皮(上)
<Linux内核分析> 第四节 扒开系统调用的三层皮(上) 张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com ...
- 《Linux内核分析》第四周:扒开系统调用的三层皮
杨舒雯 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 " 一. 用户 ...
- LINUX内核分析第五周学习总结——扒开应用系统的三层皮(下)
LINUX内核分析第五周学习总结——扒开应用系统的三层皮(下) 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/cou ...
- LINUX内核分析第五周学习总结——扒开系统调用的“三层皮”(下)
LINUX内核分析第五周学习总结--扒开系统调用的"三层皮"(下) 标签(空格分隔): 20135321余佳源 余佳源 原创作品转载请注明出处 <Linux内核分析>M ...
- 20135327郭皓--Linux内核分析第五周 扒开系统调用的三层皮(下)
Linux内核分析第五周 扒开系统调用的三层皮(下) 郭皓 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/U ...
- linux内核分析第五周学习笔记
linux内核分析第五周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...
- Linux内核分析第五周——扒开系统调用的“三层皮”(下)
Linux内核分析第五周--扒开系统调用的"三层皮"(下) 李雪琦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.1 ...
随机推荐
- 通过explain分析低效的SQL执行计划
之前我们讲过如何开启慢查询日志,这个日志的最大作用就是我们通过设定超时阈值,在执行SQL语句中的消耗时间大于这个阈值,将会被记录到慢查询日志里面.DBA通过这个慢查询日志定位到执行缓慢的sql语句,以 ...
- Linux读写执行权限对目录和文件的影响
提示:这里的用户指的是普通用户 读写执行权限对root无效 对于目录来说 1)只拥有读权限 可以ls 查看目录内容,不能切换进目录中去 也不能创建目录或文件 [support@node1 opt]$ ...
- asp.net mvc项目使用spring.net发布到IIS后,在访问提示错误 Could not load type from string value 'DALMsSql.DBSessionFactory,DALMsSql'.
asp.net mvc项目使用spring.net发布到IIS后,在访问提示错误 Could not load type from string value 'DALMsSql.DBSessionFa ...
- 【Beta Scrum】冲刺! 2/5
1. 今日完成情况 人员 学号 分工 是否完成 完成情况 胡武成 031502610 学习java后端登录验证方式,尝试编写登录api N 刚学会springmvc登录token拦截,准备明天登录注册 ...
- NOIP2018 AFO记
仿佛"距NOIP2018还剩30天"的倒计时还在昨天,没想到这一天来的这么快. 考前在机房嘻嘻哈哈打打闹闹,开玩笑说道"我要AFO了",心里暗暗发誓做好自己,不 ...
- 面试被问http协议?这篇文章足够覆盖所有相关问题!
http使用面向连接的TCP作为传输层协议.http本身无连接. 请求报文 CRLF是回车换行 方法为GET的请求报文 方法为POST的请求报文 方法 OPTIONS:这个方法 ...
- javascript获取指定区间范围随机数的方法
每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code //获取指定区间范围随机数,包括lowerValue和upperValue funct ...
- Scout YYF I POJ - 3744(矩阵优化)
题意:一条路上有n个地雷,给出地雷的位置.某人从起点(位置1)出发,走一步的概率是p,走两步的概率是(1-p),然后问有多少概率走过这个雷区. 思路: 只要走过最后一个地雷就代表走过雷区了. 而每到 ...
- ethereum/EIPs-160 EXP cost increase
eip title author type category status created 160 EXP cost increase Vitalik Buterin Standards Track ...
- python中.py和.pyw文件的区别
:本文为博主原创文章,未经博主允许不得转载. 以下是摘录自百度问题的答案: 严格来说,它们之间的不同就只有一个:视窗运行它们的时候调用不同的执行档案. 视窗用 python.exe 运行 .py ,用 ...