您的位置:首页 > 其它

操作系统的学习(1)——启动,中断,异常和系统调用。

2017-08-10 19:16 387 查看
哇、、、之前的被误删了。。难受

bootloader将控制权交给os后,需要了解函数调用的关系,可以帮助我们调试。

c函数调用的实现:寄存器压栈,call,出栈。

GCC内联汇编(在C语言开发环境中使用汇编代码):GCC对C语言的扩张,可直接在C语句中插入汇编指令。是因为C不足以完成所有CPU指令,特别是一些特权指令,例如加载全局描述符表(LGDT)。

GCC内联汇编如何工作:用给定的末班和约束来生成汇编指令和直接在C函数内形成汇编源码。

x86中断处理过程:

一:了解x86中断源,也就是谁产生了中断。

中断:外部中断(串口、硬盘、网卡、时钟。。),软件中断(int80软中断),软中断通常用于系统调用。

异常:除零错等。

二:了解CPU和操作系统如何处理中断。

每一个中断或者异常都会与一个中断服务例程(ISR)产生关联,关联关系存储在中断描述符表内(IDT)。每产生一个中断就会产生一个对应的中断号,中断号唯一标识了这个中断。

流程:产生中断后,我们根据这个中断可以知道相应的中断号,然后CPU会根据这个中断号来查询IDT属于哪一项,然后找到相应的中断门或者叫陷阱门,从中取出段选择子,以这个段选择子作为index来查全局描述符表(GDT),GDT内存的是段描述符,段描述符内存有一个基地址(Base address),基地址再加上IDT中的Offset合在一起作为线性地址,来指向ISR(中断服务例程)。

所以一旦产生中断,CPU就会自动访问IDT和GDT俩个表,来查到相应的中断服务例程。

同一特权级下,用的同一个栈,内核态产生的中断依然在内核态,用户态产生的中断会跳到内核态中,从中断跳到查找中断服务例程保存中断状态。

不同特权级分为俩个栈,不会跳转。

系统调用:用户程序通过系统调用访问OS内核服务。系统调用是一个软中断,中断号是0x80(int 0x80)

实现:需要指定中断号,使用trap或者使用特殊指令。

三:能够对中断向量表(IDT)进行初始化。

练习问题:一个被系统认为是符合规范的硬盘主引导扇区的特征是什么?

引导扇区大小为512字节,最后俩个字节为标志性结束字节0x55,0xAA,昨晚这样的检查才能认为是符合规范的磁盘主引导扇区。

练习问题:bootloader是从实模式进入保护模式的,为何开启A20地址线?

A20地址线控制禁止时,程序就像在8086中运行,访问超过1MB内存时,会自动回卷。如果不开启A20就无法访问到所有内存。

开启A20,由于历史原因A20地址位由键盘控制器芯片8042管理。所以要给8042发命令激活A20

8042有两个IO端口:0x60和0x64, 激活流程位: 发送0xd1命令到0x64端口 –> 发送0xdf到0x60。

下面代码摘自ucore实验

/[b]***************************************************[/b]/

29 seta20.1:

30 inb 0x64,31testb0x2, %al

32 jnz seta20.1

发送命令之前,要等待键盘输入缓冲区为空,这通过8042的状态寄存
af09
器的第2bit来观察,而状态寄存器的值可以读0x64端口得到。

上面的指令的意思就是,如果状态寄存器的第2位为1,就跳到seta20.1符号处执行,知道第2位为0,代表缓冲区为空

33

34 movb 0xd1,35outb0x64 # 0xd1 means: write data to 8042’s P2 port

发送0xd1到0x64端口

36

37 seta20.2:

38 inb 0x64,39testb0x2, %al

40 jnz seta20.2

41

42 movb 0xdf,43outb0x60 # 0xdf = 11011111, means set P2’s A20 bit(the 1 bit) to 1

/[b]***********************************************************[/b]/

实模式:实模式就是, 为了实现系统升级的兼容性,如80286的系统表现(包括80286以后的CPU)要与8086/8088 的系统表现一致,就需要80286 CPU访问100000H-10FFEFH之间的地址的时候, 按照对1M求模的方式进行, 无论A20地址线开启关闭与否, 这种内存访问情况 称为实模式;

保护模式:保护模式就是, 以A20地址线开启为前提,80286 CPU访问100000H-10FFEFH之间的地址的时候, 是访问真实的内存地址,不是求模访问,如访问100001H,就是真真切切地 访问 0x 100001H,而不是求模的 0x000001H 地址, 这种内存访问情况称为保护模式;

练习问题:中断向量表中一个表项占用多少字节,其中哪几位代表中断处理代码的入口?

中断描述符表中一个表相占8个字节,其中2-3字节是段选择子,0-1字节和6-7字节拼成位移,两者联合便是中断处理程序的入口地址。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: