linux中断与系统调用实现机制及fork实例分析

linux中断与系统调用实现机制及fork实例分析

ID:12585869

大小:67.95 KB

页数:9页

时间:2018-07-17

linux中断与系统调用实现机制及fork实例分析_第1页
linux中断与系统调用实现机制及fork实例分析_第2页
linux中断与系统调用实现机制及fork实例分析_第3页
linux中断与系统调用实现机制及fork实例分析_第4页
linux中断与系统调用实现机制及fork实例分析_第5页
资源描述:

《linux中断与系统调用实现机制及fork实例分析》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、LINUX中断与系统调用实现机制及fork实例分析1.Linux系统调用概述1.1系统调用的作用系统调用(system_call)是操作系统中必不可少的一个组成部分,系统调用命令是操作系统为满足用户所需的功能和保证程序的正常运转事先编制好的具有特定功能的例行子程序。在高级语言如C中,常以函数的形式出现。它们使得编程人员不需要太多了解系统就能完成复杂的编程。例如,在程序中安排一条创建进程的系统调用,则OS便会为之创建一个新的进程。它一般运行在核心态;可通过中断进入,返回时通常需要重新调度。系统调用是用户程序和内核交互的接口。如果没有系统调用,那么应用程序就失去了内核的支

2、持。提到内核态及用户态,就顺便介绍下LINUX的内核保护机制。1.2内核保护机制Linux系统在CPU的保护模式下提供了四个特权级别,目前内核都只用到了其中的两个特权级别,分别为“特权级0”和“特权级3”,级别0也就是通常所讲的内核模式,级别3即用户模式。划分这两个级别主要是对系统提供保护。内核模式可以执行一些特权指令和进入用户模式,而用户模式则不能。内核模式与用户模式分别使用各自的堆栈,当发生模式切换的时候同时要进行堆栈的切换。每个进程都有自己的地址空间(也称为进程空间),进程的地址空间也分为两部分:用户空间和系统空间,在用户模式下只能访问进程的用户空间,在内核模式

3、下则可以访问进程的全部地址空间,这个地址空间里的地址是一个逻辑地址,通过系统段面式的管理机制,访问的实际内存要做二级地址转换,即:逻辑地址->线性地址->物理地址。系统调用对于内核来说就相当于函数,关键问题就是从用户模式到内核模式的转换、堆栈的切换以及参数的传递。下文将详细分析linux系统调用的流程,并且以产生进程的系统调用(fork)为例加以了说明。2.Linux系统调用实现机制2.1系统调用与中断机制之间的关系系统调用本身也是由若干条指令构成的过程。但它与一般的过程不一样,主要区别是:系统调用是运行在系统态(kernelmode),而一般过程是运行在用户态(us

4、ermode),它必须通过中断进入OS系统态(在linux中,是通过中断int0x80h进入OS态),再由该中断的处理函数来具体决定对不同的系统调用的具体处理。即linux系统是通过中断处理来实现系统调用的。在IntelX86芯片上运行的Linux中断机制简述如下:1.在Linux中中断可以分为两类:软中断(也可称其为异常)和硬中断2.Linux中由中断向量表来管理中断.每个中断对应一个中断号,以该中断号作为下标在中断向量表中对应一长为4个字节的中断向量用于表示该中断服务函数的入口地址。Linux中共可有256类中断,则对应着1KB长的中断向量表。表的结构大体如下:中

5、断号中断类型0除零中断1调试中断2NMI不可屏蔽中断3BreakPoint断点中断4由INTO引发的溢出中断5~16其他各种已设定的中断17~31保留的中断32开始各种可屏蔽中断0x80用于系统调用的中断255结束中断表尾从上表可以了解到,用于系统调用的0x80号中断属于可屏蔽中断,其优先级在各种中断中为较低的。所有的系统调用都将通过该中断把控制权交给系统,进入到核心态中。2.2相关的数据结构与函数2.2.1相关的数据结构linux里面的每个系统调用是靠一些宏,一张系统调用表,一个系统调用入口来完成的。(1)系统调用表在文件"arch/i386/entry.S"中定义

6、了系统调用表(sys_call_table),该表保存了Linux的所有基于Intelx86系列体系结构的计算机的所有系统调用入口地址,其中每项都被说明成long型。格式如下:.dataENTRY(sys_call_table).longSYMBOL_NAME(sys_setup)/*0*/.longSYMBOL_NAME(sys_exit).longSYMBOL_NAME(sys_fork)………….longSYMBOL_NAME(sys_nanosleep).longSYMBOL_NAME(sys_mremap).long0,0.longSYMBOL_NAME(s

7、ys_vm86).space(NR_syscalls-166)*4/*此段罗列了166个系统调用,这句表示可以被用户用来自由添加系统的空间。NR_syscalls是在"include/linux/sys.h"文件中定义的宏,其值为256,表示x86微机上最多可容纳的系统调用个数*/(2)宏宏就是_syscallN(type,name,x...),N是系统调用所需的参数数目,type是返回类型,name即面向用户的系统调用函数名,x...是调用参数。这些宏定义于includeasmUnistd.h,这就是为什么在程序中要包含这个头文件的原因。该文件

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。