Yesterday:error is still perfect and am broken. anxiety,really.
Today:I just want to say,well,however,thx to the error.
done:
1.bochs 调试linux 0.11 内核,出现"Insert root floppy and press ENTER". 按照网上方式,点击bochs中(注意:bochs配置文件中,鼠标不要禁用)config按钮,更换软盘,出现"kernel panic:Unable to mount root"
解决:
1.修改Makefile:RAMDISK= #-DRAMDISK =2048 -> RAMDISK= -DRAMDISK = 2048
2.点击config按钮时,将第一个软盘(即bootimage,此时引导程序已经将内核装入内存,完成了它的任务)换成rootimage(根文件系统).按照网上方式,查看了Image引导扇区,509和510字节分别是0000,用二进制工具修改跟设备号为软盘B(/dev/fd1),0x021d,没有成功。跟踪函数check_disk_change(dev),未改变。不解,有待下一步了解.
3.至此,可以mount_root()了,但仍有后续问题未解决.
4.参考资料:
2.floppy driver
在没有定位上述问题之前,一直自己追踪函数.便以为是自己floppy driver的问题。囧~欣慰的是,过程中又了解不少知识.
something to do:
1.反复打印:“child 'pid' died with code 'i' ”,初步定位加载Shell时问题.
2.gdb 怎解?囧~调试一直用printk & panic^^.
personal experience:
像谁说的,以悲观主义视角,看这永远麻烦打底的人生。那么,欣喜便不是那么奢侈与意外。
漫漫人生路,那些真正能够走远的人,大多需要高智商高情商的,普通如我,惟望诚惶诚恐,仍要坚实的,努力走完。
2013/6/6
ps:
上次提到,ROOT_DEV如何使用/dev/fd1问题,现做下补充.linux 0.11使用build.c进行image的合成.build.c程序,被编译成一个独立的执行程序,它本身并没有被编译链接到内核代码中,编译执行后,会将boot目录下bootsect.s、setup.s所编译生成的两个执行模块以及其他所有程序编译连接成的system模块组合成内核镜像文件image.
/*
* build.c
*/Makefile:
*...
*Image: boot/bootsect boot/setup tools/system tools/build
* objcopy -O binary -R .note -R .comment tools/system tools/kernel
* $(ROOT_DEV) > Image
* rm tools/kernel -f
* sync
*...
*/
...
int main(int argc,char **argv)
{
...
if((argc != 4) && (argc != 5))
usage();
if(argc == 5) {
if (strcmp(argv[4], "FLOPPY")){
if (stat(argv[4], &sb)) { /*命令行第四个参数,由Makefile可知,为ROOT_DEV*/
perror(argv[4]);
stat root device.");
}
major_root = MAJOR(sb.st_rdev);
minor_root = MINOR(sb.st_rdev);
}
else {
major_root = 0;
minor_root = 0;
}
else{
major_root = DEFAULT_MAJOR_ROOT;
minor_root = DEFAULT_MAJOR_ROOT
}
}
...
} //main
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.strcmp(const char *s1,const char* s2)
The strcmp() function compares the two strings s1 and s2. It returns an integer less than, equal to, or greater than zero
if s1 is found, respectively, to be less than, to match, or be greater than s2
2.我尝试了修改Makefile ROOT_DEV和相对应bootsect.s中ROOT_DEV的设备号,(floppy 或者/dev/hd6)都无法stat,索性直接将其判断注释掉,并直接修改设备号如下:
if(argc == 5)
{
major_root = 0x02;
minor_root = 0x1d;
}
如此,如果要修改root挂载方式,就要自己手动输入相应的值了。-_-!
阅读(2268) | 评论(0) | 转发(0) |