Linux内核分析—实验五分析system_call中断处理过程

      郑斌 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

实验要求:

  • 使用gdb跟踪分析一个系统调用内核函数(您上周选择的那一个系统调用),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/syscall_32.tbl ,推荐在实验楼Linux虚拟机环境下完成实验。
  • 根据本周所学知识分析系统调用的过程,从system_call开始到iret结束之间的整个过程,并画出简要准确的流程图,撰写一篇署名博客,并在博客文章中注明“真实姓名(与最后申请证书的姓名务必一致) + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”,博客内容的具体要求如下:
  • 题目自拟,内容围绕系统调用system_call的处理过程进行;
  • 博客内容中需要仔细分析system_call对应的汇编代码的工作过程,特别注意系统调用返回iret之前的进程调度时机等。
  • 总结部分需要阐明自己对“系统调用处理过程”的理解,进一步推广到一般的中断处理过程。

实验环境:

本次实验在实验楼Linux虚拟机环境进行。

实验内容:

1.按照视频的教程,把上周的系统调用函数getpid()和getpid_asm()添加到内核中。

过程如下图所示:

打开menu中的 test.c文件,添加如下代码

 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 }

并在main函数中添加

重新make 后。可以看到menuOS有了getpid的命令,功能为返回当前进程的标识。

通过试验可以看到,系统中已经成功添加了该函数调用功能。

下面对该程序进行调试分析,了解系统调用的过程。

其中部分命令为:

qemu -kernel  linux.3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S 调试。

file linux-3.18.6/vmlinux 加载调试内核符号表。

b 设置断点   n 单步执行

我们分别在start_kernel  ,systemy_call , sys_getpid.添加断点并执行观察,list查看附近的代码。

(>﹏<)本人水平有限,我真的有很努力的看啊,分析啊,可是还是不太懂啊(╯^╰)

接下来我们对系统调用过程中system_call到iret之间的调用进行分析。

这部分menuOS还不能使用gdb调试,主要为参考老师讲课内容,以及/linux-3.18.6/arch/x86/kernel/entry_32.S,和一些网上资料。

其中在上面的syscall_exit_work可以分析看到 执行workpend过程中,可能会有新的userspace。

我的理解为系统调用过程中可能产生其他优先级更高的中断,CPU先去执行新的更高优先级中断程序执行完毕后再回来执行当前的系统调用。

所以会产生嵌套调用。 具体其中的过程,由于本人时间和能力分析有限,有不对的大神们多多指教。

当执行返回后会resotre_all 恢复中断现场,相关参数等。

实验总结:

通过 int $0x80 产生系统调用,根据系统调用号参数执行具体的系统调用程序。

本次实验主要是学习了系统调用过程中的sys_call的内部执行机制,虽然分析的很浅显,但还是很好的帮助提高了对这部分的linux内核机制运行的理解。

实验开始过程中添加自己写的系统调用到menuOS搞了好久,是太粗心写过代码了,要静下心来认真点啊。

时间: 2024-10-08 07:22:10

Linux内核分析—实验五分析system_call中断处理过程的相关文章

实验5 :分析system_call中断处理过程

分析system_call中断处理过程 上周我们使用gcc内嵌汇编调用系统调用,这次我们具体分析下过程. 将getpid嵌入menuos 代码从github下载,步骤如下: 1. 增加一个函数,getpid 2. 在main中添加MenuConfig("getpid","Show Pid", Getpid); 3. 重新编译 make roofs 4. 此时启动 执行getpid就可以看到打印出pid为1   menuos的原理 其实这个很简单,在上上周我们分析过l

Linux内核抢占实现机制分析【转】

Linux内核抢占实现机制分析 转自:http://blog.chinaunix.net/uid-24227137-id-3050754.html [摘要]本文详解了Linux内核抢占实现机制.首先介绍了内核抢占和用户抢占的概念和区别,接着分析了不可抢占内核的特点及实时系统中实现内核抢占的必要性.然后分析了禁止内核抢占的情况和内核抢占的时机,最后介绍了实现抢占内核所做的改动以及何时需要重新调度. [关键字]内核抢占,用户抢占,中断, 实时性,自旋锁,抢占时机,调度时机,schedule,pree

