我有一台在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)
显示了一些错误。
我希望你能弄清楚我做错了什么。