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

Debugging 在qemu上运行我自己的linux程序?,debugging,linux-kernel,gdb,qemu,Debugging,Linux Kernel,Gdb,Qemu,我有一台运行在Ubuntu14上的电脑,里面编译了内核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/u

我有一台运行在Ubuntu14上的电脑,里面编译了内核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打交道,所以我可能做错了事情:

我创建了磁盘img,如下所示:

  qemu-img create disk.img 512M
  mkfs.ext2 -F disk.img
关于-initrd标志,在开始时,我将路径设置为/boot/initrd.img-3.14.1+,但我在视频中看到,您应该创建这样的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
当我以我前面提到的相同方式(target remote:1234)通过gdb连接到qemu时,我按下“continue”,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.466183]VFS:在设备8:0上安装根目录(ext2文件系统)。
[0.466672]devtmpfs:安装错误-2
[0.467468]释放未使用的内核内存:1336K(ffffffff81d13000-FFFFFF81E61000)
[0.467939]写保护内核只读数据:12288k
[0.469480]释放未使用的内核内存:736K(ffff880001748000-FFFF88000180000)
[0.470727]释放未使用的内核内存:580K(ffff880001b6f000-ffff880001c00000)
[0.471195]未能执行/bin/bash(错误-2)。正在尝试默认设置。。。
[0.471615]内核死机-未同步:未找到工作初始化。尝试将init=选项传递给内核。有关指南,请参阅Linux文档/init.txt。
[0.472340]CPU:0 PID:1通信:交换程序/0未受污染3.14.1+#1
[0.472340]硬件名称:QEMU标准PC(i440FX+PIIX,1996),BIOS Bochs 01/01/2011
[0.472340]000000000000000 ffff88007cb67ec0 FFFFFFFFFF8172F63D ffffffff81a5cce0
[0.472340]ffff88007cb67f38 ffffffff8172a78d FFFFFFFF0000000 8 FFFFFF88007CB67F48
[0.472340]ffff88007cb67ee8 0000000000000000 ffff88007bd8e000 0000000000000 743
[0.472340]呼叫跟踪:
[0.472340][]转储堆栈+0x45/0x56
[0.472340][]死机+0xc8/0x1d7
[    0.472340]  [] ? rest_init+0x80/0x80
[0.472340][]内核初始化+0xee/0xf0
[0.472340][]从叉子回收+0x7c/0xb0
[    0.472340]  [] ? rest_init+0x80/0x80
[0.472340]内核偏移量:0x0自0xFFFFFF81000000(重定位范围:0xFFFFFF80000000-0xffffffff9fffffff)
这显示了几个错误


我希望你能找出我做错了什么。

等等,我们不知道你的myimage.img包含什么;显然,您需要编译“hello,world”程序并将其添加到映像的文件系统中。@nadavgam内核日志中的以下行指出了问题所在:
未能执行/bin/bash(错误-2)。正在尝试默认值…
内核死机-不同步:找不到工作初始化。尝试将init=选项传递给内核。有关指南,请参阅Linux文档/init.txt
。所以,要么您的ramdisk已损坏,要么它不包含
/bin/bash
@nadavgam,也许链接将帮助您为qemu创建工作的initramfs映像。