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

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

设置0x7c00断点图复制bootsect自身到0x90000,共512字节
2.复制软驱参数表并修改最大扇区数
load_setup:移动setup到0x90200处
4保存磁盘驱动器的每磁道最大扇区数到sectors,并显示“Loading”

加载system模块到0x10000开始处
检查根设备号,并跳到setup(0x90200)处开始执行

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位)

获取显卡、光标位置、硬盘参数到0x90000开始处(覆盖bootsect)
移动system模块到0x0000,共512字节
3.IDT和GDT的设置
4.开启保护模式并跳到head开始运行

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

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

1段寄存器和堆栈空间变化
2.IDT和GDT的更新
3检测A20是否开启,且检查数学协处理器存在与否
4.main地址压栈且设置页目录表、页表项
5加载CR3且开启分页后,ret到main处执行

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值