Chinaunix

标题: 请教使用过qemu的高手 [打印本页]

作者: dnyr    时间: 2005-06-15 16:40
标题: 请教使用过qemu的高手
请问我现在有一个操作系统的内核,内核编译后共生成4个文件,其中A是启动文件(在grub中启动点kernel=A),但是B、C、D也都是内核运行时需要用到的文件(在grub中以module的形式出现的)。请问我怎么用qemu来虚拟这个操作系统?

    我以前没有用过qemu等虚拟机软件,从网上找了一个,同时从网上找了一些教程,但是现在网上的教程都是在linux上虚拟windows,大都有以下两步:

1、用dd命令来创建一个虚拟硬盘
2、用qemu从cdrom上安装windows(或者用iso文件)
3、启动qemu

但是我现在没有安装程序,只有已经编译好的内核和原程序,而且内核二进制文件和原代码都在硬盘上,请问怎么才能使用?

是不是需要将这4个文件直接放到虚拟硬盘中?如果是的话请问怎么放啊?

能不能帮我列一个简单的操作步骤?我从网上找了相关资料,但都是在linux上安装windows的(就连在windows上安装linux的我都没有找到),谢谢

另:好象qemu manager是qemu的windows版本吧,无论在windows上或是在linux上虚拟出来都可以(网上关于windows版qemu的说明更少),谢谢
作者: st690714    时间: 2005-06-15 16:47
标题: 请教使用过qemu的高手
听说安装成功率比较低,而且速度及慢,于是放弃
作者: dnyr    时间: 2005-06-15 17:08
标题: 请教使用过qemu的高手
还行啊,我这样从没有使过的一个白板试的人物,按照网上说明的步骤,第一次安装就成功了,速度我还不知道,因为还不知道怎么用!

之所以用它是听说它有单步跟踪调试的功能,这个很不错。

顺便再问一下,有人知道它的单步跟踪调试功能怎么用吗?
作者: dzbjet    时间: 2005-06-15 21:33
标题: 请教使用过qemu的高手
why not try bochs?
support a lot of debug commands!

btw: 操作系统应该有A,引导扇区中的文件,负责把内核加载到内存中,然后跳到内核处开始执行,你得知道A最后会把内核(BCD)加载到内存中哪个地方,以及A如何读取BCD? linux中, bootsect.s -->; A setup.s -->;B 以及B存放到磁盘的那个扇区,因为A肯定在代码中使用bios中断来读取包含B的扇区。
作者: dnyr    时间: 2005-06-16 13:39
标题: 请教使用过qemu的高手
谢谢,A当然是在最后通过jmp直接跳入B的_start:程序段,在grub中按照如下方式进行配置:

kernel=A
module=B
module=C
module=D

我对grub不熟悉,但是我估计grub在启动的时候应该把A、B、C、D都加载进内存,然后先从A开始执行,A在执行到特定步骤再jmp到B。
暂时先不讨论该内核的启动过程,我还想问一下在LINUX下如何制作该操作系统的.img文件?

我下了个bochs,感觉好象比qemu的配置简单些,用bochs已经基本能够运行linux和minix,但是运行的img文件都是从网上下载的,请问我怎么把自己硬盘上的操作系统压缩成img文件?我的硬盘上的操作系统共有4个主要文件,这4个内核用到的文件都是在LINUX下编译的,然后配置GRUB后用GRUB启动可以进入这个内核,请问我怎么把这4个内核文件的运行环境做成硬盘映像 (.img)文件让bochs来引导?
作者: dzbjet    时间: 2005-06-17 09:39
标题: 请教使用过qemu的高手
假设A是引导代码,BCD是操作系统的其它代码,A最后执行jmp跳到B开始执行,不过,请不要忘记,A中必须包含有把BCD从磁盘读入内存相应地点的代码!

假设BCD,从磁盘的第二个扇区开始。把img文件最后输出到软盘,则可以:

dd if=A of=/dev/fd1 seek=0
cat C >;>; B
cat D >;>; B
dd if=A of=/dev/fd1 seek=1

这样A就在引导扇区,BCD从第2扇区开始了。
作者: dnyr    时间: 2005-06-17 11:47
标题: 请教使用过qemu的高手
非常感谢,我基本明白了,我还想再问一下,

dd if=A of=/dev/fd1 seek=0
cat C >;>; B
cat D >;>; B
dd if=A of=/dev/fd1 seek=1

的最后一个命令是不是应该写成
dd if=B of=/dev/fd1 seek=1

?要不然B怎么考到fd1中?
还有执行了cat C(D) >;>; B 之后,是不是就不用将C、D考到fd1中了?

还有如果我不放在软盘中,而是放在x.img中的话,是不是执行了
mount -oloop x.img /usr/root/x 之后,就可以用dd if=A of=/dev/x seek=0 来把A考到x.img的启动扇区中?这样的x.img是不是就可以用来启动了?






