13-阶段总结二:Bochs下调试bootsect.S、setup.S、head.s

调试bootsect.S setup.S head.s

      • 1. bootsect.S的调试(Intel汇编风格,16位)
      • 2. setup.S的调试(Intel汇编风格,16位)
      • 3. head.s的调试(AT&T汇编风格,32位)
      • 4. 几点收获及下篇预告

1. bootsect.S的调试(Intel汇编风格,16位)

13-阶段总结二:Bochs下调试bootsect.S、setup.S、head.s_第1张图片13-阶段总结二:Bochs下调试bootsect.S、setup.S、head.s_第2张图片
13-阶段总结二:Bochs下调试bootsect.S、setup.S、head.s_第3张图片
13-阶段总结二:Bochs下调试bootsect.S、setup.S、head.s_第4张图片
13-阶段总结二:Bochs下调试bootsect.S、setup.S、head.s_第5张图片

13-阶段总结二:Bochs下调试bootsect.S、setup.S、head.s_第6张图片
13-阶段总结二:Bochs下调试bootsect.S、setup.S、head.s_第7张图片

bootsect小结:
1) 复制bootsect(0x7c00)自己到0x90000处(因为后面system模块会移到0x0000处,会覆盖掉0x7c00,故需转移阵地以自保(其实是保护setup放置在
	0x90000开始的一些硬件参数,这些参数内核后面要用到,而不是bootsect(被setup无情的用硬件参数覆盖掉)))
2) 加载软驱参数表到0x9fef4,并修改新表的最大扇区数且让中断向量0x1E指向新表,即0x9fef5。
	(修改最大扇区数是加快后面system大量扇区的读操作,避免多扇区读操作所读的扇区数超过默认磁盘参数表中指定的
	最大扇区数时BIOS将不能进行正确识别。另外,软驱参数表后面内核要用到)
3) 加载setup到0x90200处
4) 读取磁盘驱动器的每磁道扇区数并保存到sectores,以方便后面根据sectors检测并确定根设备号,同时打印"Loading"
5) 将system模块加载到0x10000
6) 检测并确定根设备号后,跳转到setup(0x90200)处开始执行

2. setup.S的调试(Intel汇编风格,16位)

13-阶段总结二:Bochs下调试bootsect.S、setup.S、head.s_第8张图片
13-阶段总结二:Bochs下调试bootsect.S、setup.S、head.s_第9张图片
13-阶段总结二:Bochs下调试bootsect.S、setup.S、head.s_第10张图片
13-阶段总结二:Bochs下调试bootsect.S、setup.S、head.s_第11张图片

setup.S小结:
	1) 获取显卡、光标位置、硬盘参数表等信息到0x90000开始处(覆盖了bootsect),以方便后面内核使用(因为system模块
	     覆盖掉中段向量表后就不能在使用BIOS提供的中断服务获取这些参数了)
	2)临时设置IDT(空表)和GDT(设置了内核代码段和数据段,且段长、基地址都相同),这是进入保护模式前必须设置的
	3) 开启A20地址线(上面没展示)且重新对0x20-0x2F中断编程(涉及8259A芯片的编程方法,可参与其它博客)
	4) 开启保护模式后,远跳转到system代码段(即head)开始处执行

3. head.s的调试(AT&T汇编风格,32位)

13-阶段总结二:Bochs下调试bootsect.S、setup.S、head.s_第12张图片
13-阶段总结二:Bochs下调试bootsect.S、setup.S、head.s_第13张图片
13-阶段总结二:Bochs下调试bootsect.S、setup.S、head.s_第14张图片
13-阶段总结二:Bochs下调试bootsect.S、setup.S、head.s_第15张图片
13-阶段总结二:Bochs下调试bootsect.S、setup.S、head.s_第16张图片

head.s小结:
1) ds/es/fs/gs均置位0x10(内核数据段),方便后面数据的寻址
2) 重置GDT、IDT(IDT的256项都指向ignore_int,GDT只改了线性基地址)
3)检测A20地址线是否成功开启,且检测有没协处理器
4)main地址压栈(为后面通过ret跳转到main),设置页目录表、页表项
5) 加载CR3指向页目录表物理地址,开启分页后,ret 弹出栈中main地址,从而开始指向main函数

4. 几点收获及下篇预告

三点收获:
1.更了解了8086相关的指令用法
2.更熟悉bochs提供的调试命令(备注:我在window下调试,跟linux下有些许差异,如sreg在win下会报错)
3.更清楚看到内存的变化情况,即引导启动的流程
下一篇预告:初始化函数——main

参考资料:
《Linux内核完全剖析——基于0.12内核》第6章、第17章
Bochs更详细的调试命令请参考:https://my.oschina.net/u/1777508/blog/1841996

你可能感兴趣的:(Linux内核入门专栏)