操作系统详解(2)——异常处理(Exception)

系列文章:
操作系统详解(1)——操作系统的作用

System Calls

引发异常的过程一定涉及到控制流的改变(用户态 ↔ \leftrightarrow 内核态)
前面提到的jump指令和call/return指令都能改变控制流,但都只能在同一个mode中

新指令: syscall & sysret

调用syscall后控制流的变化:

image.png

举个栗子:

# hello world
int mian()
{
    write(1, "hello, world\n", 13); 
    // 1:文件描述符, 1这里指标准输出stdout->屏幕
    // 13:写入的字节数
    _exit(0);
}

image.png
看看汇编的结果:

.section .data
2 	string:
3 		.ascii "hello, world\n"
4 	string_end:
5 		.equ len, string_end - string
6 	.section .text
7 	.globl main
main:
	# First, call write(1, "hello, world\n", 13)
9 	movq 	$1, %rax 	  # write is system call 1
10 	movq 	$1, %rdi 	  # Arg1:stdout has descriptor 1
11 	movq 	$string, %rsi # Arg2:Hello world string
12 	movq 	$len, %rdx    # Arg3:string length
13 	syscall     	      # Make the system call
	# Next, call exit(0)
14	movq 	$60, %rax 	  # _exit is system call 60
15 	movq 	$0, %rdi      # Arg1:exit status is 0
16 	syscall 		      # Make the system call

系统调用的参数: 最多6个参数在两个modes间传递:
%rdi, %rsi, %rdx, %r10, %r8, %r9
caller-saved registers必须在user mode中保存好
%rcx和%r11 被销毁了

分别保存%rsp以及%rflags
%rflags除了conditional code, 还包括:
IF(是否会被中断)
TF(Trap Flag)(用于单步执行)

返回值保存在%rax中
image.png

Event & Exception

(事件以及异常)

处理器状态:
处理器中的一系列bits和signals,例如kernel bit

当processor’s state发生变化时:

  • 调用syscall/sysret
  • 从磁盘/网络适配器接收数据
  • 引发错误的指令,比如除0

异常: 对事件产生反应,以改变控制流的硬件机制

Exception Table

  1. Each type of event has a unique exception number k
  2. Exception table entry k points to a function (exception handler)
  3. Handler k is called each time exception k occurs.

image.png
image.png

Exception Handler

内核mode中的代码

将需要恢复被中断进程的必要信息储存在kernel栈上

  • Return address ( I c u r r / I n e x t I_{curr}/I_{next} Icurr/Inext)
  • RFLAGS, RSP

exception handler处理结束后:

  • returns control to the current instruction Icurr
  • returns control to the next instruction Inext
  • aborts the interrupted program

Exceptions的种类

Synchronous exceptions (同步调用)

执行一个指令的结果

  • Traps

    Intentional
    return to I n e x t I_{next} Inext
    e.g. syscall, breakpoint traps

  • Faults

    Unintentioanl
    可能可以恢复
    重新执行Icurr或者中断
    e.g. page faults(recoverable), protection faults(unrecoverable)

  • Aborts

    Unintentional
    Unrecoverable
    中断当前程序
    e.g. parity error(奇偶校验), machine check

Tips:
Fault: software error
Abort: hardware error (fatal)

Fault Example #1
访问内存时,有可能该部分的内存还没有准备好.

long a[1000];
main()
{
    a[500] = 13;
}

报缺页错误(page fault), 切换到OS, 处理完错误(Create page and load into memory), 返回Icurr再执行一次

Fault Example #2
访问非法内存

int a[1000];
main()
{
    a[5000] = 13;
}

报缺页错误(page fault), 切换到OS,操作系统发现了访问非法地址, 向user process发送SIGSEG信号,
user process exits with “segmentation fault”

Exception NumberDescriptionException class
0Divide errorFault
13General protection faultFault
14Page faultFault
18Machine checkAbort
32-255OS defined exceptionInterrupt or trap

Asynchronous exception(interrupts)

由外部事件导致的.

  • 设置处理器的中断引脚(interrupt pin)
  • Handler返回"next" instruction

Examples:

  • I/O interrupts
    • hitting ctl-c at the keyboard
    • 接受网络包
    • 磁盘读写
  • Hard reset interrupt
    hitting the reset button
  • Soft reset interrupt
    hitting ctl-alt-delete on a PC

以I/O interrupt为例, I/O devices 向system bus上放置一个数字用来识别造成interrupt的设备
导致CPU停止执行当前程序,并跳转到OS中的interrupt handler

I/O 与 processor 之间的关系:
image.png
异步中断的流程图:
image.png

各种Exceptions分类整理:
image.png

举日常编程中出现异常的例子:

ScenarioException TypeSynchronous/AsynchronousException Handler Return
A. Access content at address 0x0FaultSynchronousNever return
B. Memory corruptionAbortsSynchronousNever return
C. “kill -9 <pid>” in shellTrapsSynchronousReturn to next instruction
D. Click your mouseInterruptAsynchronousReturn to next instruction

总结

介绍了操作系统的异常处理机制,并区分了异常的种类以及它们相应不同的处理方式。

下一章将讲解进程的具体内容,包括并发的概念。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值