qemu实验一X86test

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaozi0221/article/details/89356814

编译内核
#  建一个目录
$  mkdir build
$ wget https://cdn.kernel.org/pub/linux/kernel/v3.x/linux-3.10.104.tar.xz

解压

$ tar xvf linux-3.10.104.tar.xz
$ cd linux-3.10.104
$ make menuconfig
$ make -j4

ls -la linux-3.10.104/arch/x86_64/boot/bzImage

lrwxrwxrwx 1 seijia seijia 22 12月 17 23:52 linux-3.10.104/arch/x86_64/boot/bzImage -> …/…/x86/boot/bzImage
$ cp linux-3.10.104/arch/x86_64/boot/bzImage …
# 安装qemu,可以自己去下源码安装,我比较懒直接用apt-get安装了
$ sudo apt-get install qemu

制作initrd
/hello.c/
#include <stdio.h>

void main()
{
printf(“Hello World\n”);
printf(“Hello World\n”);
printf(“Hello World\n”);
  /强制刷新输出,不然可能打印不出来/
fflush(stdout);
while(1);
}

initrd吧,全称是initial ramdisk,在内核启动的时候会先去加载的一种文件系统.

$ cd …

使用静态编译链接.

$ gcc -static -o helloworld hello.c

将helloworld制作成cpio

$ echo helloworld | cpio -o --format=newc > rootfs
1776 blocks
$ ls -la rootfs
-rw-rw-r-- 1 seijia seijia 909312 12月 21 13:15 rootfs
# 使用qemu进行启动
$ qemu-system-x86_64
-kernel ./bzImage
-initrd ./rootfs
-append “root=/dev/ram rdinit=/helloworld”

qemu的-kernel 和-initrd能够绕过bootload直接对指定的kernel和ramdisk进行加载.用-append进行额外的选项配置,在这里我们把根目录直接设置成内存,启动的init程序设置成放进去的helloworld.

最后结果,因为while(1),启动会一直停在这里.
当然只有helloworld我们是什么都做不了的.这时候就需要busybox了,用它启动之后就能使用绝大多数的linux命令了.

当 QEMU 调试时出现 VNC server running on`127.0.0.1:5900’ 时,需要安装 libsdl 开发库,然后再重新编译安装 QEMU。在 Debian lenny 下:
sudo apt-get install libsdl1.2-dev

猜你喜欢

转载自blog.csdn.net/xiaozi0221/article/details/89356814