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

哇、、、之前的被误删了。。难受

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实验
/***************************************************/
29 seta20.1:
30 inb 0x64,31testb 0x2, %al
32 jnz seta20.1
发送命令之前,要等待键盘输入缓冲区为空,这通过8042的状态寄存器的第2bit来观察,而状态寄存器的值可以读0x64端口得到。
上面的指令的意思就是,如果状态寄存器的第2位为1,就跳到seta20.1符号处执行,知道第2位为0,代表缓冲区为空

33
34 movb 0xd1,35outb 0x64 # 0xd1 means: write data to 8042’s P2 port
发送0xd1到0x64端口
36
37 seta20.2:
38 inb 0x64,39testb 0x2, %al
40 jnz seta20.2
41
42 movb 0xdf,43outb 0x60 # 0xdf = 11011111, means set P2’s A20 bit(the 1 bit) to 1
/***********************************************************/
实模式:实模式就是, 为了实现系统升级的兼容性,如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字节拼成位移,两者联合便是中断处理程序的入口地址。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值