有点郁闷了。。刚写好的笔记忘记保存了。。重新写了。。
刚才的高兴劲没了。。郁闷
今天终于把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()中
改为
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,因为好像其已经被修改。。至于怎么被修改还没有弄明白。。。所以第一次成功运行也是一个幸运了。。呵呵。。。。看来成功是不可缺少机会的。。。。今天终于
可以稳定运行。截图如下
阅读(4675) | 评论(1) | 转发(0) |