Chinaunix首页 | 论坛 | 博客
  • 博客访问: 150428
  • 博文数量: 32
  • 博客积分: 2053
  • 博客等级: 大尉
  • 技术积分: 382
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-09 12:45
文章分类

全部博文(32)

文章存档

2011年(12)

2010年(20)

分类: LINUX

2010-08-31 00:24:42

有点郁闷了。。刚写好的笔记忘记保存了。。重新写了。。
刚才的高兴劲没了。。郁闷
今天终于把linux0.11给跑起来了。。下面记录下成功的过程
1.下载redhat9系统中编译的linux0.11
2.编译成功(会遇到很多bug,但可以通过google解决)
3.然本使用ROOT_DEV = 0x021d,就是bootimage放软盘0, rootimage放软盘1.但这样尝试后出现了问题,就是不断的出现reset_floppy called。从网上搜到一个解释。。但自己没弄成功【reset-floppy 反复出现的问题(a盘启动盘 b盘文件系统的case)
mount_root -> read-super -> check_disk_change -> floppy_change -> floppy_on -> ticks_to_floppy_on 会启动b盘的驱动器, 这会导致unexpected_floppy_interrupt被call, 然后recalibrate被设为1
当do_fd_request第一次被call用于读取super block的时候, 遇到recalibrate==1 就调用recalibrate_floppy; 问题来了, current_drive变量还没有机会被赋值, 它应该等于1却是0; 于是导致recalibrate出错, recal_interrupt设reset=1 -> reset_floppy -> reset_interrupt -> recalibrate_floppy(current_drive依然并且永远是错的) -> recal_interrupt->reset_floppy->...
不断的死循环和打印Reset-floppy called
在recalibrate_floppy中向hardware传递正确的driver号能避免这个问题】可以有机会在尝试下。。
4.后来改ROOT_DEV=0X021c,就是boot和root共用软盘0.。这样就能避免上述问题。。但问题仍存在。。。
这样改了后出现了很多令人奇怪的错误。。如Unable to read root。。但这个字符串在代码中始终grep不到。。很是奇怪。。在郁闷了半天了才想起来上半年折腾linux0.11的 时候记得有人说过gcc的某个版本对结构体的复制操作有bug。。如是找啊找。。做了如下修改。。
a. fork.c copy_process()中

*p = *current;

改为

  unsigned char *p1, *p2;
  p1 = (unsigned char*)p;
  p2 = (unsigned char*)current;


  for(i = 0;i < sizeof(*p); i++)
        *p1++ = *p2++;

b.super.c read_super()中

*((struct d_super_block *) s) =
        *((struct d_super_block *) bh->b_data);

改为


unsigned char* p1 = (unsigned char*)s;
unsigned char* p2 = (unsigned char*)(bh->b_data);


for(i = 0; i < sizeof(struct d_super_block); i++)
    *p1++ = *p2++;

c.inode.c read_inode()中

*(struct d_inode *)inode =
        ((struct d_inode *)bh->b_data)
            [(inode->i_num-1)%INODES_PER_BLOCK];

改为

unsigned char *p1, *p2;
p1 = (unsigned char*)inode;


p2 = (unsigned char*)&(((struct d_inode *)bh->b_data)[(inode->i_num-1)%INODES_PER_BLOCK]);
int i;
for(i = 0; i < sizeof(struct d_inode); i++)
    *p1++ = *p2++;

经过上述修改。。我的linux0.11终于跑起来了。。。
截图如下
郁闷了。。跑第二次不好使了。。第三次好使。。第四次又不好使了。。好像是rootimage用错了。得注意了。。为什么rootimage会影响系统的正确性呢。。。。
明天再截图了。。困



补记。。昨天在第一次运行成功后发现后来的运行时成功时失败。。很是奇怪。。话说第一次运行成功也是一个概率事件。。因为有点困所以在输入rootimage名字时输入了另一个文件夹下的rootimage,而不是以前每次尝试的那个rootimage,这就导致第一次运行成功。。。后来终于发现在使用了一次rootimage后。第二次不能使用同样的rootimage,因为好像其已经被修改。。至于怎么被修改还没有弄明白。。。所以第一次成功运行也是一个幸运了。。呵呵。。。。看来成功是不可缺少机会的。。。。今天终于 可以稳定运行。截图如下

阅读(4596) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

e9999e2012-12-05 12:58:50

兄弟,我碰到问题和你一样。也是第一次使用rootimage可以运行,第二次使用同样的rootimage就不可以运行了。请问这是怎么回事?你是怎么解决的?谢谢