文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>linux0.11 硬盘启动

linux0.11 硬盘启动

时间:2010-12-30  来源:xunuj

连续奋战了好几天,终于从硬盘中启动了linux0.11.
已经把bootimage和rootimage合并到一起,形成的二进制格式如下
|----|-----|------------|--|---------------------------------|
 boot setup  system     填充      rootimage

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

在这个过程中,遇到了很多问题
1.在执行到head.s中的

movl $0x10,%eax
mov %ax,%ds
mov %ax,%es
mov %ax,%fs
mov %ax,%gs
lss 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(); <--------------------
move_to_user_mode();

      
测 试代码发现只要一执行到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
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载