Linux内核抢占实现机制分析

Sailor_forever  [email protected] 转载请注明 http://blog.csdn.net/sailor_8318/archive/2008/09/03/2870184.aspx [摘要]本文详解了Linux内核抢占实现机制.首先介绍了内核抢占和用户抢占的概念和区别,接着分析了不可抢占内核的特点及实时系统中实现内核抢占的必要性.然后分析了禁止内核抢占的情况和内核抢占的时机,最后介绍了实现抢占内核所做的改动以及何时需要重新调度. [关键字]内核抢占,用户抢占,中断, 

Linux内核态抢占机制分析(转)

Linux内核态抢占机制分析  http://blog.sina.com.cn/s/blog_502c8cc401012pxj.html 摘 要]本文首先介绍非抢占式内核(Non-Preemptive Kernel)和可抢占式内核(Preemptive Kernel)的区别.接着分析Linux下有两种抢占:用户态抢占(User Preemption).内核态抢占(Kernel Preemption).然后分析了在内核态下:如何判断能否抢占内核(什么是可抢占的条件):何时触发重新调度(何时设置可抢

(转)Linux内核基数树应用分析

Linux内核基数树应用分析 ——lvyilong316 基数树(Radix tree)可看做是以二进制位串为关键字的trie树,是一种多叉树结构,同时又类似多层索引表,每个中间节点包含指向多个节点的指针数组,叶子节点包含指向实际对象的指针(由于对象不具备树节点结构,因此将其父节点看做叶子节点). 图1是一个基数树样例,该基数树的分叉为4(2^2),树高为4,树的每个叶子结点用来快速定位8位文件内偏移,可以定位4x4x4x4=256(叶子节点的个数)页,如:图中虚线对应的两个叶子结点的路径组成值

Linux内核--网络栈实现分析(七)--数据包的传递过程(下)

本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7545855 更多请查看专栏,地址http://blog.csdn.net/column/details/linux-kernel-net.html 作者:闫明 注:标题中的”(上)“,”(下)“表示分析过程基于数据包的传递方向:”(上)“表示分析是从底层向上分析.”(下)“表示分析是从上向下分析. 在博文Linux内核--网络栈

Linux内核--网络栈实现分析(十一)--驱动程序层(下)

本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7555870 更多请查看专栏,地址http://blog.csdn.net/column/details/linux-kernel-net.html 作者:闫明 注:标题中的”(上)“,”(下)“表示分析过程基于数据包的传递方向:”(上)“表示分析是从底层向上分析.”(下)“表示分析是从上向下分析. 在博文Linux内核--网络栈

Linux内核设计基础(五)之内存管理

我感觉学习操作系统首先要从内存分配和管理入手.首先我们应该知道现代操作系统是以页为单位进行内存管理的,32位体系结构支持4KB的页,而64位体系结构支持8KB的页.页是用来分配的,如何才能进行高效和充分的利用,这是内存管理单元(MMU)应当仔细考虑的. 页分配 内核用结构体struct page表示每个物理页.内核用这一结构来管理系统中所有的页,因为内核需要知道一个页是否空闲(也就是页有没有被分配),如果页已经被分配,内核需要知道谁拥有这个页,拥有者可能是用户空间进程.动态分配的内核数据.静态内

实验五:分析system_call中断处理过程

原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 如果我写的不好或者有误的地方请留言 题目自拟,内容围绕系统调用system_call的处理过程进行: 博客内容中需要仔细分析system_call对应的汇编代码的工作过程,特别注意系统调用返回iret之前的进程调度时机等. 总结部分需要阐明自己对“系统调用处理过程”的理解,进一步推广到一般的中断处理过程. 实验报告: 1.将myfork()和