目录
引:
宏观来看我们可以用冯诺依曼体系结构来看待一个运行的OS
那么os内部是怎样工作的?
具体来说,开机启动后OS是一个死循环:
int main()
{
//接收中断信号并调用相关方法解决问题
...
while(true)
pause();
return 0;
}
CPU接收到中断信号会在相应的寄存器里调用中断向量表中相应的中断处理方法,解决后继续陷入死循环!
本文我们就以这张图片展开描述。
知识点补充:
1、中断:
中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。
OS就是利用外设或计算机内部的各种中断信号去处理各种问题,用这种方法就可以推动OS运行
(1)硬中断
通过外部硬件中断,操作系统就不需要对外设进⾏任何周期性的检测或者轮询
由外部设备触发的,中断系统运⾏流程,叫做硬件中断
内核源码:
//Linux内核0.11源码
void trap_init(void)
{
int i;
set_trap_gate(0,÷_error);// 设置除操作出错的中断向量值。以下雷同。
set_trap_gate(1,&debug);
set_trap_gate(2,&nmi);
set_system_gate(3,&int3); /* int3-5 can be called from all */
set_system_gate(4,&overflow);
set_system_gate(5,&bounds);
set_trap_gate(6,&invalid_op);
set_trap_gate(7,&device_not_available);
set_trap_gate(8,&double_fault);
set_trap_gate(9,&coprocessor_segment_overrun);
set_trap_gate(10,&invalid_TSS);
set_trap_gate(11,&segment_not_present);
set_trap_gate(12,&stack_segment);
set_trap_gate(13,&general_protection);
set_trap_gate(14,&page_fault);
set_trap_gate(15,&reserved);
set_trap_gate(16,&coprocessor_error);
// 下⾯将int17-48 的陷阱⻔先均设置为reserved,以后每个硬件初始化时会重新设置⾃⼰的陷阱
⻔。
for (i=17;i<48;i++)
set_trap_gate(i,&reserved);
set_trap_gate(45,&irq13);// 设置协处理器的陷阱⻔。
outb_p(inb_p(0x21)&0xfb,0x21);// 允许主8259A 芯⽚的IRQ2 中断请求。
outb(inb_p(0xA1)&0xdf,0xA1);// 允许从8259A 芯⽚的IRQ13 中断请求。
set_trap_gate(39,¶llel_interrupt);// 设置并⾏⼝的陷阱⻔。
}
void
rs_init (void)
{
set_intr_gate (0x24, rs1_interrupt); // 设置串⾏⼝1 的中断⻔向量(硬件IRQ4 信
号)。
set_intr_gate (0x23, rs2_interrupt); // 设置串⾏⼝2 的中断⻔向量(硬件IRQ3 信
号)。
init (tty_table[1].read_q.data); // 初始化串⾏⼝1(.data 是端⼝号)。
init (tty_table[2].read_q.data); // 初始化串⾏⼝2。
outb (inb_p (0x21) & 0xE7, 0x21); // 允许主8259A 芯⽚的IRQ3,IRQ4 中断信号请
求。
}
(2)软中断:
上述外部硬件中断,需要硬件设备触发。
为了让操作系统⽀持进⾏系统调⽤,CPU也设计了对应的汇编指令(int 或者 syscall),可以让CPU内 部触发中断逻辑。
用户通过寄存器(EAX)将系统调用号或者寄存器内部发生的异常信号(1/0)给OS,OS继续按照主方法运行!
系统调用:
CPU设计对应汇编指令(int x80/system call)让CPU进行内部软中断,接着使用IDT(中断向量表)中的system函数入口,然后用户通过寄存器存入的系统调用中断号查看函数表中的相关方法调用相关方法。
简而言之,OS与用户使用系统调用是用户层通过系统调用名,该名是也是系统调用号,两者相当于一个宏,内核提供x80等指令,然后两者经过glibc一起访问中断向量表中的内容完成相关操作。
(3)时钟中断
我们知道进程有自己的切换和调度,那么OS是如何完成该操作?
新的cpu中有一个主频,相当于以前的硬件时钟,通过不断传送高电平引起时钟中断,引起cpu查看IDT推进OS不断查询信号,然后OS将每个进程中的时间片进行减减来完成进程的调度与切换
2、总结
一句话来说OS是基于中断处理上的一个代码块,是一个死循环代码!