105 中断、异常及系统调用
中断分类——精选推荐

中断分类
中断可分为同步(synchronous)中断和异步(asynchronous)中断:
1. 同步中断是当指令执⾏时由 CPU 控制单元产⽣,之所以称为同步,是因为只有在⼀条指令执⾏完毕后 CPU 才会发出中断,⽽不是发⽣在代码指令执⾏期间,⽐如系统调⽤。
2. 异步中断是指由其他硬件设备依照 CPU 时钟信号随机产⽣,即意味着中断能够在指令之间发⽣,例如键盘中断。
根据 Intel 官⽅资料,同步中断称为异常(exception),异步中断被称为中断(interrupt)。
中断可分为可屏蔽中断(Maskable interrupt)和⾮屏蔽中断(Nomaskable interrupt)。
异常可分为故障(fault)、陷阱(trap)、终⽌(abort)三类。
从⼴义上讲,中断可分为四类:中断、故障、陷阱、终⽌。
这些类别之间的异同点请参看表 1。
表 1:中断类别及其⾏为
类别原因异步/同步返回⾏为
中断来⾃I/O设备的信号异步总是返回到下⼀条指令
陷阱有意的异常同步总是返回到下⼀条指令
故障潜在可恢复的错误同步返回到当前指令
终⽌不可恢复的错误同步不会返回
X86 体系结构的每个中断都被赋予⼀个唯⼀的编号或者向量(8 位⽆符号整数)。
⾮屏蔽中断和异常向量是固定的,⽽可屏蔽中断向量可以通过对中断控制器的编程来改变。
版权声明:本⽂为博主原创⽂章,未经博主允许不得转载。
操作系统的中断、异常和系统调用

操作系统的中断、异常和系统调⽤操作系统的中断、异常和系统调⽤
中断
硬件
设置中断标记【CPU初始化】
将内部、外部事件设置中断标记
中断事件的ID
软件
保存当前处理状态
中断服务程序处理
清除中断标记
恢复之前保存的处理状态
异常
异常编号
保存现场
异常处理
杀死产⽣异常程序
重新执⾏异常指令
恢复现场
系统调⽤
应⽤程序调⽤printf(),会触发write()。
程序访问主要是通过⾼层次的api接⼝⽽不是直接进⾏系统调⽤。
win32 api ⽤于 Windows
POSIX api ⽤于 Unix,Linux,MacOSX
Java api ⽤于java虚拟机(JVM)
其实也实现调⽤java api随后调⽤对应操作系统的api
操作系统如何完成系统调⽤(⽤户态到<--->内核态)
通常情况,与每个系统调⽤相关的序号
系统调⽤接⼝根据序号维护表的索引
系统调⽤接⼝调⽤内核态中预期的系统调⽤
并返回系统调⽤的状态和其他任何返回值
⽤户不需要知道系统调⽤是如何实现的
只需要获取API和了解操作系统讲什么作为返回结果
操作系统接⼝细节⼤部分都隐藏在API中
系统调⽤中,操作系统和应⽤程序的堆栈是不同的。
跨越操作系统便边界的代价
在执⾏时间上的开销超过程序调⽤
对应中断号,堆栈切换保存与恢复
开销:
建⽴中断/异常/系统调⽤号与对应服务例程映射关系的初始化开销
建⽴内核堆栈
验证参数
内核态映射到⽤户态的地址空间
更新页⾯映射
内核独⽴地址空间
TLB。
操作系统的中断处理与异常处理机制

