系列文章:
操作系统详解(1)——操作系统的作用
引发异常的过程一定涉及到控制流的改变(用户态 ↔ \leftrightarrow ↔内核态)
前面提到的jump指令和call/return指令都能改变控制流,但都只能在同一个mode中
新指令: syscall & sysret
调用syscall后控制流的变化:
举个栗子:
# hello world
int mian()
{
write(1, "hello, world\n", 13);
// 1:文件描述符, 1这里指标准输出stdout->屏幕
// 13:写入的字节数
_exit(0);
}
.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)(用于单步执行)
(事件以及异常)
处理器状态:
处理器中的一系列bits和signals,例如kernel bit
当processor’s state发生变化时:
异常: 对事件产生反应,以改变控制流的硬件机制
内核mode中的代码
将需要恢复被中断进程的必要信息储存在kernel栈上
exception handler处理结束后:
执行一个指令的结果
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 Number | Description | Exception class |
---|---|---|
0 | Divide error | Fault |
13 | General protection fault | Fault |
14 | Page fault | Fault |
18 | Machine check | Abort |
32-255 | OS defined exception | Interrupt or trap |
由外部事件导致的.
Examples:
以I/O interrupt为例, I/O devices 向system bus上放置一个数字用来识别造成interrupt的设备
导致CPU停止执行当前程序,并跳转到OS中的interrupt handler
I/O 与 processor 之间的关系:
异步中断的流程图:
举日常编程中出现异常的例子:
Scenario | Exception Type | Synchronous/Asynchronous | Exception Handler Return |
---|---|---|---|
A. Access content at address 0x0 | Fault | Synchronous | Never return |
B. Memory corruption | Aborts | Synchronous | Never return |
C. “kill -9 |
Traps | Synchronous | Return to next instruction |
D. Click your mouse | Interrupt | Asynchronous | Return to next instruction |
介绍了操作系统的异常处理机制,并区分了异常的种类以及它们相应不同的处理方式。
下一章将讲解进程的具体内容,包括并发的概念。