linux连续运行多少天,连续奋战了好几天,终于从硬盘中启动了linux0.11

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

连续奋战了好几天,终于从硬盘中启动了linux0.11.

已经把bootimage和rootimage合并到一起,形成的二进制格式如下

|----|-----|------------|--|---------------------------------|

boot setup system 填充 rootimage

现在这样实现是把内核和文件系统分开存放的,这样并不好,下一步需要把内核放到rootimage中,在加载内核时从文件系统中得到

在这个过程中,遇到了很多问题

1.在执行到head.s中的

movl $0x10,%eaxmov %ax,%dsmov %ax,%esmov %ax,%fsmov %ax,%gslss stack_start,%esp

时异常了,这个问题花费了很长时间,后面发现是因为bootsect.s的加载system的代码已经不适合硬盘了,

代码没有对system进行完整的加载,所以需要对bootsect.s中的代码进行修改。这是个常识问题,但因为不细心还是花费了很多时间(在bootsect.s中int13读时dl寄存器需要指名是硬盘,而不是0)

2.在main.c中

sched_init(); buffer_init(buffer_memory_end);hd_init();floppy_init();sti();

测试代码发现只要一执行到sti就出错,而且是报内存访问异常错误,当时很奇怪,sti又没有访问内存。折腾了很久,后来在网上搜索,发现一哥们也遇到同样问题(http://www.oldlinux.org/oldlinux/archiver/?tid-13206.html).后来发现next_timer没有初始化,所以一开中断就出现内存访问异常。幸苦有这个哥们帮助,在此谢谢他(哥们真厉害,竟然跟踪到知道next_timer没有初始化)。而实际代码中已经进行了nex_timer=NULL的初始化,但它确放在bss区,我在填充时使用了随机数,所以next_timer也变成随机了。后来我用0来进行对齐填充的。以后要记住,可以随便的事情不能随便,填充的字段看似没用,但还是用0最好(这里也有一个问题,怎么把next_timer放到bss区了,很奇怪)

3.因为把文件系统放到了最后面,而不是开始,所以文件系统中的块地址要进行修改,就是加上一个偏移值,因为我的文件系统从512*240处开始存放,所以文件系统的起始块地址是120.在读时加上这个偏移地址就ok

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值