Linux系统调用与ptrace分析(实验报告)_[文档在线提供].doc

上传人:bao****ty 文档编号:144610092 上传时间:2020-09-11 格式:DOC 页数:12 大小:104KB
返回 下载 相关 举报
Linux系统调用与ptrace分析(实验报告)_[文档在线提供].doc_第1页
第1页 / 共12页
Linux系统调用与ptrace分析(实验报告)_[文档在线提供].doc_第2页
第2页 / 共12页
Linux系统调用与ptrace分析(实验报告)_[文档在线提供].doc_第3页
第3页 / 共12页
Linux系统调用与ptrace分析(实验报告)_[文档在线提供].doc_第4页
第4页 / 共12页
Linux系统调用与ptrace分析(实验报告)_[文档在线提供].doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《Linux系统调用与ptrace分析(实验报告)_[文档在线提供].doc》由会员分享,可在线阅读,更多相关《Linux系统调用与ptrace分析(实验报告)_[文档在线提供].doc(12页珍藏版)》请在金锄头文库上搜索。

1、Linux系统调用与ptrace分析概述1Linux的系统结构在Linux系统结构中,最核心的是计算机硬件,它提供对Linux软件的支持,靠近硬件的内层是Linux内核程序(即操作系统)。内核直接和硬件打交道是程序和硬件之间的接口或界面。它对一切外层程序提供公共服务,把外部程序同硬件隔离开。内核程序大致可分为文件系统管理,进程管理,内存管理等几部分。进程管理又分为低级进程管理和高级进程管理。低级进程管理主要包括:进程调度分配,控制占用处理器的程序和基本的进程通信。高级进程管理主要包括:进程的创建,终止,进程间通信,进程在内存和外存之间的转储,信号机构和进程间跟踪控制等。内核程序的外层是实用程序

2、,内核提供对实用程序的支持,两层之间的界面是系统调用。内核外的实用程序通过系统调用来和内核打交道。实现的过程是通过一种特殊的指令(陷入指令)进入内核,然后转入相应的系统调用处理程序。这也是本文将主要讨论的问题。280386体系结构80386的体系结构承认两类事件。1. 异常(exceptions)2. 中断(interrupts)他们两都会引起“上下文转换”同时建立一个过程或任务,中断可以随时随地发生(包括在执行程序时)所以用来响应硬件信号。而异常则由指令内部错误引起。每一个异常或中断都有一个唯一的标识符,在linux中被称为向量。指令内部异常和NMI(不可屏蔽中断)的中断向量的范围从031。

3、32-255的任何向量都可以用做1. 可屏蔽中断2. 编程(调试)异常至于可屏蔽中断则取决于该系统的硬件配置。外部中断控制器在中断响应周期把中断向量放到总线上。3Linux系统调用流程概述Linux系统调用的流程非常简单,它由0x80号中断进入系统调用入口,通过使用系统调用表保存系统调用服务函数的入口地址来实现,本文首先分析一般Linux系统调用的流程,然后再分析Linux系统调用sys_ptrace().一. Linux系统调用的流程分析1.1 设定0x80号中断系统启动后,先进行初始化,其中一部分重要的工作在start_kernel()函数(main.c中定义)中进行,在该函数中先做必要的

4、初始化工作(setup_arch()与paging_init(),各种trap入口就在该函数中通过调用trap_init()(traps.c)被设置,其中与系统调用有关的是:set_system_gate(0x80,&system_call);“set_system_gate()”是一宏,它在“system.h”中被定义:#define set_system_gate(n,addr) _set_gate(&idtn,15,3,addr) 中断描述表结构(head.s)其中“_set_gate()”也是在该文件中定义的宏:#define _set_gate(gate_addr,type,dpl,

5、addr) _asm_ _volatile_ (movw %dx,%axnt movw %2,%dxnt movl %eax,%0nt movl %edx,%1 :=m (*(long *) (gate_addr), =m (*(1+(long *) (gate_addr) :i (short) (0x8000+(dpl13)+(type8), d (char *) (addr),a (KERNEL_CS = 0) return (type) _res; errno = -_res; return -1; 该宏的第一个参数是一类类型参数,它指明系统调用返回值的类型,第二个参数指明系统调用的名称

6、。参数列表中若还有参数,则第2i个参数是系统调用函数的第i个参数的类型,第2i+1个参数是系统调用函数的第i个参数该宏的主体部分是一内联汇编,在内联汇编中只有一条扩展汇编指令,即“int $0x80”,该语句两个冒号后的语句设置输入和输出寄存器。第一个冒号后的语句指明返回参数(即_res)使用eax寄存器。第二个冒号后面指定接受输入的寄存器,“0 (_NR_#name),”将参数name与“_NR_”串接起来,形成的标志符存入eax寄存器,作为区别系统调用类型的唯一参数,例如设置name为“ptrace”,那么,gcc编译器将把“_NR_”与之串接,被视为标志符“_NR_ptrace”,由于在

7、文件“include/asm-i386/unistd.h”中已定义其为26,那么,传给eax的值将为26。后面的语句将参数arg1,arg2分别传给寄存器ebx和ecx,在“_syscallX”宏中,有如下约定:arg1值存入寄存器ebx;arg2值存入寄存器ecx;arg3值存入寄存器edx;arg4值存入寄存器esi;arg5值存入寄存器edi;在该宏的最后,判断返回值“_res”是否合法,若为负数,表明在系统调用中出错,将其绝对值作为出错号赋给全局变量“errno”,并返回-1,否则返回“_res”。该宏的唯一一条汇编指令“int $0x80”使程序流程转入“system_call”。1

8、.4 转入system_callsystem_call是在汇编语言文件“entry.S”中定义的一入口,在Linux中,所有的系统调用都是通过中断“int &0x80”语句来实现的,因而,system_call是所有系统调用的入口。下面解释关于它的一些重要指令,以清晰它的流程:1 首先,pushl %eax,保存原来的eax寄存器,然后调用宏“SAVE_ALL”将现有通用寄存器保存,寄存器的保存不但避免影响原来的寄存器数据,而且提供了一种传递参数的方法。正如在2.2节所指出的,这样保存的一帧寄存器,与该过程所要传递的pt_regs结构相对应。在该宏中,还使ds和es指向内核的数据段,使fs指向

9、用户的数据段。 #define SAVE_ALL cld; push %gs; push %fs; push %es; push %ds; pushl %eax; pushl %ebp; pushl %edi; pushl %esi; pushl %edx; pushl %ecx; pushl %ebx; movl $(KERNEL_DS),%edx; mov %dx,%ds; mov %dx,%es; movl $(USER_DS),%edx; mov %dx,%fs; 2 语句“cmpl $(NR_syscalls),%eax”比较NR_syscalls与eax的大小,如果eax大于或等于

10、NR_syscalls,表明指定的系统调用函数错误,“jae ret_from_sys_call”使系统调用直接返回。3 . 流程进入ret_from_sys_call,该过程内处理一些系统调用返回前应该处理的事情,如检 测bottom half缓冲区,判断CPU是否需要重新调度等. 先注意全局变量intr_count,它虽然不是信号量,但也部分的具有了信号量的作用,表 示已有进程进入bottom_half,它在系统处理bottom_half时增1,则其为非零。 语句“cmpl $0,SYMBOL_NAME(intr_count)”就是进行上述判断,若非零,处理 bottom half 缓冲区。(“jne handle_bottom_half”

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号