操作系统的中断处理与异常处理机制在计算机系统中,操作系统是一个管理和协调系统资源的软件,中断处理和异常处理是操作系统的核心功能之一。
中断处理和异常处理机制使得操作系统能够及时响应硬件设备或软件程序的请求,并采取相应的措施进行处理,保证系统的稳定性和可靠性。
本文将详细介绍操作系统的中断处理与异常处理机制。
一、中断处理机制中断是指在计算机系统运行过程中,某个硬件设备或者软件程序发出的一种请求,通过打断正常的程序执行流程,通知操作系统去处理该请求。
中断可以分为硬件中断和软件中断两类。
1. 硬件中断硬件中断是由硬件设备发生的一种中断事件,比如外设设备的输入输出操作,时钟中断等。
当硬件设备发生中断事件后,会向处理器发送一个中断信号,处理器暂停当前的执行任务,保存当前的上下文信息,并转入中断处理程序来处理中断事件。
中断处理程序会根据中断类型来执行相应的操作,比如读取输入设备的数据,将数据写入输出设备等。
处理完中断事件后,处理器会恢复之前被中断的任务继续执行。
2. 软件中断软件中断是由软件程序主动触发的一种中断事件,也称为系统调用。
软件中断通常由用户态程序调用系统库函数来完成,通过系统调用指令将自己的执行权限转交给操作系统,由操作系统代为执行相应的操作。
常见的软件中断包括文件读写操作、进程创建与销毁等系统调用。
中断处理机制的优点在于能够及时响应外部设备和软件程序的请求,提高了系统的实时性和处理能力。
同时,使用中断处理机制可以实现很多复杂的功能,比如多任务处理、设备驱动程序等。
二、异常处理机制异常是指在程序执行过程中出现的一种非正常情况,例如非法指令、除数为零等。
异常处理机制能够捕捉这些异常事件并进行相应的处理。
异常处理机制主要分为硬件异常和软件异常两类。
1. 硬件异常硬件异常指的是由硬件设备产生的异常事件,如页错误、越界访问等。
当硬件设备检测到异常事件后,会向处理器发送一个异常信号,处理器会中断当前任务的执行,并把当前的上下文信息保存起来,然后转入异常处理程序去处理异常事件。
操作系统中的中断与异常处理机制

操作系统中的中断与异常处理机制在计算机系统中,操作系统起着至关重要的作用,它负责管理和控制计算机的资源,并提供给用户一个友好和高效的界面。
而在操作系统中,中断与异常处理机制是其中的重要组成部分。
一、什么是中断与异常处理机制中断与异常处理机制是操作系统用来响应特定事件或异常情况的方式。
当计算机系统发生某些事件,例如硬件故障、外部设备的请求等,操作系统会立即停止正在执行的任务,转而处理该事件。
在这种情况下,中断与异常处理机制起到了极为重要的作用。
二、中断与异常的区别尽管中断和异常都能够引发操作系统的响应,但两者之间存在一些区别。
1. 中断:中断是由外部设备发起的,例如键盘输入、鼠标点击等。
当外部设备需要与操作系统进行交互时,它会发出中断信号,这时操作系统会中断当前任务的执行,转而响应中断事件。
中断是一种在程序执行时突然发生的外部事件,需要处理器立即中断正在执行的任务并执行相应的中断处理程序。
2. 异常:异常是由程序内部产生的事件,也称为软中断。
当程序运行过程中出现错误、非法操作或者某些特殊事件时,会触发异常。
操作系统会根据异常的类型和优先级来处理该异常,进而采取相应的行动,例如打印错误信息、终止程序执行,或者进行异常处理。
三、中断与异常的处理流程中断与异常处理机制的处理流程如下:1. 中断发生:当外部设备产生中断信号时,处理器会暂停当前任务的执行,并将控制权交给操作系统。
2. 中断处理程序:操作系统会根据中断类型调用对应的中断处理程序。
中断处理程序会执行与中断相关的操作,例如获取键盘输入、响应鼠标事件等。
3. 中断处理完成:中断处理程序执行完毕后,操作系统会将控制权重新交还给之前的任务,使其继续执行。
4. 异常发生:在程序执行过程中,如果出现错误、非法操作或其他特殊事件,会触发异常。
5. 异常处理程序:操作系统会根据异常类型和优先级调用相应的异常处理程序。
异常处理程序会处理异常情况,例如打印错误信息、修复错误、终止程序执行等。
中断类型码名词解释

