《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 ...
随机推荐
- 修改Github上提交日志
bash: git rebase -i HEAD~5:假定你要修改的日志位于当前版本(HEAD)的前4次提交中. vi: pick -> reword:在自动打开的vi编辑器中,上下选择你要修改 ...
- 如何用jquery实现实时监控浏览器宽度
如何用jquery实现实时监控浏览器宽度 2013-06-05 14:36匿名 | 浏览 3121 次 $(window).width();这代码只能获取浏览器刷新时的那一刻的宽度,如何才能达到实时获 ...
- numpy的random模块
随机抽样 (numpy.random) 简单的随机数据 rand(d0, d1, ..., dn) 随机值 >>> np.random.rand(3,2) array([[ 0.14 ...
- sahrepoint 上传到文档库
sharepoint学习笔记汇总 http://blog.csdn.net/qq873113580/article/details/20390149 /// <summary&g ...
- Ubuntu18.04安装Tensorflow+cuda+cuDNN
本文写的比较简单,期间遇到的一些小麻烦,自己不认为成为阻碍,所以没有详细写. 如有疑问可以联系QQ:2922530320 Pycharm Pycharm使用Anaconda Pycharm 在新建项目 ...
- day12 Python列表
list#类 列表概括 li = [1,2,13,["石振文",["19", 10],"庞麦郎"],"charon",& ...
- 导入其他python文件或者python文件的函数
from abc import xxx 从abc的py文件导入一个具体的函数或者类 import abc 直接导入文件 a.b写在同一个文件目录下,a要使用b,直接import就可以了
- Spring配置跨域请求
本文主要是Spring+SpringMVC+MyBatis/MyBatis Plus框架环境,包括SpringBoot同样适用. 1.编写拦截器 package com.interceptor; im ...
- jconsole使用
先看一张图 根据JConsole和任务管理器对比,堆内存大小在250M左右,差不多空跑一个程序用idea启动springboot就是这个大小 项目启动初始类在一万个左右,活动线程50个上下,cpu利用 ...
- flask config
# config配置 { 'DEBUG': False, # 是否开启Debug模式 'TESTING': False, # 是否开启测试模式 'PROPAGATE_EXCEPTIONS': None ...