LINUX中断和系统调用实现机制和fork实例分析.docVIP

LINUX中断和系统调用实现机制和fork实例分析.doc

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
LINUX中断和系统调用实现机制和fork实例分析

LINUX中断与系统调用实现机制及fork实例分析 1.Linux系统调用概述 1.1 系统调用的作用 系统调用(system_call)是操作系统中必不可少的一个组成部分,系统调用命令是操作系统为满足用户所需的功能和保证程序的正常运转事先编制好的具有特定功能的例行子程序。在高级语言如C中,常以函数的形式出现。它们使得编程人员不需要太多了解系统就能完成复杂的编程。例如,在程序中安排一条创建进程的系统调用,则OS便会为之创建一个新的进程。它一般运行在核心态;可通过中断进入,返回时通常需要重新调度。 系统调用是用户程序和内核交互的接口。如果没有系统调用,那么应用程序就失去了内核的支持。 提到内核态及用户态,就顺便介绍下LINUX的内核保护机制。 1.2 内核保护机制 Linux系统在CPU的保护模式下提供了四个特权级别,目前内核都只用到了其中的两个特权级别,分别为“特权级0”和“特权级3”,级别0也就是通常所讲的内核模式,级别3即用户模式。划分这两个级别主要是对系统提供保护。内核模式可以执行一些特权指令和进入用户模式,而用户模式则不能。 内核模式与用户模式分别使用各自的堆栈,当发生模式切换的时候同时要进行堆栈的切换。每个进程都有自己的地址空间(也称为进程空间),进程的地址空间也分为两部分:用户空间和系统空间,在用户模式下只能访问进程的用户空间,在内核模式下则可以访问进程的全部地址空间,这个地址空间里的地址是一个逻辑地址,通过系统段面式的管理机制,访问的实际内存要做二级地址转换,即:逻辑地址 - 线性地址 - 物理地址。 系统调用对于内核来说就相当于函数,关键问题就是从用户模式到内核模式的转换、堆栈的切换以及参数的传递。 下文将详细分析linux系统调用的流程,并且以产生进程的系统调用(fork)为例加以了说明。 2. Linux系统调用实现机制 2.1 系统调用与中断机制之间的关系 系统调用本身也是由若干条指令构成的过程。但它与一般的过程不一样,主要区别是:系统调用是运行在系统态(kernel mode),而一般过程是运行在用户态(user mode),它必须通过中断进入OS系统态(在linux中,是通过中断int 0x80h进入OS态),再由该中断的处理函数来具体决定对不同的系统调用的具体处理。即linux系统是通过中断处理来实现系统调用的。 在Intel X86芯片上运行的Linux中断机制简述如下: 1.在Linux中中断可以分为两类: 软中断(也可称其为异常)和硬中断 2.Linux中由中断向量表来管理中断. 每个中断对应一个中断号, 以该中断号作为下标在中断向量表中对应一长为4个字节的中断向量用于表示该中断服务函数的入口地址。 Linux中共可有256类中断, 则对应着1KB长的中断向量表。表的结构大体如下: 中断号 中断类型 0 除零中断 1 调试中断 2 NMI 不可屏蔽中断 3 Break Point断点中断 4 由INTO引发的溢出中断 5~16 其他各种已设定的中断 17~31 保留的中断 32开始 各种可屏蔽中断 0x80 用于系统调用的中断 255结束 中断表尾 从上表可以了解到, 用于系统调用的0x80号中断属于可屏蔽中断, 其优先级在各种中断中为较低的。所有的系统调用都将通过该中断把控制权交给系统, 进入到核心态中。 2.2 相关的数据结构与函数 2.2.1 相关的数据结构 linux里面的每个系统调用是靠一些宏,一张系统调用表,一个系统调用入口来完成的。 (1)系统调用表 在文件arch/i386/entry.S中定义了系统调用表(sys_call_table),该表保存了Linux的所有基于Intel x86系列体系结构的计算机的所有系统调用入口地址,其中每项都被说明成 long型。 格式如下: .data ENTRY(sys_call_table) .long SYMBOL_NAME(sys_setup) /* 0 */ .long SYMBOL_NAME(sys_exit) .long SYMBOL_NAME(sys_fork) …… …… .long SYMBOL_NAME(sys_nanosleep) .long SYMBOL_NAME(sys_mremap) .long 0,0 .long SYMBOL_NAME(sys_vm86) .space (NR_syscalls-166)*4 /*此段罗列了166个系统调用,这句表示可以被用户用来自由添加系统的空间。NR_syscalls是在include/linux/sys

文档评论(0)

jgx3536 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:6111134150000003

1亿VIP精品文档

相关文档