中断类型码名词解释
中断类型码是指在计算机系统中,用于标识不同类型中断的一
种编码方式。
中断是指在程序执行过程中,由于某些特定的事件或
条件发生,导致程序的正常执行被暂时中止,转而执行与之相关的
处理程序。
中断类型码的作用是区分不同的中断类型,以便系统能
够根据不同的中断类型采取相应的处理措施。
中断类型码通常是一个数字或者一个编码值,用于唯一地标识
一个特定的中断类型。
不同的操作系统或计算机体系结构可能会有
不同的中断类型码定义和使用方式,但一般来说,中断类型码可以
分为以下几类:
1. 硬件中断,由硬件设备触发的中断,如时钟中断、外部设备
中断等。
硬件中断类型码用于区分不同的硬件设备或事件。
2. 软件中断,由软件程序主动触发的中断,也称为系统调用。
软件中断类型码用于标识不同的系统调用或软件中断服务。
3. 异常中断,由于程序执行过程中出现异常情况而触发的中断,如除零错误、非法指令等。
异常中断类型码用于识别不同的异常类
型。
4. 外部中断,由外部事件触发的中断,如按键输入、网络数据到达等。
外部中断类型码用于区分不同的外部事件。
中断类型码的使用有助于系统在发生中断时能够准确地识别中断类型,并根据类型码执行相应的中断处理程序。
这样可以提高系统的可靠性和可维护性,同时也为开发者提供了一种方便的方式来处理不同类型的中断事件。
10-5 Linux操作系统 - 中断、异常及系统调用

