分析system_call中断处理过程

李亚健    《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

一、实验过程

使用gdb跟踪分析一个系统调用内核函数(上周选择的那一个系统调用)

1.进入实验楼环境,进入LinuxKernel:

rm menu -rf

git clone https://github.com/mengning/menu.git  从github中克隆

cd menu

make rootfs

2.给menuOS增加自己的内容:

<1>在test.c中的main函数里增加MenuConfig

<2>增加对应的a.c函数和a_asm.c函数

<3>make rootfs 自动编译脚本

3.开始调试:

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

gdb  file linux-3.18.6/vmlinux

gdb  target remote:1234

查询4号系统调用,设置断点:   b a_asm

gdb  c

可以看到:Break point 2,at time.c:63

gdb  s

一直按n单步执行会进入schedule函数。

a_asm返回后进入会汇编代码处理的gdb不好追踪。

执行int 0x80执行后system_call对应的代码

gdb  b system_call

可以找到entry_32.s,line 477.

二、分析system_call对应的汇编代码的工作过程

1.Trap_init():Set_system_trap_gate  Set_bit

2.看老师简化后便于理解的system_call伪代码

3.在entry_32.S 系统调用就是特殊的中断 存在保护和恢复现场

4.SAVE_ALL  Sys_call_table就是调用sys_time

5.先保存返回值 Syscall_exit_work  没有则返回到用户态。

6.INTERRUPT_RETURN <=> iret,结束。

字很难看,见谅!

三、对“系统调用处理过程”的理解:

1、用户态进程调用int 0x80(或system_call),中断进程,保护现场,让CPU停止当前工作转为执行系统内核中预设的一些任务,然后进入才能进入内核态;调用结束后       又会恢复现场回到内核态。

2、中断后会对调用的任务进行各种检查,并进行调度,完成调用后,再进行检查,才能执行iret返回。

3、将处理机状态由用户态转为系统态。之后,由硬件和内核程序进行系统调用的一般性处理,即首先保护被中断进程的CPU环境,将处理机状态字PSW、程序计数器PC、系统调用号、用户找指针以及通用寄存器内容等压入堆栈,然后,将用户定义的参数传送到指定的地方保存起來。分析系统调用类型,转入相应的系统调用处理子程序。为使不同的系统调用能方便地转向相应的系统调用处理子程序,在系统中配置了一张系统调用入口表。表中的每个表目都对应一条系统调用,其中包含该系统调用自带参数的数目、系统调用处理子程序的入口地址等。内核可利用系统调用号去查找该表,即可找到相应处理子程序的入口地址而转去执行它。在系统调用处理子程序执行完后,恢复被中断的或设置新进程的CPU现场,然后返冋被中断进程或新进程,继续往下执行

时间: 2024-10-19 04:26:28

分析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

通过系统调用分析system_call中断处理过程

罗冲 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 1. 实验准备 1.1 环境准备 下载linux3.18.6的源代码. 按照http://mooc.study.163.com/learn/USTC-1000029000?tid=2001214000#/learn/content?type=detail&id=2001400011给出步骤进行编译 # 下载内核源代码编

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

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

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虚拟机环境下完成实验. 根据本周所学知识分析系

linux内核分析第五周-分析system_call中断处理过程

本实验目的:通过以一个简单的menu小程序,跟踪系统调用的过程,分析与总结系统调用的机制和三层进入的过程. 实验原理:系统调用处理过程与中断处理的机制 系统调用是通过软中断指令 INT 0x80 实现的,而这条INT 0x80指令就被封装在C库的函数中.(软中断和我们常说的硬中断不同之处在于,软中断是由指令触发的,而不是由硬件外设引起的.)INT 0x80 这条指令的执行会让系统跳转到一个预设的内核空间地址,它指向系统调用处理程序,即system_call函数. system_call函数是怎么

通过实验分析system_call中断处理过程

作者:吴乐 山东师范大学 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 本实验目的:通过以一个简单的menu小程序,跟踪系统调用的过程,分析与总结系统调用的机制和三层进入的过程. 一.实验步骤 1.使用gdb在sys_time处设置断点并list找到的代码 2.用s(step)跟踪断点 3.当进入system_call的时候gdb无法继续跟踪,实验结束,找到源代码进行分析 二.system_call对应的汇编

system_call中断处理过程

使用gdb跟踪分析一个系统调用内核函数(您上周选择那一个系统调用),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/syscall_32.tbl ,推荐在实验楼Linux虚拟机环境下完成实验. 根据本周所学知识分析系统调用的过程,从system_call开始到iret结束之间的整个过程,并画出简要准确的流程图,

Linux内核system_call中断处理过程

在相应的test.c中添加getpid和getpid-asm的函数,使Menu实现getpid和getpid-asm的命令. 添加完成后,修改menu目录下的Makefile文件中的 qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img变为qemu-system-i386 -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img 然后执行在menu目录

《Linux内核分析》 week5作业-system call中断处理过程

一.使用gdb跟踪分析一个系统调用内核函数 1.在test.c文件中添加time函数与采用c语言内嵌汇编的time函数.具体实现请看下图. 2.然后在main函数中添加MenuConfig函数,进行注册.这样当Menuos运行起来时,界面就会多出time与time-asm选项. 3.通过make rootfs命令运行 采用gdb调试的过程 qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S gdb fi