1.关于编译:
可参考pyos3下的compile.bat文件,非常需要注意的是,ld链接时要设置程序从0x9000处开始并且,-e Main后面要跟着kernel.o(存放有Main函数的二进制文件)否则好像会找不到入口点。
2.关于ICW1~4:
// 发送4个ICW
//ICW1
ToPort( 0x20 , 0x11 ) ;
ToPort( 0xA0 , 0x11 ) ;
//ICW2
ToPort( 0x21 , 0x20 ) ;
ToPort( 0xA1 , 0x28 ) ;
//ICW3
ToPort( 0x21 , 0x4 ) ; // 在 Inter 出产的硬件中,PIC之间的联系是
ToPort( 0xA1 , 0x2 ) ; // 把 PIC1的IRQ2 同 PIC2 的IRQ1 联系起来
//ICW4
ToPort( 0x21 , 0x1 ) ;
ToPort( 0xA1 , 0x1 ) ;
//OCW1 下面设定中断屏蔽字,只许可键盘中断
ToPort( 0x21 , 0xFD ) ;
ToPort( 0xA1 , 0xFF ) ;
ICW1的结构
7 6 5 4 3 2 1 0
0 0 0 1 M 0 C I
I : 如果 ICW3 后面还有 ICW4,则置位
C : 如果不置位,表明这两个 PIC 工作在串联状态下
M : 表明 IR0 到 IR7 的线是水平触发,在PC机中,这位应为0(边沿触发)
这里设为0x11,表明要使用ICW4,工作在串联状态、边沿触发
ICW2 表明了 IRQ0 在中断向量表中的地址,在保护模式下,你应当改变它
7 6 5 4 3 2 1 0
A7 A6 A5 A4 A3 0 0 0
因为最后三位均是零,因此要求IRQ0的中断号必须是8的倍数、IRQ1 在中断向量表中的地址为 IRQ0的+1,IRQ2~IRQ7以次类推
这里PIC1设为0x20,表明IRQ0中断号为0x20,IRQ1中断号为0x21……IRQ7中断号为0x27
PIC2设为0x28,表明IRQ8中断号为0x28,IRQ9中断号为0x29……IRQ15中断号为0x2F
即:IRQ0~IRQ15对应0x20~0x2F,
ICW3 关于 PIC1 的结构
7 6 5 4 3 2 1 0
IR7 IR6 IR5 IR4 IR3 IR2 IR1 IR0
如果 IR0 是置0的,则表明此根线联到一个外围设备
如果 IR0 是置1的,则表明此根线与PIC2联结
这里PIC1设为0x8,表明主片的IRQ2参与级联
PIC2设为0x2,表明从片联到主片的的IRQ2
ICW4 的结构
7 6 5 4 3 2 1 0
0 0 0 0 0 0 EOI 80x86
EOI 表明中断的最后是自动处理还是由软件辅助处理。在PC中此位通常置0,表示软件必须
处理中断的最后扫尾工作
80x86 表明PIC是否工作在80x86的体系结构下
这里设为0x1,表明工作在80x86体系结构下。
OCW1:
当某位置位0表示允许其发出中断请求,置为1表示屏蔽其中断请救
这里PIC1设为 0xFD 就是 11111101 ;即只允许IRQ1,即键盘中断请求。
PIC2设为0xFF,屏蔽IRQ8~IRQ15
PIC 1 处理的中断有
0 系统时钟
1 键盘
2 重定向到IRQ9 (PIC2的IRQ1),如果此位被置1,则屏幕掉所有来自PIC2的中断
3 串口 1 (COM2/4)
4 串口 2 (COM1/3)
5 声卡
6 软驱
7 并行端口
PIC 2 处理的中断有
0 实时时钟
1 来自 IRQ2 (PIC1)
2 保留
3 保留
4 鼠标
5 数学协处理器
6 硬盘
7 保留
可参考pyos3下的compile.bat文件,非常需要注意的是,ld链接时要设置程序从0x9000处开始并且,-e Main后面要跟着kernel.o(存放有Main函数的二进制文件)否则好像会找不到入口点。
2.关于ICW1~4:
// 发送4个ICW
//ICW1
ToPort( 0x20 , 0x11 ) ;
ToPort( 0xA0 , 0x11 ) ;
//ICW2
ToPort( 0x21 , 0x20 ) ;
ToPort( 0xA1 , 0x28 ) ;
//ICW3
ToPort( 0x21 , 0x4 ) ; // 在 Inter 出产的硬件中,PIC之间的联系是
ToPort( 0xA1 , 0x2 ) ; // 把 PIC1的IRQ2 同 PIC2 的IRQ1 联系起来
//ICW4
ToPort( 0x21 , 0x1 ) ;
ToPort( 0xA1 , 0x1 ) ;
//OCW1 下面设定中断屏蔽字,只许可键盘中断
ToPort( 0x21 , 0xFD ) ;
ToPort( 0xA1 , 0xFF ) ;
ICW1的结构
7 6 5 4 3 2 1 0
0 0 0 1 M 0 C I
I : 如果 ICW3 后面还有 ICW4,则置位
C : 如果不置位,表明这两个 PIC 工作在串联状态下
M : 表明 IR0 到 IR7 的线是水平触发,在PC机中,这位应为0(边沿触发)
这里设为0x11,表明要使用ICW4,工作在串联状态、边沿触发
ICW2 表明了 IRQ0 在中断向量表中的地址,在保护模式下,你应当改变它
7 6 5 4 3 2 1 0
A7 A6 A5 A4 A3 0 0 0
因为最后三位均是零,因此要求IRQ0的中断号必须是8的倍数、IRQ1 在中断向量表中的地址为 IRQ0的+1,IRQ2~IRQ7以次类推
这里PIC1设为0x20,表明IRQ0中断号为0x20,IRQ1中断号为0x21……IRQ7中断号为0x27
PIC2设为0x28,表明IRQ8中断号为0x28,IRQ9中断号为0x29……IRQ15中断号为0x2F
即:IRQ0~IRQ15对应0x20~0x2F,
ICW3 关于 PIC1 的结构
7 6 5 4 3 2 1 0
IR7 IR6 IR5 IR4 IR3 IR2 IR1 IR0
如果 IR0 是置0的,则表明此根线联到一个外围设备
如果 IR0 是置1的,则表明此根线与PIC2联结
这里PIC1设为0x8,表明主片的IRQ2参与级联
PIC2设为0x2,表明从片联到主片的的IRQ2
ICW4 的结构
7 6 5 4 3 2 1 0
0 0 0 0 0 0 EOI 80x86
EOI 表明中断的最后是自动处理还是由软件辅助处理。在PC中此位通常置0,表示软件必须
处理中断的最后扫尾工作
80x86 表明PIC是否工作在80x86的体系结构下
这里设为0x1,表明工作在80x86体系结构下。
OCW1:
当某位置位0表示允许其发出中断请求,置为1表示屏蔽其中断请救
这里PIC1设为 0xFD 就是 11111101 ;即只允许IRQ1,即键盘中断请求。
PIC2设为0xFF,屏蔽IRQ8~IRQ15
PIC 1 处理的中断有
0 系统时钟
1 键盘
2 重定向到IRQ9 (PIC2的IRQ1),如果此位被置1,则屏幕掉所有来自PIC2的中断
3 串口 1 (COM2/4)
4 串口 2 (COM1/3)
5 声卡
6 软驱
7 并行端口
PIC 2 处理的中断有
0 实时时钟
1 来自 IRQ2 (PIC1)
2 保留
3 保留
4 鼠标
5 数学协处理器
6 硬盘
7 保留