10.5.4 中断上半部分的处理 一、 中断控制器 •每个硬件设备控制器都能通过中断请求线 发出中断请求(简称IRQ) •所有设备的中断请求线又连到中断控制器 的输入端。 •在x86单CPU的机器上采用两个8259A芯片作 为中断控制器,一主一从。
•当8259A有中断信号输入同时中断信号不被 屏蔽时,主8259A向CPU发出 INT信号,请求 中断。这时如果CPU是处于允许中断状况, CPU就会发信号给8259A进入中断响应周期。 •在对8259A芯片的初始化过程中,第n号中 断在IDT表中的向量号为 n+32
•IDT中向量号的使用情况如下: 0-31 异常与非屏蔽中断使用。 32-47 可屏蔽中断使用32至47 128(0x80)实现系统调用。 其余 未使用 •保存现场 发生异常时在核心栈的程序计数器eip的 值取决于具体情况。一般情况下eip保存的 下一条指令的地址,但对于页面异常,保存 的产生异常的这条指令的地址而不是下一条 指令的地址
中断向量表IDT •IDT是中断/异常处理在内核的入口。IDT表 项还记录了一些其它信息用以安全检查。 •IDT在系统初始化时创建。 •每个中断/异常都有一个向量号,该号的值 在0-255之间,该值是中断/异常在IDT中的 索引。 •每个中断/异常均有其相应的处理函数,中 断/异常在使用前必须在IDT中注册信息以保 证发生中断/异常时能找到相应的处理函数。
struct hw_interrupt_type { const char * typename; unsigned int (*startup)(unsigned int irq); void (*shutdown)(unsigned int irq); void (*enable)(unsigned int irq); void (*disable)(unsigned int irq); void (*ack)(unsigned int irq); void (*end)(unsigned int irq); void (*set_affinity)(unsigned int irq, unsigned long mask); };
中断可以分为哪些类型?
中断可以分为哪些类型?中断是计算机系统中的一种重要的事件驱动机制,用于在运行过程中暂时停止正在执行的程序,转而去执行其他的任务,从而提高计算机系统的效率和更好地响应外部事件。
中断按照不同的划分标准,可以分为以下几个类型:1. 硬件中断硬件中断是由计算机硬件产生的信号,用于处理与外部设备的交互。
例如,当键盘有输入时,计算机系统会产生一个中断信号,通知操作系统中断当前的执行,去处理键盘输入的数据。
硬件中断可以进一步划分为外部中断和内部中断。
外部中断是由外部设备引起的,例如,键盘输入、鼠标点击等;内部中断是由处理器内部的异常或错误引起的,例如,零除错误、非法指令等。
2. 软件中断软件中断是由程序主动触发的中断。
程序可以通过软件中断指令,请求操作系统停止当前的执行,并转而执行某个指定的中断服务程序。
软件中断有时也被称为系统调用。
常见的软件中断包括文件操作、进程管理、内存管理等。
3. 异常中断异常中断是由于程序执行过程中的异常情况而引发的。
例如,当程序发生除零操作时,计算机系统会产生一个异常中断,中断当前的执行流程,去处理这个异常。
异常中断帮助计算机系统保持了良好的稳定性和安全性。
4. 时钟中断时钟中断是计算机系统中最基本的中断类型。
计算机时钟会以一定的频率产生时钟中断信号,用于定时中断当前的执行流程,去处理一些需要定时执行的任务,例如,刷新显示屏、调度进程等。
中断是计算机系统中的重要机制,能够提高系统的效率和响应能力,有效地处理外部事件和内部异常。
了解不同类型的中断有助于我们更好地理解和使用计算机系统,提高工作效率。
希望本文对您有所帮助!。
arm异常处理 el级别
arm异常处理 el级别ARM异常处理 EL级别ARM处理器是一种广泛应用于嵌入式系统和移动设备的处理器架构。
在ARM架构中,异常处理是一种重要的机制,用于处理硬件或软件引发的异常情况。
其中,EL级别异常(Exception Level)是ARM处理器中一种特殊的异常级别,本文将详细介绍EL级别异常处理的相关内容。
一、EL级别异常概述在ARM处理器中,异常分为四个级别:EL0、EL1、EL2和EL3。
EL0是用户级别,用于运行应用程序;EL1是内核级别,用于操作系统内核的运行;EL2和EL3是虚拟化扩展级别,用于虚拟化和安全扩展。
EL级别异常是指在特定级别下发生的异常情况。
二、EL级别异常分类EL级别异常主要分为同步异常和中断异常两类。
1. 同步异常同步异常是指由当前指令执行引起的异常,包括:- 未定义指令异常:执行未定义的指令时触发的异常。
- 系统调用异常:执行系统调用指令(例如Linux中的int 0x80)时触发的异常。
- 中止异常:执行中止指令(例如ARM的bkpt指令)时触发的异常。
- 数据访问异常:读写未映射内存、权限不足或对只读内存进行写操作时触发的异常。
2. 中断异常中断异常是指由外部中断或定时器中断引起的异常,包括:- 外部中断:来自外部设备的中断信号,如键盘输入、网络数据到达等。
- 定时器中断:由定时器触发的周期性中断信号。
三、EL级别异常处理流程EL级别异常处理的基本流程如下:1. 异常触发当发生同步异常或中断异常时,ARM处理器会自动进入异常模式,并切换到相应的EL级别。
2. 异常处理器异常处理器是用于处理异常的特殊代码段,通常由操作系统提供。
在异常模式下,ARM处理器会跳转到异常处理器的入口地址。
3. 异常处理异常处理器根据异常类型进行相应的处理,可能包括:- 保存当前上下文:将当前被打断的程序状态保存到特定的寄存器或栈中,以便在异常处理完成后能够恢复执行。
- 处理异常原因:根据异常类型进行相应的处理,如处理未定义指令异常、权限异常等。
系统操作的名词解释
系统操作的名词解释随着科技的不断发展,计算机技术在各个领域得到广泛应用。
在计算机领域中,我们常常会听到一些与系统操作相关的名词。
本文将对这些名词进行详细解释,以帮助读者更好地理解系统操作的概念。
1. 操作系统操作系统是计算机系统中的一个重要组成部分,它负责管理和控制计算机的硬件和软件资源,使得应用程序可以正常运行。
操作系统提供了一个抽象的界面,使得用户可以通过交互方式操作计算机,并能够实现任务调度、文件管理、内存管理、通信等功能。
2. 用户界面用户界面是用户与计算机之间进行交互的一个窗口。
常见的用户界面有命令行界面和图形界面。
命令行界面通过输入命令来操作计算机,而图形界面通过鼠标、键盘等设备进行操作。
用户界面的设计直接影响着用户的体验,良好的用户界面能够提高用户的工作效率。
3. 文件系统文件系统是操作系统中用于组织和管理文件存储的一种机制。
它通过对文件进行命名、创建、存储、查找和访问等操作,使得用户可以方便地管理自己的文件。
文件系统可以将文件按照一定的目录结构进行组织,提高文件的可用性和查找效率。
4. 进程与线程进程是操作系统中运行中的一个程序实例,它拥有独立的内存空间和系统资源。
操作系统可以根据需要同时运行多个进程,并进行进程调度,保证每个进程都能得到适当的资源。
线程是进程的一个实体,它是进程中的一个执行路径。
相比于进程,线程的切换速度更快,可以实现更高效的并发操作。
5. 调度算法调度算法是操作系统中用于决定进程执行顺序的一种算法。
调度算法的目标是尽量提高系统的吞吐量和响应速度,并使得各个进程能够公平地共享系统资源。
常见的调度算法有先来先服务、短作业优先、轮转调度等。
6. 缓存管理缓存管理是操作系统中对缓存的管理和控制。
缓存是一个存储介质,在计算机系统中用于提高数据访问速度。
操作系统通过缓存管理机制,将经常访问的数据暂时存储在缓存中,减少了对主存的访问时间。
7. 设备管理设备管理是操作系统中对计算机硬件设备进行管理和控制的一种机制。
UNIX内核-系统调用的机制
int $0x80
这一指令使用中断/异常向量号128(即16进制的80)将控制权转移给内核。为达到在系统调用时不必用机器指令编程,在标准的C语言库中为每一个系统调用提供了一段短的子程序,完成机器代码的编程工作。事实上,机器代码非常短。它要做的工作只是将送给系统调用的参数值加载到CPU寄存器中,接着执行int $0x80指令。然后运行系统调用,系统调用的返回值将送入CPU的一个寄存器中,标准的库子程序取得这一返回值,并将它送回给你的程序。为了使系统调用执行成为一项简单的任务,LINUX中提供了一组预处理宏指令。它们可以用在程序中。这些宏指令取一定的参数,然后扩展为调用指定的系统调用的函数:
一旦syscall N()宏指令用特定的系统调用的相应参数进行了扩展,得到的结果是一个与系统调用同名的函数,它可以在用户程序中执行这一系统调用。
syscallN()宏指令的第一个参数说明产生的函数的返回值的类型(这里是int),第二个参数说明产生的函数的名称(这里是setuid)。
后面是系统调用所需要的每个参数。这一宏指令后面还有两个参数分别用来指定参数的类型和名称(这里是uid_t和uid)。
用作系统调用的参数的数据类型有一个限制,它们的容量不能超过4个字节。这是因为执行int $0x80指令进行系统调用时,所有的参数值都存在32位的CPU寄存器中。使用CPU寄存器传递参数带来的另外一个限制是可以传递给系统调用的参数的数目。这个限制是最多可以传送5个参数。所以一共定义了6个不同的syscall N()宏指令(从syscall 0()到syscall5() )。
UNIX内核-系统调用的机制
系统调用的机制
1.中断和异常
大多数的微处理器的处理都可以被当前执行的程序具有更高优先级的事件中断。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
sys_call_table为系统调用表, sys_call_table为系统调用表,该表保 为系统调用表 存的是各个系统调用的入口地址, 存的是各个系统调用的入口地址,下面列出 了系统调用表的最前面三项: 了系统调用表的最前面三项:
ENTRY(sys_call_table) SYMBOL_NAME(sys_ni_syscall)/*第 .long SYMBOL_NAME(sys_ni_syscall)/*第0号 */ .long SYMBOL_NAME(sys_exit) .long SYMBOL_NAME(sys_fork)
2.管理中断的数据结构
hw_interrupt_type 结 构 描 述 中 断 控 制 器 , Linux支持多种中断控制器 支持多种中断控制器, Linux 支持多种中断控制器 , hw_interrupt_type 是根据它们的共性抽象出来的一致接口. 是根据它们的共性抽象出来的一致接口.
struct hw_interrupt_type { typename; const char * typename; irq); unsigned int (*startup)(unsigned int irq); void (*shutdown)(unsigned int irq); irq); irq); void (*enable)(unsigned int irq); irq); void (*disable)(unsigned int irq); irq); void (*ack)(unsigned int irq); irq); void (*end)(unsigned int irq); void (*set_affinity)(unsigned int irq, mask); unsigned long mask); };
大多数异常处理函数的过程是 大多数异常处理函数的过程是: 大多数异常处理函数的过程是
硬件错误码和异常向量号存入当前进程. (1) 硬件错误码和异常向量号存入当前进程 . 发出一个相应的信号给当前进程. (2)发出一个相应的信号给当前进程.
非上述情况的例子:页面异常. 非上述情况的例子:页面异常.
current; struct task_struct *tsk = current; 当 tsk->thread. tsk->thread.error_code /*error_code =
movl int $2, %eax $0x80
系统在初始化设置了0 80 号异常的处理 系统在初始化设置了 0x80号异常的处理 函数为sys_call( 函数为 sys_call( ) , 该函数执行下面一条 语句: 语句:
*SYMBOL_NAME(sys_call_table)(,%eax,4 call *SYMBOL_NAME(sys_call_table)(,%eax,4)
从 而 fork ( ) 函 数 对 应 的 系 统 调 用 为 sys_fork( 该函数又调用do_fork( sys_fork ( ) , 该函数又调用 do_fork( ) 完成具 体的工作. 体的工作.
10. 10.5.4 中断上半部分的处理 1.中断控制器
每个硬件设备控制器都能通过中断请求线发 每个硬件设备控制器都能通过中断请求线发 出中断请求(简称IRQ IRQ) 出中断请求(简称IRQ). 所有设备的中断请求线又连到中断控制器的 所有设备的中断请求线又连到中断控制器的 输入端. 输入端. 在x86单CPU的机器上采用两个8259A芯片作为 的机器上采用两个8259 在 86单CPU的机器上采用ห้องสมุดไป่ตู้个8259A 中断控制器,一主一从. 中断控制器,一主一从.
当 8259A 有中断信号输入 , 同时中断信号不 8259A 有中断信号输入, 被屏蔽时, 8259A CPU发出 INT信号 发出INT 信号, 被屏蔽时 , 主 8259A 向 CPU 发出 INT 信号 , 请求 中断.这时如果CPU是处于允许中断状况, CPU是处于允许中断状况 中断.这时如果 CPU是处于允许中断状况, CPU 就会发信号给8259 进入中断响应周期. 8259A 就会发信号给8259A进入中断响应周期. 在对 8259A芯片的初始化过程中 ,第n号中断 在对8259 芯片的初始化过程中, 8259A IDT表中的向量号为 32. 在IDT表中的向量号为n +32. 因为中断请求线的数目有限 ,所以几个设备 因为中断请求线的数目有限, 共享一根线是有必要的. 共享一根线是有必要的 .当这根输入线有中断 请求时,处理程序需要依次查询这些设备, 请求时,处理程序需要依次查询这些设备, 以 确定究竟是哪一个设备发出了中断请求. 确定究竟是哪一个设备发出了中断请求.
对于8259A芯片来讲,它的具体成员如下: 对于8259A芯片来讲,它的具体成员如下: 8259
8259A_irq_type static struct hw_interrupt_type i8259A_irq_type = { "XT"XT-PIC", startup_8259 8259A_irq, startup_8259A_irq, shutdown_8259 8259A_irq, shutdown_8259A_irq, enable_8259 8259A_irq, enable_8259A_irq, disable_8259 8259A_irq, disable_8259A_irq, mask_and_ack_8259 8259A, mask_and_ack_8259A, end_8259 8259A_irq, end_8259A_irq, NULL }; hw_irq_controller; typedef struct hw_interrupt_type hw_irq_controller;
irq_desc_t结构用来描述中断源, irq_desc_t结构用来描述中断源,数组 结构用来描述中断源 描述所有的中断源. irq_desc[ ]描述所有的中断源.
typedef struct { status; unsigned int status; /* IRQ 状态 */
*handler; hw_irq_controller *handler; /* 该 中 断所 属 的 中断 控 制器* 制器*/ *action; struct irqaction *action; depth; unsigned int depth; lock; spinlock_t lock; irq_desc_t; } ____cacheline_aligned irq_desc_t; irq_desc_t [NR_IRQS]; irq_desc [NR_IRQS];
10. 10.5.2 异常的处理函数 异常处理的一般流程如下 异常处理的一般流程如下: 异常处理的一般流程如下 保存大多数寄存器的值到核心模式栈上. (1)保存大多数寄存器的值到核心模式栈上.
(2)调用相应的处理函数. 调用相应的处理函数. 跳转到ret_from_exception 标号处退出. ret_from_exception标号处退出 (3) 跳转到 ret_from_exception 标号处退出 .
10. 10.5
内容: 内容:
中断, 中断,异常及系统调用
中断/异常的基本知识; 中断/异常的基本知识; 异常的处理; 异常的处理; 系统调用; 系统调用; 中断的处理; 中断的处理; 软中断. 软中断.
10. 中断/ 10.5.1 中断/异常的基本知识
异常:由CPU产生 产生, 异常 由CPU产生,同步中断产生的通常情况是 执行指令却遇上异常情况, 常见的异常有除零, 执行指令却遇上异常情况 , 常见的异常有除零 , 溢出及页面异常等.另一种情况是使用int指令, int指令 溢出及页面异常等.另一种情况是使用int指令, Linux使用该指令来实现系统调用 Linux使用该指令来实现系统调用. 中断: 分为可屏蔽的和不可屏蔽的两类, 中断 : 分为可屏蔽的和不可屏蔽的两类 , 由一 些硬件设备产生, 些硬件设备产生,可以在指令执行的任意时刻产 生.
间时,将会检查进程是否有信号等待处理. 间时 , 将会检查进程是否有信号等待处理 . 如果有, 如果有 , 则看进程是否有自己的信号处理 函数,有则调用它, 函数 , 有则调用它 , 否则采用内核对信号 的默认处理, 的默认处理,一般是将该进程杀死.
10. 10.5.3 系统调用 用户程序通过系统调用切换到核心态, 用户程序通过系统调用切换到核心态 , 从而可以访问相应的资源.这样做的好处是: 从而可以访问相应的资源.这样做的好处是: 使编程更加容易. 使编程更加容易. 有利于系统安全. 有利于系统安全. 接口统一有利于移植. 接口统一有利于移植. 系统调用的执行过程: fork( 为例, libc库相应的实现 以 fork ( ) 为例 , 在 libc 库相应的实现 有如下的语句: 有如下的语句: int $0x80 指令是所有系统调用的统一入 fork( 系统调用的编号为2 口,fork()系统调用的编号为2.
/*current 为 前进程*/ 前进程* error_code; error_code; 为硬件错误码
*/ tsk->thread. trapnr; trapnr为异常 tsk->thread.trap_no = trapnr; /* trapnr为异常 向量号* 向量号*/ if (info) tsk); force_sig_info(signr, info, tsk); else 从 ret_from_exception 处返回用户空 ret_from_exception处返回用户空 tsk); force_sig(signr, tsk);
中断向量表IDT: 中断向量表IDT: IDT IDT是中断/异常处理在内核的入口.IDT表 IDT是中断 IDT是中断/异常处理在内核的入口.IDT表 项还记录了一些其他信息用以安全检查. 项还记录了一些其他信息用以安全检查. IDT在系统初始化时创建. IDT在系统初始化时创建 IDT在系统初始化时创建. 每个中断/异常都有一个向量号,该号的值 每个中断/ 每个中断 异常都有一个向量号, 255之间 该值是中断/异常在IDT 之间, IDT中的 在0~255之间,该值是中断/异常在IDT中的 索引. 索引. 每个中断/异常均有其相应的处理函数,中 每个中断/ 每个中断 异常均有其相应的处理函数, 异常在使用前必须在IDT中注册信息, IDT中注册信息 断/异常在使用前必须在IDT中注册信息,以 保证发生中断/ 保证发生中断 / 异常时能找到相应的处理函 数.