linux操作系统实验四--qemu的安装和根目录系统制作

来源:互联网 发布:php csdn 编辑:程序博客网 时间:2024/05/18 22:10

安装QEMU

QEMU是一套由Fabrice Bellard所编写的以GPL许可证分发源码的模拟处理器,在GNU/Linux平台上使用广泛。Bochs,PearPC等与其类似,但不具备其许多特性,比如高速度及跨平台的特性,通过KQMEU这个开源的加速器,QEMU能模拟至接近真实电脑的速度。
我的ubuntu的版本是12.04.
1.最省事的安装模拟器的方法是:
cd ~
sudo apt-get install qemu
说明:这样安装之后qemu的版本是1.0。为了提高版本,我企图下载qemu的源代码进行自动安装。不过后面显示版本还是1.0,不知道为什么。
这里说下安装过程:
2.从http://wiki.qemu.org/Download下载Qemu 1.4.0源码,将源代码放在一个自己新建的文件夹里即可。

$ tar jxvf qemu-1.4.0.tar.bz2$ cd qemu-1.4.0

编译安装:

编译:有很多版本,老师给的pdf是:./configure --prefix=/usr/bin --target-list=i386-softmmu

网上的版本是一是:./configure --enable-debug --enable-sdl --enable-kvm --target-list=i386-softmmu

还有的是直接:./configure。

这个过程中或许出现一些错误,大部分是因为缺少相关的软件,安装需求进行安装即可,如提示:

Error: zlib check failed
Make sure to have the zlib libs and headers installed.
----------------------------------------------------------
google了一下,这个错误很容易解决:

$sudo apt-get install zlib1g-dev$sudo apt-get install libglib2.0-dev

由于对这部分知识基础为零,所以我都尝试过,最后选择了第二个版本。

安装:

$make$sudo make install

然后就可以试下了

$ qemu-system-i386 

我的机器会出现:
Could not access KVM kernel module: No such file or directory
failed to initialize KVM: No such file or directory
Back to tcg accelerator.

这是因为:QEMU是个完全独立的虚拟环境,本身可以不依赖KVM,而KVM虚拟化方案则一定要依赖QEMU。

在usr/bin目录下输入q,按tab健匹配有:

qdbus              qemu-io            qpdldecode
qemu-ga            qemu-launcher      qrttoppm
qemu-i386          qemu-nbd            quirks-handler
qemu-ifdown        qemu-system-i386    quote
qemu-ifup          qemu-system-x86_64  quote_readline
qemu-img            qemu-x86_64

上面输入的命令是:qemu-system-i386,可以建立一条软链接:

$sudo ln -s /usr/bin/qemu-system-i386 /usr/bin/qemu

以后就可以直接在任何目录下输入qemu命令了。

编译内核

这里的实验环境需要更新ubuntu的内核,之前的实验三已经更新过了,可以参考: 

Linux操作系统-Lab3 更新内核与添加系统调用

这里只需要重新编译一下,添加相应的调试信息即可。具体步骤如下:

1.首先下载最新版的内核源代码

https://www.kernel.org/pub/linux/kernel/v3.x/

下载linux-3.9.tar.gz放在自己建立的文件夹LinuxKernel里。进入LinuxKernel文件夹:

$tar zxvf  linux-3.9.tar.gz$make menuconfig

在Kernel hacking项目里面将Compile the kernel with debug info和Compile the kernel with frame pointers,两项勾选。这些项目可以让编译时添加调试信息.

然后执行:

$make -j2 bzImage

编译内核,双核的cpu是-j2,如果是4核则是-j4。

进行调试

http://wiki.qemu.org/Testing下载linux-0.2.img.bz2。
解压:
$bunzip2 linux-0.2.img.bz2
得到linux-0.2.img文件,然后将它放在linux源码的目录下。
终端执行:
$qemu -S -kernel arch/i386/boot/bzImage -hda linux-0.2.img -append "root=dev/hda" 

# -kernel 用来指定内核,注arch/x86/bzImage是不带调试信息的内核,vmlinux是带有调试信息的内核.

#-hda 指定IDE硬盘

#-append  cmdline use 'cmdline' as kernel command line

之后弹出一个小黑窗口,qemu就算起来了。

ctrl+alt+1 与 ctrl+alt+2可以切换界面,前者是屏幕输出,后者是qemu控制台

运行起来后是黑屏,我们要切换到控制台,用鼠标点击窗口,然后ctrl+alt+2,


计算机的启动过程

  1. x86 CPU启动的第一个动作CS:EIP=FFFF:0000H(换算为物理地址为000FFFF0H,因为16位CPU有20根地址线),即BIOS程序的位置。http://wenku.baidu.com/view/4e5c49eb172ded630b1cb699.html
  2. BIOS例行程序检测完硬件并完成相应的初始化之后就会寻找可引导介质,找到后把引导程序加载到指定内存区域后,就把控制权交给了引导程序。这里一般是把硬盘的第一个扇区MBR和活动分区的引导程序加载到内存(即加载BootLoader),加载完整后把控制权交给BootLoader。
  3. 引导程序BootLoader开始负责操作系统初始化,然后起动操作系统。启动操作系统时一般会指定kernel、initrd和root所在的分区和目录,比如root (hd0,0),kernel (hd0,0)/bzImage root=/dev/ram init=/bin/ash,initrd (hd0,0)/myinitrd4M.img
  4. 内核启动过程包括start_kernel之前和之后,之前全部是做初始化的汇编指令,之后开始C代码的操作系统初始化,最后执行第一个用户态进程init。
  5. 一般分两阶段启动,先是利用initrd的内存文件系统,然后切换到硬盘文件系统继续启动。initrd文件的功能主要有两个:1、提供开机必需的但kernel文件(即vmlinuz)没有提供的驱动模块(modules) 2、负责加载硬盘上的根文件系统并执行其中的/sbin/init程序进而将开机过程持续下去

制作根系统目录

1.在文件夹init中创建一个init.c文件,代码如下:
#include <stdio.h>
int main()
{
    printf("welcome,my student No is SA*****340.\n");
    return 0;
}
静态编译成一个可执行的文件。
gcc -static -o init init.c
2.还是在init文件夹里,
建立引导根目录映像
终端运行:
dd if=/dev/zero of=initrd.img bs=4096 count=1024
mkfs.ext3 initrd.img
 有提示,输入y。
3.创建rootfs目录,并挂载
mkdir rootfs
sudo mount -o loop initrd.img rootfs
4.在rootfs中添加一些文件
将init拷贝到initrd4M.img的目标根目录下(因为linux启动后期会在根目录中寻找一个应用程序来运行,在根目录下提供init是一种可选方案)
cp init rootfs/
准备dev目录:
sudo mkdir rootfs/dev
linux启动过程中会启用console设备:
sudo mknod rootfs/dev/console c 5 1
另外需要提供一个linux根设备,我们使用ram:
sudo mknod rootfs/dev/ram b 1 0
sudo umount rootfs
至此,一个包含简单应用程序的根目录initrd4M.img映像就准备好。
5.测试
用qemu测试: qemu -kernel ../LinuxKernel/linux-3.9/arch/x86/boot/bzImage -initrd initrd.img -append "root=/dev/ram init=/init",结果如下:

6.自己工作的文件夹目录视图如下:











原创粉丝点击