收录查询

[转]发布我的Linux 0.11实验室(带有gcc4下可编译的源码)

原文地址:http://www.quinnli.com/blog/archives/53

简介

我发布的这个东东主要包含一个可以在gcc 4.1下可编译的linux-0.11的修改版的源码。
当前的Linux发型版大部分已经采用gcc 4.0以上的版本和linux 2.6的内核,而赵博士
(www.oldlinux.org)提供的可以在RH9下面编译的源码只能工作于gcc版本3.x。

我在我的Debian Sid系统上对这个东东做了基本的测试,gcc 4.1是我系统的默认编译器。
任何一个比较新的Linux发型版,包括Fedora,Unbuntu等,应该都没有问题。如果你的系
统上安装的是其他版本的gcc,可以参考下面“使用其他gcc编译”小节。

如果你的Linux提供的默认编译器的仍然是gcc 3.x,或者你打算另外安装一个gcc 3.x
仅仅为了满足能编译源码的要求,你可能就用不到这个东东了。但是,除了内核源码之
外,我还提供了一整套linux-0.11的实验环境,用于在linux环境下学习并且实验linux
0.11的源代码。因为我认为要想真正的学习Linux内核的精髓,还是得老老实实在Linux环境
中进行学习。而且在Windows下面,几乎就不可能编译Linux内核的源码。

如果你真的很想在Windows平台学习Linux也没有关系。我还做了另外一个类似的东东可
以在Windows平台直接学习Linux 0.11的源码。只需要下载下面的链接并且解压到系统
的某个地方就可以用:

  http://www.quinnli.com/upload/linux-0.11-lab_060616_004102.exe

无论是Linux用户也好,Windows用户也好,如果你也是新学Linux,不太清楚怎么样
修改并且编译内核源码,然后重启进入你修改后的内核这些基本操作,可以看看我
做的一个Flash教程:

  http://www.quinnli.com/upload/linux-0.11.swf

这个东东很大部门都是直接用了www.oldlinux.org提供的资源做成的。我只是根据自己
的需求,综合了一些资源,做了个简单的定制。非常感谢赵博士共享这些资料,并且
希望我的东东能对大家有点用处。谢谢支持。

你可以访问这个链接报bug和给这个东东提一些建议。我其实也是刚学Linux内核的菜鸟。

运行前提

你的系统中需要预先安装mtools和bochs。如果你用基于Debian的发型版,可以运行:

  apt-get install bochs bochs-x mtools

如果你的系统是基于RPM的,可以试试:

  yum install bochs mtools

或者直接运行bochs和mdir这两个命令,如果都有就说明你的系统中已经安装了这两款软件。

为了编译内核源码,当然你的系统中还必须装有gcc和make等基本软件,如果是Debian,可以运行:

  apt-get install build-essentials bin86

安装

解压这个文件都可以了:

  tar xjf linux-0.11-lab_060616_005627.tar.bz2

然后在本目录下应该会出现一个名为 linux-0.11 的新目录。

工作流程

使用这个东东的工作过程很简单,首先编译内核,然后安装内核,最后在bochs中
运行内核。

假设你已经进入linux-0.11这个目录,首先运行:

  cd source/linux
  make clean
  make
  cd ../../

将在source/linux目录下生成新的内核文件Image。然后运行:

  ./mcopy_kernel source/linux/Image bootimage-new

可以将Image文件拷贝到一个装了grub的启动软盘上。这个命令将在磁盘的/boot
目录下建立bootimage-new这个文件,值得指出的是,如果用这个命令,所有的
都会被拷贝到软盘的/boot目录下。

然后你可以运行

  ./edit_menu.lst

来编辑grub的配置文件,这样启动是就可以在grub菜单中显示新内核的启动项。
配置文件语法很简单。

比如说你可以在menu.lst最后加上以下四行:

  title           Linux 0.11 compiled by gcc 4.1
  root            (fd0)
  kernel          /boot/bootimage-new
  boot

