《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 ...
随机推荐
- HighCharts初测试
把HighChart嵌入到博客中.
- 【日常开发】使用多种工具实现 sql查询没有结果的name
本文地址 分享提纲: 1. 事情的背景 2. 解决办法 3. 总结 1. 事情的背景 现在需要将2000条数据的name,从user表中查询出来结果,sql 这样写 SELECT * FROM use ...
- web页面中快速找到html对应元素两种方法
一.第一种方法(通过先进入开发模式然后再去选择网页元素) 1.打开IE.Chrome.FireFox等,按 F12 键进入开发模式 2.在打开的控制窗口左上角有个 箭头 按钮,点击它之后,此时将鼠标 ...
- (转)postgresql+postgis空间数据库使用总结
转载地址:https://blog.csdn.net/qq_36588972/article/details/78902195 参考资料: pgrouting路径导航 https://www.cnbl ...
- codeforces 1045 D. Interstellar battle
题目大意:一颗树,给定每个点消失的概率,求出连通块的期望值.要求支持修改消失概率的操作并且给出每次修改过后的期望值.注意被破坏的点不能算入连通块中. 数据范围,时限1S. 传送门 D. Interst ...
- BSOJ 3899 -- 【CQOI2014】 数三角形
Description 给定一个n*m的网格,请计算三个点都在格点上的三角形共有多少个.下图为4*4的网格上的一个三角形. 注意三角形的三点不能共线. Input 输入一行,包含两个空格分隔的正整数 ...
- centos7下安装docker(9容器对资源的使用限制-内存)
一个docker Host上面会运行若干容器,每个容器都需要CPU,内存和IO资源.容器提供了控制分配多少CPU,内存给每个容器的机制,避免摸个容器因占用太多资源而影响其他 ...
- Oracle 11gR2使用RMAN duplicate复制数据库
11g的RMAN duplicate 个人感觉比10g的先进了很多,10g需在rman备份的基础上进行复制,使用RMAN duplicate创建一个数据完全相同但DBID不同的数据库.而11g的RMA ...
- 修改CentOS 7.2系统的主机名
之前使用网上的大部分说法,修改了两个配置文件: /etc/hosts /etc/sysconfig/network 然后,并没有什么卵用. 后来,搜阿里云配置,看到这个办法: 使用“经典网络”类型的E ...
- 研究一下Spark Hash Shuffle 和 SortShuffle 原理机制
研究一下Spark Hash Shuffle 和 SortShuffle 原理机制研究一下Spark Hash Shuffle 和 SortShuffle 原理机制研究一下Spark Hash Shu ...