原帖由 "dzbjet" 发表:
假设A是引导代码,BCD是操作系统的其它代码,A最后执行jmp跳到B开始执行,不过,请不要忘记,A中必须包含有把BCD从磁盘读入内存相应地点的代码!

假设BCD,从磁盘的第二个扇区开始。把img文件最后输出到软盘,则?.........

作者: dzbjet    时间: 2005-06-17 22:34
标题: 请教使用过qemu的高手
汗~~

对,我打错了,应该是:
dd if=B of=/dev/fd1 seek=1

另外:
try:

losetup /dev/loop1 x.img
dd if=A of=/dev/loop1 seek=0

enjoy~~~
作者: dnyr    时间: 2005-06-20 14:42
标题: 请教使用过qemu的高手
非常感谢您的回复,以下是我实际操作的结果:

   A = kickstart
   B = ia32-kernel
   C = pingpong
   D = sigma0

因为该内核符合Multiboot规范,所以在grub的menu.lst中有如下配置:

   kernel  = kickstart
   module = ia32-kernel
   module = pingpong
   module = sigma0

所以我猜测(我对操作系统是“只通一窍”,对grub是“一窍不通”):
ia32-kernel不是由kickstart来读取的,而是由grub来读取的,不知道对不对。

创建img文件的步骤如下:

1     dd of=/root/x.img bs=1024 seek=50000 count=0
2        losetup /dev/loop2  /root/x.img
3       cat pingpong >;>; ia32-kernel
4       cat sigma0   >;>; ia32-kernel
5       dd if=kickstart  of=/dev/loop2 seek=0
6       dd if=i32-kernel of=/dev/loop2 seek=1
7       losetup -d /dev/loop2

然后用bochs来引导这个img文件,但是“事情总是向着不好的方向发展”(这好象是一个非常有名的话,是谁说的来着?忘了!)

bochs引导后只是一闪然后就退出了
错误的日志中有如下描述:

......
......(以上省略)
00000730599i[BIOS ] ata0-0: PCHS=10/16/63 translation=none LCHS=10/16/63
00000779199e[HD   ] device set to 1 which does not exist
00000806193i[BIOS ] Boot from Hard Disk 0 failed
00000827969p[BIOS ] >;>ANIC<< Not a bootable disk
00000827969i[SYS  ] Last time is 1119239493
00000827969i[CPU0 ] real mode
00000827969i[CPU0 ] CS.d_b = 16 bit
00000827969i[CPU0 ] SS.d_b = 16 bit
00000827969i[CPU0 ] | EAX=0000040a  EBX=0000d730  ECX=000b0001  EDX=00000402
00000827969i[CPU0 ] | ESP=0000ffa6  EBP=0000ffaa  ESI=0000733d  EDI=00000003
00000827969i[CPU0 ] | IOPL=0 NV UP DI PL ZR NA PE NC
00000827969i[CPU0 ] | SEG selector     base    limit G D
00000827969i[CPU0 ] | SEG sltr(index|ti|rpl)     base    limit G D
00000827969i[CPU0 ] |  CS:f000( 0000| 0|  0) 000f0000 0000ffff 0 0
00000827969i[CPU0 ] |  DS:0000( 0000| 0|  0) 00000000 0000ffff 0 0
00000827969i[CPU0 ] |  SS:0000( 0000| 0|  0) 00000000 0000ffff 0 0
00000827969i[CPU0 ] |  ES:07c0( 0000| 0|  0) 00007c00 0000ffff 0 0
00000827969i[CPU0 ] |  FS:0000( 0000| 0|  0) 00000000 0000ffff 0 0
00000827969i[CPU0 ] |  GS:0000( 0000| 0|  0) 00000000 0000ffff 0 0
00000827969i[CPU0 ] | EIP=00000508 (00000507)
00000827969i[CPU0 ] | CR0=0x00000010 CR1=0 CR2=0x00000000
00000827969i[CPU0 ] | CR3=0x00000000 CR4=0x00000000
00000827969i[     ] restoring default signal behavior
00000827969i[CTRL ] quit_sim called with exit code 1
(结束)

这个提示的3、4、5行清清楚楚的写着从硬盘(应该就是img文件的映象磁盘)的0磁道引导失败,我真的很郁闷,是不是0磁道不应该放kickstart啊?

实在不明白错在哪里了,是不是我应该在0磁道放grub啊?
作者: dzbjet    时间: 2005-06-20 15:19
标题: 请教使用过qemu的高手
你的x.img文件的引导扇区没有0xaa55标志,所以启动时,系统认为不是启动盘~~~
作者: dzbjet    时间: 2005-06-20 15:19
标题: 请教使用过qemu的高手
看看你的kiskstart是512字节吗? 最后一个word是不是0xaa55?
作者: dnyr    时间: 2005-06-20 16:37
标题: 请教使用过qemu的高手
谢谢您的提醒,我想kickstart并不是那个应该放在0磁道的程序,它的大小是122kb,开头和结尾都没有“0xaa55”,我越来越觉得应该把grub也打在img文件中了,呵呵。

   从kickstart的源码中可以看出来kickstart从grub中接收了一些参数,我猜可能是这样的:
    grub按照menu.lst中的配置先把各个程序的起始地址保存起来然后把这个地址传递给了kickstart (或者是kickstart通过寄存器主动接收的,kickstart 是grub第一个调用的程序),然后kickstart通过grub传递过来的地址来引导i586-kernel。

