使用bochs运行Linux Kernel-2.4.0
2016-03-12 10:52
381 查看
上一篇博文讲了如何制作bochs硬盘镜像并且将grub装进去,这样我们可以在启动bochs后进入到grub界面。
这篇博文我们将2.4内核写入硬盘镜像,这就可以使用bochs直接启动内核了。
我的实验系统是这么部署的:CentOS 6.4 VMware虚拟机上修改代码和配置文件,用git做版本管理,同时还开着另一台虚拟机RedHat Linux 7.3,专门用来编译内核代码,毕竟2.4内核很老了,编译环境不能使用现代Linux系统,必须使用2001年左右的系统。每次在CentOS上修改完代码或配置就在RedHat上用rsync将数据同步下来,进行编译、安装、测试,这样最方便。用于开发的系统不必反复重启,用于编译的系统就是实验平台。
编译内核(这一步在RedHat上进行)
这一步在这里就不展开讲了,我对内核做了精简,不必要的选项全部关闭了,大大缩短了编译时间。其中,Block devices ---> RAM disk support
这个选项也被我关闭了,那内核启动的时候自然就不需要Initial RAM disk (initrd)了,所以待会儿更改grub.conf的时候不用配置下面这一行了。
initrd /boot/initrd-2.4.0.img
在RedHat上编译完内核后,
arch/i386/boot/bzImage这个文件就是内核核心了。如果执行
make install的话,这个文件会被复制到
/boot/vmlinuz-2.4.0。我们不需要安装这个内核,而是直接将bzImage复制到CentOS上做后续处理。
挂载硬盘镜像
紧接着上篇博文,我们将上次的hd.img继续挂载losetup -o 32256 /dev/loop0 hd.img mount -t ext3 /dev/loop0 /mnt
这两步其实可以只用mount就能一步做到
mount -t ext3 -o loop=/dev/loop0,offset=32256 hd.img /mnt
不过我更喜欢两步到位,清晰明确。
写入内核
将bzImage复制到/mnt/boot/,也就是复制到我们的硬盘镜像第一分区的boot目录内。这里顺便重命名为vmlinuz-2.4.0,看着正规一些。
cp bzImage /mnt/boot/vmlinuz-2.4.0
修改grub.conf
我们上一篇博文安装grub时,所有的相关文件都是用的宿主系统CentOS 6.4的,所以grub.conf必须要修改一下才能适合我们这个新内核。gvim /mnt/boot/grub/grub.conf
只更改启动项部分就行了,改成这样
title kernel-2.4.0 root (hd0,0) kernel /boot/vmlinuz-2.4.0 ro root=/dev/sda1
按照grub的约定,root (hd0,0)表示grub的根分区在第一块硬盘的第一分区(自0编号),注意这指的是grub被安装的分区,不是操作系统文件系统的root分区。
kernel /boot/vmlinuz-2.4.0指明内核文件是
/boot/vmlinuz-2.4.0。当然,这个路径是站在hd.img硬盘镜像的角度看的,也就是说硬盘镜像内第一分区是
/分区,该分区下有个boot目录,里面含有内核文件
vmlinuz-2.4.0。后面的
ro表示以只读的方式挂载操作系统的root分区,而
root=/dev/sda1则指明文件系统的root分区在第一硬盘的第一分区。
卸载文件系统
umount /mnt/ losetup -d /dev/loop0
bochs配置
这里开始使用刚才制作出来的hd.img可启动内核镜像,这里面包含2.4.0内核。运行
bochs命令会出现命令行菜单,选择
3. Edit options开始编辑配置,进入
12. Disk & Boot options,把
4. First HD/CD on channel 0设为hd.img,这个过程需要输入hd.img的一些参数例如柱面数、磁头数、每磁道扇区数,其他的参数保持默认即可。
然后进入
15. Boot Options,把
1. Boot drive #1: floppy改为disk。
内存可以不设置,也可以随便设置下,进入
7. Memory options->
1. Standard Options->
1. RAM size options后,将
memory size设为32,将
host memory size设为64。
返回到最开始的菜单,选择
4. Save options to...保存下配置,命名为kdebug.bxrc
再选
6. Begin simulation开始模拟。内核启动开始。
内核运行
启动内核之后,你会看到bochs开始启动内核,最后在挂载VFS时出现panicBIOS Vendor: The Bochs Project BIOS Version: Bochs BIOS Release: 01/01/2007 Starting kswapd v1.8 SCSI subsystem driver Revision: 1.00 request_module[scsi_hostadapter]: Root fs not mounted request_module[block-major-8]: Root fs not mounted VFS: Cannot open root device "sda1" or 08:01 Please append a correct "root=" boot option Kernel panic: VFS: Unable to mount root fs on 08:01
这很正常,因为我们的硬盘镜像第一分区内除了/boot目录下有点东西外其他都是空的,内核启动时啥都找不到,自然要挂掉。
过段时间等我研究内核有了进展我会再写一篇博文,讲讲如何从RedHat Linux 7.3中抽取必要的文件写入镜像,让内核能够正常进入系统,不过这一步非常麻烦,能不能实现还不好说。
本文做到这个程度已经足以调试内核了,应该能调试到文件系统初始化部分。
下一步就是Fire up DDD开始调试内核,DDD这个宇宙最强调试器深得我心,一开始看到它简陋的界面曾让我失望过,不过当我见识了它宇宙最强的调试功能——数据结构可视化之后,它就成了我永不离手的一件神兵利器。DDD就是这样,低调不露锋芒,但是当你祭出它时,天下间将没有难调的程序。
DDD——让天下没有难调的程序,就是这样。
参考资料:https://www.gnu.org/software/grub/manual/legacy/grub.html#fn-4
相关文章推荐
- Ubuntu下更改Grub的背景图片
- 开机出现:grub rescue的修复方法
- LINUX安全设置之关于GRUB加密图文教程全解
- AngularJS入门教程(零):引导程序
- AngularJS初始化过程分析(引导程序)
- [Linux学习笔记] Linux系统引导流程(二)
- Ubuntu+Windows双系统重装Windows后修复Grub引导
- 戴文的Linux内核专题:01 介绍
- 戴文的Linux内核专题:09 配置内核(5)
- 戴文的Linux内核专题:10 配置内核(6)
- 戴文的Linux内核专题:02 源代码
- 戴文的Linux内核专题:03 驱动程序
- 戴文的Linux内核专题:04 安全
- 戴文的Linux内核专题:05 配置内核 (1)
- 戴文的Linux内核专题:07 配置内核 (3)
- 戴文的Linux内核专题:08 配置内核(4)
- 戴文的Linux内核专题:11 配置内核(7)
- 戴文的Linux内核专题:13 配置内核(9)