Operation System(1)------------中断与系统调用

辣鸡Mina Jung!实名diss这个辣鸡老师,只能自学了。

中断(Interrupt)

中断主要分为软中断和硬中断两种。

  1. 硬中断(hard irq).由外设向中断控制器发送电平的方式实现,。
  2. 软中断(soft irq).通过程序让cpu陷入陷阱(trap)实现, 其实现的方式可以是异常,系统调用等等。

与中断相关的信息保存在IDT(Interrupt descriptor table)表当中, 其中主要存放的是异常向量和中断向量, 主要的信息是任务段状态段(TSS), 中断调用子过程相关的入口地址,和系统描述符.在Linux中一共有256个IDT表入口。默认的中断向量表需要在内核调用cpu_init()之前使用trap_init()进行初始化。
在进入中断调用的子程序由于任务的特权级别需要变化,需要通过门描述符标记其需要通过的调用门(子程序入口)。大体上上来说分为3类任务门(Task gate), 陷阱门(trap gate), 中断门(interrupt gate),在linux中划分的更加细,貌似和堆栈相关,初始化的时机不同?反正关于这些我还没有搞懂==。

  1. 任务门(Task gate): 任务门的主要作用是用于需要cpu参与相关的过程,如task的上下文切换,寄存器状态的保存恢复等。
  2. 陷阱门(trap gate): 用于异常处理和系统调用,不清IF标志位
  3. 中断门(interrupt gate) : 一般就是最普通的中断调用子程序入口,清理IF标志位,防止被可屏蔽中断打断

任务状态段TSS,主要是用于中断过程中任务切换时候中间状态的保存, 寄存器信息,堆栈指针和分页相关的相关信息。

系统调用(system call)

系统调用的作用是完成任务从用户态到内核态的特权阶级切换。进入内核态之后一些例如I/O, 创建线程之类由内核控制的功能就可以实现了。
使用系统调用的方式是调用0x80号中断,当然这是一个要过陷阱门的中断,kernel随后会从eax寄存器中读取当前的系统调用的入口地址,在其他几个通用寄存器中读取对应的参数。这过程中当前线程的寄存器信息会被压如内核堆栈。
libc的库中提供了c包装的系统调用函数=。=(为什么想起了return-to-libc)

你可能感兴趣的:(Operation System(1)------------中断与系统调用)