请问,“0xaa55”是做什么用的,有什么含义吗?除了这个还有什么需要注意的吗?

我在windows下用winimage创建了一个1.img,然后用uedit32把1.img开头的winimage的特殊说明删除,这样开头就是“55 aa .. ..”,然后用bochs引导的结果还是一样的,错误提示和上面一模一样啊?

如果在LINUX下怎么才能生成一个开头是“55 aa .. .. .. .. ”的img文件呢?


另:

如果方便的话,您能不能在空闲的时间里帮我试试怎么才能做出这个img文件?非常感谢!

我是从这个连接下载的内核二进制文件
http://www.l4ka.org/download/pistachio/pistachio-ia32-0.4.tar.bz2

其中i586-kernel、kickstart、pingpong、sigma0是4个主要文件

在LINUX2.4中将grub的menu.lst按照下面样子配置就能够启动了

(操作系统名字)
kernel  =kickstart
module=i586-kernel
module=sigma0
module=pingpong

其中i586-kernel才是真正的内核程序,kickstart只是做一些初始化然后最后跳入i586-kernel中执行,这个内核启动后只有一些选项。

我现在需要把它们放进一个img文件中用bochs来启动它

再次谢谢了!

[quote]原帖由 "dzbjet"]你的x.img文件的引导扇区没有0xaa55标志,所以启动时,系统认为不是启动盘~~~[/quote 发表:

作者: dzbjet    时间: 2005-06-20 20:19
标题: 请教使用过qemu的高手
0xaa55应该在引导扇区的第510字节的位置。

至于如何把0xaa55写入,我看不用,因为grub应该是放在引导扇区中的,否则怎么会执行grub,或者说引导扇区的代码把grub读入内存,然后执行grub程序,所以你就不用在弄引导扇区的代码了。

你猜得差不多,kickstart应该是干这个用的,它应该从grub接收参数,得知要把kernel读到内存的哪个地方,然后就会跳到那个地方来执行kernel的程序。
作者: dnyr    时间: 2005-06-24 09:55
标题: 请教使用过qemu的高手
您好:

我从网上找了一个镜象的地址,这个镜象确实可以在BOCHS中使用。
http://www.l4ka.org/download/pistachio/pistachio-ia32-0.4-demodisk.bin.bz2
我想如果以后再遇到这种情况总不能老是从网上找相应的镜象吧,所以我很象自己制作出一个能够引导的img文件。

我看了一下这个镜象,里面确实包含了GRUB,和其他几个主要文件,所以我也制作了一个IMG文件,执行以下步骤:

1、(dd命令创建镜象文件,假定为x.img)
2、(用losetup命令将x.img与/dev/loop2挂上)
3、(用mkfs把/dev/loop2格式化成vfat)
4、(mount /dev/loop2 到/mnt)
5、(把grub拷贝到/mnt中,在这里我想应该拷贝到一个固定的地点,但是我基础不好,实在不知道应该从x.img的哪一点开始拷贝,根据您上面的提示,我认为grub应该是在引导扇区的,引导扇区是不是就是0磁道,但是经过mkfs命令之后,文件的最开始的位置是fat格式的一些描述,如果把grub放在那里会不会破坏fat格式的描述?)
6、(然后考虑到grub是在启动的时候会自动查找kernel和module的文件存放位置,所以kickstart和i32-kernel和simga0和pingpong就不需要拷贝到固定的位置了,只要把它们拷贝进/mnt就行)

我这么做了,但是不能用bochs启动,用uedit32比较的时候,两个文件的差别很大,我想最大的错误就是grub保存的起使位置,我该怎么来确定grub的起使位置啊?

从那个正确的镜象上看,是从第40个字节开始的,但是两个文件中grub数据的保存地址是不一样的,难道文件拷贝操作不是连续向文件中写入数据的吗?(比如从A拷贝一个1K的文件到B,假设B里面拷贝之前什么也没有,是空文件,难道这1K的数据不是保存在B中连续的一段空间中吗?)

或者是那个正确的镜象文件用grub做了什么其他的操作?(比如说用执行grub命令并附加某些参数,由grub自己象磁盘中的固定位置写入一些数据来告诉磁盘“启动的时候用我来启动”?),如果是这样的话,是什么命令啊?
作者: dnyr    时间: 2005-06-25 00:50
标题: 请教使用过qemu的高手
顶一下
作者: dnyr    时间: 2005-06-27 09:13
标题: 请教使用过qemu的高手
这个版块刷新太快了,再顶一下




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2