操作系统的学习(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字节拼成位移,两者联合便是中断处理程序的入口地址。
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字节拼成位移,两者联合便是中断处理程序的入口地址。
相关文章推荐
- 操作系统from清华大学向勇,陈渝 笔记(二)操作系统的启动、中断、异常、系统调用
- 2.操作系统的启动、中断、异常和系统调用
- 【OS学习】之 启动、中断、异常和系统调用
- 启动、中断、异常和系统调用
- 操作系统——中断、异常和系统调用比较
- 启动、中断、异常和系统调用
- 操作系统 中断异常系统调用
- 操作系统的中断、异常和系统调用
- Xen中的异常和中断(系统调用)、gdt、ldt
- 个人学习笔记---软中断(下半部)和软件中断(系统调用)的区别
- 操作系统学习笔记(2)——中断和异常
- linux系统中关于中断、异常、系统调用、陷阱等概念的解析
- 操作系统学习笔记--系统启动流程
- Ubuntu 操作系统学习笔记之系统启动详解
- 3. ARMv8 中断及异常处理(包括系统调用,系统调用即同步异常)
- linux内核中断、异常、系统调用的分析以及实践
- 操作系统的中断和系统调用
- 中断,异常,系统调用,进程切换时的堆栈变化和寄存器保存
- Linux内核源代码情景分析---第三章 中断、异常和系统调用
- 中断、异常和系统调用