📄 bochs1.txt
字号:
为了配合Linux 0.11内核工作原理的学习,本章介绍了利用PC机仿真软件和在实际计算机上运行Linux 0.11系统的方法。其中包括内核的编译过程、PC仿真环境下文件的访问和复制、引导盘和根文件系统的制作方法以及Linux 0.11系统的使用方法。最后还说明了如何对内核代码作少量语法修改,使其在现有的RedHat 9系统(gcc 3.x)下能顺利通过编译。
在开始进行实验之前,首先准备好一些有用的工具软件。在Windows平台上,可以准备以下几个软件:
?Bochs 2.x开放源代码的PC机仿真软件包。
?UltraEdit超级编辑器。可用来编辑二进制文件。
?WinImageDOS格式软盘映象文件读写软件。
http://oldlinux.org/download/clk-ch14-expriment.pdf
*注意: 请下载本站最新的相关Image文件配合使用。
*注意2:请__先阅读__书本大部分章节之后再开始实验。
*独立给出的新添内容:
(1) 集成盘的制作方法:
http://www.oldlinux.org/oldlinux/viewthread.php?tid=4751
(原http://www.oldlinux.org/cgi-bin/ ... opic=238&show=0)
(2) 内核调试方法
http://www.oldlinux.org/oldlinux/viewthread.php?tid=3773
(原http://www.oldlinux.org/cgi-bin/topic.cgi?forum=4&topic=171)
(3) 从硬盘启动Linux 0.11
http://www.oldlinux.org/oldlinux/viewthread.php?tid=3828
(原http://www.oldlinux.org/cgi-bin/topic.cgi?forum=4&topic=214)
(4) 如何运行Linux 0.11系统
http://www.oldlinux.org/oldlinux/viewthread.php?tid=3878
(原http://www.oldlinux.org/cgi-bin/ ... opic=619&show=0)
(5) quinn 的 0.11实验环境(Linux和Windows),带Flash教程
http://www.oldlinux.org/oldlinux/viewthread.php?tid=3850
(原http://www.oldlinux.org/cgi-bin/ ... pic=1065&show=0)
http://www.quinnli.com/blog/
(6) 在VMware中运行Bochs磁盘映像文件的方法
http://www.oldlinux.org/oldlinux/viewthread.php?tid=4490
(原http://www.oldlinux.org/cgi-bin/ ... pic=1114&show=0)
(7) 用gdb和bochs调试内核
http://www.oldlinux.org/oldlinux/viewthread.php?tid=3809
(原http://www.oldlinux.org/cgi-bin/topic.cgi?forum=4&topic=893)
1111
图14-6 加载根文件系统到内存虚拟盘区域的流程图
14.1内核引导启动+根文件系统组成的集成盘
本节内容主要说明制作由内核引导启动映像文件和根文件系统组合成的集成盘映像文件的制作原理和方法。主要目的是了解Linux 0.11内核内存虚拟盘工作原理,并进一步理解引导盘和根文件系统盘的概念。加深对kernel/blk_drv/ramdisk.c程序运行方式的理解。在制作这个集成盘之前,我们需要首先下载或准备好以下实验软件:
http://oldlinux.org/Linux.old/bochs/linux-0.11-devel-040923.zip
http://oldlinux.org/Linux.old/images/rootimage-0.11-for-orig
linux-0.11-devel是运行在Bochs下的带开发环境的Linux 0.11系统,rootimage-0.11是1.44MB软盘映像文件中的Linux 0.11根文件系统。后缀'for-orig'是指该根文件系统适用于未经修改的Linux 0.11内核源代码编译出的内核引导启动映像文件。当然这里所说的“未经修改”是指没有对内核作过什么大的改动,因为我们还是要修改编译配置文件Makefile,以编译生成含有内存虚拟盘的内核代码来。
14.1.1集成盘制作原理
通常我们使用软盘启动Linux 0.11系统时需要两张盘(这里“盘”均指对应软盘的Image文件):一张是内核引导启动盘,一张是基本的根文件系统盘。这样必须使用两张盘才能引导启动系统来正常运行一个基本的Linux系统,并且在运行过程中根文件系统盘必须一直保持在软盘驱动器中。而我们这里描述的集成盘是指把内核引导启动盘和一个基本的根文件系统盘的内容合成制作在一张盘上。这样我们使用一张集成盘就能引导启动Linux 0.11系统到命令提示符状态。集成盘实际上就是一张含有根文件系统的内核引导盘。
为了能运行集成盘系统,该盘上的内核代码中需要开启内存虚拟盘(RAMDISK)的功能。这样集成盘上的根文件系统就能被加载到内存中的虚拟盘中,从而系统上的两个软盘驱动器就能腾出来用于加载(mount)其他文件系统盘或派其他用途。下面我们再详细介绍一下在一张1.44MB盘上制作成集成盘的原理和步骤。
14.1.1.1引导过程原理
Linux 0.11的内核在初始化时会根据编译时设置的RAMDISK选项判断在系统物理内存是否要开辟虚拟盘区域。如果没有设置RAMDISK(即其长度为0)则内核会根据ROOT_DEV所设置的根文件系统所在设备号,从软盘或硬盘上加载根文件系统,执行无虚拟盘时的一般启动过程。
如果在编译Linux 0.11内核源代码时,在其linux/Makefile配置文件中定义了RAMDISK的大小,则内核代码在引导并初始化RAMDISK区域后就会首先尝试检测启动盘上的第256磁盘块(每个磁盘块为1KB,即2个扇区)开始处是否存在一个根文件系统。检测方法是判断第257磁盘块中是否存在一个有效的文件系统超级块信息。如果有,则将该文件系统加载到RAMDISK区域中,并将其作为根文件系统使用。从而我们就可以使用一张集成了根文件系统的启动盘来引导系统到shell命令提示符状态。若启动盘上指定磁盘块位置(第256磁盘块)上没有存放一个有效的根文件系统,那么内核就会提示插入根文件系统盘。在用户按下回车键确认后,内核就把处于独立盘上的根文件系统整个地读入到内存的虚拟盘区域中去执行。这个检测和加载过程见图14-6所示。
引用 报告 回复
redgrid
版主
Member
UID 12108
精华 35
积分 6766
帖子 6938
阅读权限 100
注册 2003-9-5
来自 上海
状态 离线 #2使用道具 发表于 2004-10-20 22:19 资料 个人空间 主页 短消息 加为好友
集成盘的制作方法
图14-7 集成盘上代码结构
14.1.1.2集成盘的结构
对于Linux 0.1x内核,其代码加数据段的长度很小,大约在120KB左右。在开发Linux系统初始阶段,即使考虑到内核的扩展,Linus还是认为内核的长度不会超过256KB,因此在1.44MB的盘上可以把一个基本的根文件系统放在启动盘的第256个磁盘块开始的地方,组合形成一个集成盘片。一个添加了基本根文件系统的引导盘(即集成盘)的结构示意图见图14-7所示。其中文件系统的详细结构请参见文件系统一章中的说明。
如上所述,集成盘上根文件系统放置的位置和大小主要与内核的长度和定义的RAMDISK区域的大小有关。Linus在ramdisk.c程序中默认地定义了这个根文件系统的开始放置位置为第256磁盘块开始的地方。对于Linux 0.11内核来讲,编译产生的内核Image文件(即引导启动盘Image文件)的长度在120KB左右,因此把根文件系统放在盘的第256磁盘块开始的地方肯定没有问题,只是稍许浪费了一点磁盘空间。还剩下共有1440 - 256 = 1184 KB空间可用来存放根文件系统。当然我们也可以根据具体编译出的内核大小来调整存放根文件系统的开始磁盘块位置。例如我们可以修改ramdisk.c第75行block的值为130把存放根文件系统的开始位置往前挪动一些以腾出更多的磁盘空间供盘上的根文件系统使用。
引用 报告 回复
redgrid
版主
Member
UID 12108
精华 35
积分 6766
帖子 6938
阅读权限 100
注册 2003-9-5
来自 上海
状态 离线 #3使用道具 发表于 2004-10-20 22:19 资料 个人空间 主页 短消息 加为好友
集成盘的制作方法
14.1.2集成盘的制作过程
在不改动内核程序ramdisk.c中默认定义的根文件系统开始存放磁盘块位置的情况下,我们假设需要制作集成盘上的根文件系统的容量为1024KB(最大不超过1184KB)。制作集成盘的主要思路是首先建立一个1.44MB的空的Image盘文件,然后将新编译出的开启了RAMDISK功能的内核Image文件复制到该盘的开始处。再把定制的大小不超过1024KB的文件系统复制到该盘的第256磁盘块开始处。具体制作步骤如下所示。
14.1.2.1重新编译内核
重新编译带有RAMDISK定义的内核Image文件,假定RAMDISK区域设置为2048KB。方法如下:
在Bochs系统中运行linux-0.11-devel系统。编辑其中的/usr/src/linux/Makefile文件,修改以下设置行:
RAMDISK = -DRAMDISK = 2048
ROOT_DEV = FLOPPY
然后重新编译内核源代码生成新的内核Image文件。
make clean; make
14.1.2.2制作临时根文件系统
制作大小为1024KB的根文件系统Image文件,假定其文件名为rootram.img。制作方法如下:
(1) 利用本章前面介绍的方法制作一张大小为1024KB的空Image文件。假定该文件的名称是rootram.img。可使用在现在的Linux系统下执行下面命令生成:
dd bs=1024 if=/dev/zero of=rootram.img count=1024
(2) 在Bochs系统中运行linux-0.11-devel系统。然后在Bochs主窗口上把驱动盘分别配置成:A盘为rootimage-0.11-orign;B盘为rootram.img。
(3) 使用下面命令在rootram-0.11盘上创建大小为1024KB的空文件系统。然后使用下列命令分别把A盘和B盘加载到/mnt和/mnt1目录上。若目录/mnt1不存在,可以建立一个。
mkfs /dev/fd1 1024
mkdir /mnt1
mount /dev/fd0 /mnt
mount /dev/fd1 /mnt1
(4) 使用cp命令有选择性地复制/mnt上rootimage-0.11-orign中的文件到/mnt1目录中,在/mnt1中制作出一个根文件系统。若遇到出错信息,那么通常是容量已经超过了1024KB了。利用下面的命令或使用本章前面介绍的方法来建立根文件系统。
首先精简/mnt/中的文件,以满足容量不要超过1024KB的要求。我们可以删除一些/bin和/usr/bin下的文件来达到这个要求。关于容量可以使用df命令来查看。例如我选择保留的文件是以下一些:
[/bin]# ll
total 495
-rwx--x--x 1 root root 29700 Apr 29 20:15 mkfs
-rwx--x--x 1 root root 21508 Apr 29 20:15 mknod
-rwx--x--x 1 root root 25564 Apr 29 20:07 mount
-rwxr-xr-x 1 root root 283652 Sep 28 10:11 sh
-rwx--x--x 1 root root 25646 Apr 29 20:08 umount
-rwxr-xr-x 1 root 4096 116479 Mar 3 2004 vi
[/bin]#[/bin]# cd /usr/bin
[/usr/bin]# ll
total 364
-rwxr-xr-x 1 root root 29700 Jan 15 1992 cat
-rwxr-xr-x 1 root root 29700 Mar 4 2004 chmod
-rwxr-xr-x 1 root root 33796 Mar 4 2004 chown
-rwxr-xr-x 1 root root 37892 Mar 4 2004 cp
-rwxr-xr-x 1 root root 29700 Mar 4 2004 dd
-rwx--x--x 1 root 4096 36125 Mar 4 2004 df
-rwx--x--x 1 root root 46084 Sep 28 10:39 ls
-rwxr-xr-x 1 root root 29700 Jan 15 1992 mkdir
-rwxr-xr-x 1 root root 33796 Jan 15 1992 mv
-rwxr-xr-x 1 root root 29700 Jan 15 1992 rm
-rwxr-xr-x 1 root root 25604 Jan 15 1992 rmdir
[/usr/bin]#
然后利用下列命令复制文件。另外,可以按照自己的需要修改一下/etc/fstab和/etc/rc文件中的内容。
cd /user
for i in bin dev etc usr tmp
do
cp +recursive +verbose /$i $i
done
sync
(5) 使用umount命令卸载/dev/fd0和/dev/fd1上的文件系统,然后使用dd命令把/dev/fd1中的文件系统复制到Linux-0.11-devel系统中,建立一个名称为rootram-0.11的根文件系统Image文件:
dd bs=1024 if=/dev/fd1 of=rootram-0.11 count=1024
此时在Linux-0.11-devel系统中我们已经有了新编译出的内核Image文件/usr/src/linux/Image和一个简单的容量不超过1024KB的根文件系统映像文件rootram-0.11。
14.1.2.3建立集成盘
组合上述两个映像文件,建立集成盘。修改Bochs主窗口A盘配置,将其设置为前面准备好的1.44MB名称为bootroot-0.11的映像文件。然后执行命令:
dd bs=8192 if=/usr/src/linux/Image of=/dev/fd0
dd bs=1024 if=rootram-0.11 of=/dev/fd0 seek=256
sync;sync;sync;
其中选项bs=1024 表示定义缓冲的大小为1KB。seek=256 表示写输出文件时跳过前面的256个磁盘块。然后退出Bochs系统。此时我们在主机的当前目录下就得到了一张可以运行的集成盘映像文件bootroot-0.11
引用 报告 回复
redgrid
版主
Member
UID 12108
精华 35
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -