linux1.0内核代码学习(六) 之内核从软盘引导,从硬盘加载根文件系统

linux1.0内核代码学习(六) 之内核从软盘引导,从硬盘加载根文件系统  

环境配置如下:(在这之前用过linux0.98、1.0、1.13、1.2.13、2.0.4内核,尝试过用gcc2.2.2、gcc2.4.5、gcc2.6.3、gcc2.95.3进行编译调试都没有完全成功过,不过积累了很多经验)

编译环境readhat9.0wmware虚拟机+gcc version 3.2.2

内核源码:https://www.kernel.org/pub/linux/kernel/下载linux-2.4.20.tar.gz源码包

问题一:在对内核源码进行配置的时候首先进行最小配置的尝试,在make zdisk后能够从磁盘引导,但运行时打印出下面的输出信息后就死机:Uncompressing Linux...Ok, booting the kernel.在网上查询了一下,有人解释说有可能是没有配置串口输出,觉得有道理,就在内核中添加了串口相关的配置选项,重新编译内核后有信息输出,可以运行到加载根文件系统的地方。

问题二:在加载根文件系统的时候最开始想用linux0.11的minix的软盘根文件系统,这个时候能够识别根文件系统,但内核提示很多问题,也不能进入shell界面,基本不能用。然后就用软盘制作了一个ext2的文件系统,从编译系统中拷贝了几个文件进去,由于受到容量的限制,也遇到很多问题。最后就在虚拟硬盘上用busybox建立了一个根文件系统,最初由于内核中scsi驱动没有配置正确,在mount根文件系统的时候遇到"VFS: Cannot open root device Please append a correct \"root=\" boot option\这样的错误,后面配置正确scsi驱动后就OK了,关键是PCI相关的内核选项要添加进去。当然这个时候的内核就有点大了超过了600K,如果要从软件引导需要使用make bzdisk命令。

 可以看到识别到了scsi硬盘sda,也绑定了根文件系统,shell运行起来了。

问题三、使用busybox制作根文件系统

使用busybox-1.13.0制作根文件系统,通过make menuconfig进行配置,下面是需要编译进busybox的功能选项。

  General Configuration应该选的选项

   Don't use /usr

      这个选项一定要选,否则make install 后busybox将安装在原系统的/usr下,这将覆盖掉系统原有的命令。

  Build Options

   Build BusyBox as a static binary (no shared libs)

  这个选项也是一定要选择的,这样才能把busybox编译成静态链接的可执行文件,运行时才独立于其他函数库.否则必需要其他库文件才能运行,在单一个linux内核不能使它正常工作。

其它选项都是一些linux基本命令选项,自己需要哪些命令就编译进去,一般用默认的就可以了,配置好后退出并保存。我在编译的时候遇到说编译wachdog和ip工具的一些文件出错,我就将涉及到相关选项的命令都去掉了,这样就编译过去,主要是为了测试,没有用高版本的busybox去编译。

make ; make install编译并安装busybox,make install后会在busybox目录下生成一个叫_install的目录,里面有busybox和指向它的链接。

给虚拟机添加一块SCSI磁盘用fdisk分区,假设根分区为sdb1,使用mkfs.ex2在sdb1上创建ex2文件系统,然后如下操作就创建了硬盘上的文件系统(当然也可以建立一个根文件系统目录,在目录中建立好根文件系统需要的文件和文件夹,然后整个拷贝的scsi硬盘上,这样更方便维护):

#mount /dev/sdb1 /mnt       将根分区挂载到/mnt    

#cp _install/* /mnt/            将_install下的文件全复制到sdb1    

#rm -f linuxrc    

#cp -r ./examples/bootfloppy/etc /mnt       将etc下的配置文件拷到sdb1下    

#cd /mnt/    

#mkdir proc mnt usr var tmp dev sys         创建目录    

#cp -a /dev/{console,tty,tty2} dev/  

你可能感兴趣的:(linux1.0内核代码学习(六) 之内核从软盘引导,从硬盘加载根文件系统)