在qemu上运行的linux上运行我自己的程序?

时间:2016-01-04 10:46:14

标签: debugging linux-kernel gdb qemu

我有一台在Ubuntu 14上运行的PC和在其中编译的内核3.14。 我在其上安装了 qemu ,并使用shell中的以下命令激活它:

qemu-system-x86_64 -kernel /home/user/linux-3.14.1/arch/x86/boot/bzImage -initrd /boot/initrd.img-3.14.1+  -m 2048M --append "console=ttyS0 root=/dev/sda1 rw init=/bin/bash" -hda /home/user/qemu-file-img/myimage.img --enable-kvm -smp 4 -serial stdio -vga none -net none -s -S

然后从另一个shell运行gdb并执行以下命令:

file vmlinux
targert remote :1234

现在我可以打破内核的任何功能,这很棒。

我的问题虽然是,如何运行我的自己的程序,然后看看内核中发生了什么?现在它只是内核运行自己的进程,我自己写的没什么。只是为了说明我的观点 - 我想运行一个简单的“Hello world”C程序,运行它,看看内核运行时会发生什么。

感谢您的帮助。

好的,我会详细说明..

这是我第一次创建新的文件系统img ..并处理qemu所以我可能做错了:

我创建了 disk img ,如下所示:

  qemu-img create disk.img 512M
  mkfs.ext2 -F disk.img

关于 -initrd 标志,在开头我将路径设置为 /boot/initrd.img-3.14.1 + ,但是我在{{{ 3}}你应该创建像这样的initramfs的视频:

./gen_init_cpio input | gzip >initramfs.img

其中输入文件具有以下结构:

dir /dev 0755 0 0
nod /dev/console 0600 0 0 c 5 1
dir /root 0700 0 0
dir /sbin 0755 0 0
file /sbin/kinit /usr/src/klibc/kinit/kinit 0755 0 0

我了解到,通过initramfs,您可以使用在编译内核上运行的qemu“共享”您的主机文件。

但是,我真的不确定我在做什么。 最后,那是我跑的命令:

sudo qemu-system-x86_64 -kernel /home/user/linux-3.14.1/arch/x86/boot/bzImage -initrd /home/user/linux-3.14.1/usr/initramfs.img  -m 2048M --append 'console=ttyS0 root=/dev/sda rw init=/bin/bash' -hda /home/user/img_file_to_qemu2/disk.img --enable-kvm -smp 4 -serial stdio -vga none -net -s -S

当我通过gdb以与前面提到的相同的方式连接到qemu时(目标远程:1234),我按下了“继续”,qemu开始运行内核并最终显示:

0.466183] VFS: Mounted root (ext2 filesystem) on device 8:0.
[    0.466672] devtmpfs: error mounting -2
[    0.467468] Freeing unused kernel memory: 1336K (ffffffff81d13000 - ffffffff81e61000)
[    0.467939] Write protecting the kernel read-only data: 12288k
[    0.469480] Freeing unused kernel memory: 736K (ffff880001748000 - ffff880001800000)
[    0.470727] Freeing unused kernel memory: 580K (ffff880001b6f000 - ffff880001c00000)
[    0.471195] Failed to execute /bin/bash (error -2).  Attempting defaults...
[    0.471615] Kernel panic - not syncing: No working init found.  Try passing init= option to kernel. See Linux Documentation/init.txt for guidance.
[    0.472340] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 3.14.1+ #1
[    0.472340] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Bochs 01/01/2011
[    0.472340]  0000000000000000 ffff88007cb67ec0 ffffffff8172f63d ffffffff81a5cce0
[    0.472340]  ffff88007cb67f38 ffffffff8172a78d ffffffff00000008 ffff88007cb67f48
[    0.472340]  ffff88007cb67ee8 0000000000000000 ffff88007bd8e000 0000000000000743
[    0.472340] Call Trace:
[    0.472340]  [<ffffffff8172f63d>] dump_stack+0x45/0x56
[    0.472340]  [<ffffffff8172a78d>] panic+0xc8/0x1d7
[    0.472340]  [<ffffffff8171f620>] ? rest_init+0x80/0x80
[    0.472340]  [<ffffffff8171f70e>] kernel_init+0xee/0xf0
[    0.472340]  [<ffffffff8174083c>] ret_from_fork+0x7c/0xb0
[    0.472340]  [<ffffffff8171f620>] ? rest_init+0x80/0x80
[    0.472340] Kernel Offset: 0x0 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffff9fffffff)

显示了一些错误。

我希望你能弄清楚我做错了什么。

0 个答案:

没有答案