六、分割源文件和中断处理

来源:互联网 发布:淘宝直通车开通流程 编辑:程序博客网 时间:2024/04/30 16:58
分割源文件:
整理makefile
bootpack.nas : bookpack.gas Makefile
     $(GAS2NASK) bootpack.gas bootpack.nas
graphic.nas : graphic.gas Makefile
     $(GAS2NASK) graphic.gas graphic.nas
dsctbl.nas : dsctbl.gas Makefile
     $(GAS2NASK) dsctbl.gas dsctbl.nas

这些重复的,可以改为通用的
%.gas : %.c Makefile
     $(CC1) -o $*.gas $*.c
%.nas : %.gas Makefile
     $(GAS2NASK) $*.gas $*.nas


_load_gdtr:          ; void load_gdtr(int limit, int addr);
          MOV          AX,[ESP+4]          ; limit
          MOV          [ESP+6],AX
          LGDT     [ESP+6]
          RET
函数分析:这个是将指定值的段上限和地址值赋给48位的GDTR寄存器的。
_load_idtr:          ; void load_idtr(int limit, int addr);
          MOV          AX,[ESP+4]          ; limit
          MOV          [ESP+6],AX
          LIDT     [ESP+6]
          RET


下面说一下段上限
     表示一个段有多少个字节。段上限最大有4GB,也就是32位的数值,如果直接放进去,这个数值本身占用4个字节,再加上基地址4个字节,占满了8个字节,因此就没有保存段管理属性的地方了,因此段上限只能使用20位,这样一来。最大就只能1MB了,相当于又回到了16位的时代,很可悲,于是INTEL工程师中想了个办法,在属性里面设置了一个标志位Gbit,当Gbit设置为1的时候,limit的单位不解释为字节,而是解释为页。。页大小为4KB
     这样一来4KB*1M = 4GB

windows下32位模式:
     CPU有系统模式和应用模式,比如说,在应用模式下调用LGDT指令,CPU则对该指令不予执行,同时会告诉操作系统,应用程序试图执行LGDT指令,有问题需要处理!同样的,应用程序向执行操作系统专用段的时候,CPU也会中断执行,并且马上向操作系统来报告。因为如果普通应用程序在应用模式下还能执行LGDT指令的话,歹心程序员说不定会根据自己的需要写GDT,那么就是系统漏洞而且防不胜防啊。

CPU到底处于应用模式还是系统模式,取决于执行中的应用程序是位于访问权0x9a的段还是0xfa的段。。。。。。


************************************************华丽的分割线*****************************************************
使用中断前,首先需要正确初始化GDT和IDT啊,然后在初始化PIC啊,也就是可编程中断控制器!

什么是PIC呢?
     设计上CPU单独只能处理一个中断,这不够用,IBM的大叔们设计电脑时候,就在主板上增加了几个辅助芯片,现如今已经集成到了芯片组中,
PIC是将8个中断信号集合成一个中断信号的装置。PIC监视着输入管脚的8个中断信号,只要有一个中断信号传递进来,就将唯一的输出管脚信号变为ON,并且通知CPU,后来要处理个更多中断,只需要通过增加PIC,例如俩个PIC可以处理15个中断信号。
     结构如下,靠近CPU的PIC叫做主PIC,与主PIC相连的叫做从PIC,主PIC负责0到7号,从负责8-15号,

中断发生以后,如果CPU可以受理这个中断,CPU就会命令PIC发送俩个字节的数据,CPU和PIC之间有根信号线用来传递数据的,利用in和out来传送,比如PIC传递一个0xcd 0x10进CPU,在CPU看来,这和内存读进来的程序是一样的,所以CPU就把这个0xcd 0x10作为机器语言执行,这里的0xcd就是调用BIOS中断的那个INT指令。
xx

pushad和popad就是把所有寄存器压栈出栈


0 0