+ -
当前位置:首页 → 问答吧 → Linux-0.11内核引导中关于bootsect.s的问题

Linux-0.11内核引导中关于bootsect.s的问题

时间:2011-09-09

来源:互联网

最近刚刚开始学习操作系统,对于linux的引导过程(参考的书籍是赵老师的《Linux内核完全剖析-0.11》)中的bootsect.s文件,不明白它为什么要将自己从0x7c00处移动到0x9000处,直接在0x7c00处加载setup.s不可以吗?觉得这步移动多余,请问我是不是错了?

作者: liuchang8am   发布时间: 2011-09-09

直接加载是不行的.

这个网上有介绍, 我记得此书中也有说明.

好像是为了留空间给中断表.
 
我找找看,能找到再贴上来.

作者: zmlovelx   发布时间: 2011-09-09

书上说,BIOS初始化的时候要在0x0000处放置0x400字节大小的中断向量表,应该不影响bootsect.s从0x7c00处直接运行把?

作者: liuchang8am   发布时间: 2011-09-09

嗯,上面记错了, 不是中断表,是内核.
!bootsect.s被bios启动程序加载至0x7c00 31k处,并将自己移动到地址0x90000 576k处,并跳转到那里。
!
!它然后利用bios中断将setup直接加载到自己后面0x90200 576.5k,并将system加载到地址0x10000处。
!
!注意 : 目前的内核系统最大的长度限制为8*65536 512k字节,即使是在将来这也应该没有问题的

0x90000 - 0x10000 = 0x80000 就是说留给 system的最大空间是是512k字节.


作者: zmlovelx   发布时间: 2011-09-09

引用 3 楼 zmlovelx 的回复:

嗯,上面记错了, 不是中断表,是内核.
!bootsect.s被bios启动程序加载至0x7c00 31k处,并将自己移动到地址0x90000 576k处,并跳转到那里。
!
!它然后利用bios中断将setup直接加载到自己后面0x90200 576.5k,并将system加载到地址0x10000处。
!
!注意 : 目前的内核系统最大的长度限制为8*65536 512k字节,即使是……

是说,如果从0x7c00处直接加载的话,留给system的空间就不够了的意思么?

作者: liuchang8am   发布时间: 2011-09-09

引用 4 楼 liuchang8am 的回复:

引用 3 楼 zmlovelx 的回复:

嗯,上面记错了, 不是中断表,是内核.
!bootsect.s被bios启动程序加载至0x7c00 31k处,并将自己移动到地址0x90000 576k处,并跳转到那里。
!
!它然后利用bios中断将setup直接加载到自己后面0x90200 576.5k,并将system加载到地址0x10000处。
!
!注意 : 目前的内核系统最大……

可以这样理解.

作者: zmlovelx   发布时间: 2011-09-09

可是,我觉得完全可以将system模块加载到别的地方,不是一定要加载到0x10000处的对吧,所以也仍可满足512k的需求。同时,说明这样的话bootsect.s没有必要做移动对么?

作者: liuchang8am   发布时间: 2011-09-09

可以这样做.  
这个是个人实现的选择.

放在0x10000处有一个好处就是靠进低地址, 再低位置就是中断表.
而不是放在更高的地址, 我觉得这样方面后面的内存管理.

作者: zmlovelx   发布时间: 2011-09-09