最后可以运行:

 ./linux-0.11

来启动bochs虚拟机。如果没有别的问题,你应该可以看到grub启动菜单,
这时候选择你刚刚创建的菜单项就可以进入新的内核。

另外,如果你不想在自身的Linux环境下编译源码也可以,因为你可以在虚拟机中的
linux-0.11环境中编译linux-0.11的源码。如果你决定这样做,可以看我的作的flash教程

目录结构

 source/

   linux/                  
           这个目录下有我修改的源码

   linux-0.11-040327-rh9.tar.gz
           这个是www.oldlinux.org提供的在RH9下编译的原始代码

   linux-0.11-040327-rh9.diff.gz
           这是www.oldlinux.org提供的为了能在RH9下编译提供的差异文件

   linux-0.11-060617-gcc4-diff.gz
           这是我基于rh9版本作出的修改,基本上都是为了编译通过作出的
       很简单的修改。但是有一处修改并不那么直观,可以参考我写的这篇文章

 conf/

   这个目录下有配置文件

 images/

   这个目录下包含虚拟机需要的软盘和硬盘镜像文件。硬盘镜像文件是www.oldlinux.org提供的包含完整Linux开发环境的硬盘镜像。还有一张grub启动软盘,你可以将新的内核文件拷贝到这张软盘中。

 bak/

   每次运行 ./edit_menu.lst 和 ./mcopy_kernel 都会备份当前的grub启动盘到 bak
   目录中。必要的时候可以从这个目录下恢复。

使用其他版本的gcc编译

使用其他版本的gcc来编译也是可以的,gcc-4.0应该可以编译。而且如果你
用的系统非常非常老,还在使用gcc-2.95,经过我的测试,也可以支持。

但如果你的默认版本的gcc是3.x,其实你不需要使用我修改的版本,使用最初
赵炯博士提供的rh9版本就可以。这个包里也包含了这个文件

如果你实在是想用gcc-3.3编译我的版本,也行,只不过需要首先将源码目录中的
`mm/Makefile’替换为`mm/Makefile-gcc3.x’。原始的`mm/Makefile’也有其备份
`mm/Makefile-gcc-4.1′,必要时可以恢复。一定记得覆盖,不然在编译的时候
不会出现任何问题,但是编译出来的内核镜像将无法启动。

已知问题

1. 我的内核无法挂接软盘上的rootdisk

  是的,如果你和我一样,使用当前的2.2.6版本的bochs,而且是直接把编译
  出来的Image文件做为a盘启动,就有可能出现问题。如果你肯定的确在b盘
  放入了rootimage文件的话,我也不知道为什么会这样。

  但是如果使用grub来引导信的Image文件,就完全不会出现这个问题。我的
  猜测是grub在引导Image之前对软驱做了一些必要的初始化操作,而Linux
  0.11没有做。

2. 我的内核启动是只能用软盘b做为根分区

  是的,这是默认的启动设备。你可以使用rdev命令改变一个磁盘镜像的启动
  设备(必须su到root来执行这个操作)

    rdev source/linux/Image /dev/hda1

  修改完之后使用 ./mcopy_kernel 将新的镜像复制到grub盘上。

  (令我非常惊奇的是rdev竟然可以修改linux 0.11这么古老的版本。这兼容性太好了)

3. 我的内核镜像虽然已经启动了,但是好多命令不能正确执行,总是出错说`not owner`

  是的。如果你已经改用硬盘root image,可以简单解决这个文件,首先备份一下
  /bin/sh,然后将/bin/sh0覆盖/bin/sh,重启系统之后就应该正常了。

  至于为什么,可以进一步参考一下论坛上的这篇文章

Technorati Tags: linux, 内核, kernel, 开发

posted @ 2006-09-23 13:55  ->  阅读(2334)  评论(0)    收藏  举报