预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共12页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

Linux系统调用与ptrace分析 概述 1.Linux的系统结构 在Linux系统结构中,最核心的是计算机硬件,它提供对Linux软件的支持,靠近硬件的 内层是Linux内核程序(即操作系统)。内核直接和硬件打交道是程序和硬件之间的接口或界面。 它对一切外层程序提供公共服务,把外部程序同硬件隔离开。内核程序大致可分为文件系统管 理,进程管理,内存管理等几部分。进程管理又分为低级进程管理和高级进程管理。低级进程 管理主要包括:进程调度分配,控制占用处理器的程序和基本的进程通信。高级进程管理主要 包括:进程的创建,终止,进程间通信,进程在内存和外存之间的转储,信号机构和进程间跟 踪控制等。内核程序的外层是实用程序,内核提供对实用程序的支持,两层之间的界面是系统 调用。内核外的实用程序通过系统调用来和内核打交道。实现的过程是通过一种特殊的指令(陷 入指令)进入内核,然后转入相应的系统调用处理程序。这也是本文将主要讨论的问题。 2.80386体系结构 80386的体系结构承认两类事件。 1.异常(exceptions) 2.中断(interrupts) 他们两都会引起“上下文转换”同时建立一个过程或任务,中断可以随时随地发生(包括 在执行程序时)所以用来响应硬件信号。而异常则由指令内部错误引起。 每一个异常或中断都有一个唯一的标识符,在linux中被称为向量。 指令内部异常和NMI(不可屏蔽中断)的中断向量的范围从0—31。32-255的任何向量都可以 用做 1.可屏蔽中断 2.编程(调试)异常 至于可屏蔽中断则取决于该系统的硬件配置。外部中断控制器在中断响应周期把中断向量 放到总线上。 3.Linux系统调用流程概述 Linux系统调用的流程非常简单,它由0x80号中断进入系统调用入口,通过使用系统 调用表保存系统调用服务函数的入口地址来实现,本文首先分析一般Linux系统调用的流 程,然后再分析Linux系统调用sys_ptrace(). 一.Linux系统调用的流程分析 1.1设定0x80号中断 系统启动后,先进行初始化,其中一部分重要的工作在start_kernel()函数(main.c中定义) 中进行,在该函数中先做必要的初始化工作(setup_arch()与paging_init()),各种trap入 口就在该函数中通过调用trap_init()(traps.c)被设置,其中与系统调用有关的是: set_system_gate(0x80,&system_call); “set_system_gate()”是一宏,它在“system.h”中被定义: #defineset_system_gate(n,addr)\ _set_gate(&idt[n],15,3,addr) ……中断描述表结构(head.s) 其中“_set_gate()”也是在该文件中定义的宏: #define_set_gate(gate_addr,type,dpl,addr)\ __asm____volatile__("movw%%dx,%%ax\n\t"\ "movw%2,%%dx\n\t"\ "movl%%eax,%0\n\t"\ "movl%%edx,%1"\ :"=m"(*((long*)(gate_addr))),\ "=m"(*(1+(long*)(gate_addr)))\ :"i"((short)(0x8000+(dpl<<13)+(type<<8))),\ "d"((char*)(addr)),"a"(KERNEL_CS<<16)\ :"ax","dx") 调用该宏,将使addr地址值置入gate_addr中的地址值所指向的内存单元中,以上过程, 使中断向量描述表中的第128项(16进制第80项)保存了0x80号中断的中断服务程序,即 system_call。 而中断描述表结构则定义在head.s中. 1.2系统调用的数据结构 系统调用所用到的数据结构也非常简单,主要有两种,系统调用表和寄存器帧结构。 “entry.S”中定义了系统调用表,该表保存了Linux基于Intelx86系列体系结构的计算机 的166个系统调用入口地址(其中3个保留,Linux开辟的系统调用表可容纳256项),其中每 项都被说明成long型。 ENTRY(sys_call_table) .longSYMBOL_NAME(sys_setup)/*0*/ .longSYMBOL_NAME(sys_exit) .longSYMBOL_NAME(sys_fork) ………… .longSYMBOL_NAME(sys_setitimer)/*104*/ ………… .longSYMBOL_NAME(sys_select)/*142