一、编译程序i流程
1.环境配置
先安装ubutun12.04 desktop版
在unbutun上面安装bochs和安装nasm,然后make即可编译第五章i程序
2.编译提示出错我们要修改的地方
(1)kernel.asm文件
凡是有hlt指令的前面必须有sti,不然会闪退,所以书中的源代码需要我们改掉
有两处
exception:
call exception_handler ;0008:0003058f (unk. ctxt): call .+0x30c25
add esp, 4*2 ; 让栈顶指向 EIP,堆栈中从顶向下依次是:EIP、CS、EFLAGS
;sti;如果你要打开前面的ud2来看看异常,记得这里一定要加上sti哦,不然闪退
hlt
和
%macro hwint_master 1
push %1
call spurious_irq
add esp, 4
sti;注意注意啊这是我们自己补上的,这里要补上然后重新编译内核,不补上程序会闪退,反正hlt前面必须有sti来吧IF设置成1
hlt
%endmacro
(2)makefile文件
由于编译版本的问题,所以makefile要修改
ASMFLAGS = -I boot/include/多一个斜线啊!
改makefile的CFLAGS = -I include -c -fno-stack-protector
二.内核分布
; 内存看上去是这样的:
三.现在来调试i程序,从kernel入手
先要跳过boot.asm跟loader.asm
;0x7d14 jmp far 9000:0100
b 0x7d14
c
b 0x90291
c
b 0x8:0x903b2 or b 0x8:0x903ad
n
看到 0008:00030400 (unk. ctxt): mov esp, 0x32c40就来到kernel.asm啦
等等,每一行的详细调试,请看我的笔记
ch5_i_mynote
四、心得
1、第五章程序i,这里编写了异常跟硬件终端,那个16个异常是cpu自带的,当发生异常时CPU就可以得到中断向量号了,然后去IDT里面去找,int0-int14,int16。
而硬件中断需要我们编程8259A芯片,这样当发生中断的时候CPU才会去读IDT表然后执行对应的中断处理程序,这里必须我们设置8259A,如果你不设置,
那么无论你作死的敲键盘,cpu也不会中断的,就算你已经设置了IDT表也毛用的,因为他不是异常,亲儿子就是不一样囧!注意啊这里跟高级语言的异常区别开啊
他们根本不是一回事
2.第五章程序i做的事情呢,就是至于loader.asm跟boot.asm不多说就是把我们的kernel.bin载入到内存xx位置,而kernel.bin目前做的工作就是设置GDT表跟IDT表,然后编程设置了下8259A芯片,有了16个中断,然后封装了一下,方便以后扩充好了没了
3.奇葩的地方我看了第一版跟第二版的书,hlt之前都没有sti指令,如果我不加,那么久闪退啊,连结果都看不见,xx网友说,这是因为必须开中断,方便hlt之后cpu
要恢复过来,我想说这不是的,我这不是一直让cpu发呆着吗,跟中断不中断半毛钱关系啊,为什么必须要sti指令呢,而作者却没有加,可能是我们的环境不一样吧
等有空我拿真机做实验试试在写上结果
最后附上调试和说明的代码。(郁闷啊上传代码之后要等好久才能显示连接地址,写博客好浪费时间啊,囧)。
http://download.csdn.net/detail/u011422742/9457771