Linux设备驱动测试环境搭建

Linux设备驱动测试环境搭建

在工作过程中设置测试环境的最佳方法是什么Linux 设备驱动程序

我使用 x86_64_defconfig 从最新的 Linux 源编译了 x86 的 bzImage。

我已遵循Gentoo 自定义 initramfs 教程这样我就可以启动到基于 Busybox 的隔离文件系统。我使用与他们使用的完全相同的初始化文件。我正在做的事情和他们所做的事情之间的唯一区别是我在 Ubuntu 上运行并下载最新的 Busybox x86_64 二进制文件而不是使用 emerge。

在我的 Ubuntu 16.04 系统上,我正在运行

qemu-system-x86_64 -kernel arch/x86/boot/bzImage -append "console=ttyS0" -initrd custom-initramfs.cpio.gz -nographic

其中custom-initramfs.cpio.gz指的是我在 Gentoo 教程中构建和压缩的 initramfs。

我运行了所有这些,但仍然出现内核错误,如下所示

[    2.893799] md: Waiting for all devices to be available before autodetect
[    2.894724] md: If you don't use raid, use raid=noautodetect
[    2.913768] md: Autodetecting RAID arrays.
[    2.914465] md: Scanned 0 and added 0 devices.
[    2.914879] md: autorun ...
[    2.915478] md: ... autorun DONE.
[    2.920719] VFS: Cannot open root device "(null)" or unknown-block(0,0): error -6
[    2.921465] Please append a correct "root=" boot option; here are the available partitions:
[    2.922493] 0b00         1048575 sr0  driver: sr
[    2.923069] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
[    2.923101] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.8.0-rc1+ #18
[    2.923101] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014
[    2.923101]  0000000000000000 ffff8800070ffde0 ffffffff81328158 ffff8800066aa000
[    2.923101]  ffffffff81b98e58 ffff8800070ffe60 ffffffff81124120 0000000000000010
[    2.923101]  ffff8800070ffe70 ffff8800070ffe08 ffffffff8112441e ffff8800070ffe78
[    2.923101] Call Trace:
[    2.923101]  [<ffffffff81328158>] dump_stack+0x4d/0x65
[    2.923101]  [<ffffffff81124120>] panic+0xca/0x1fc
[    2.923101]  [<ffffffff8112441e>] ? printk+0x43/0x4b
[    2.923101]  [<ffffffff81f4a364>] mount_block_root+0x175/0x229
[    2.923101]  [<ffffffff81f4a519>] mount_root+0x101/0x10a
[    2.923101]  [<ffffffff81f4a653>] prepare_namespace+0x131/0x169
[    2.923101]  [<ffffffff81f4a03c>] kernel_init_freeable+0x1c0/0x1d5
[    2.923101]  [<ffffffff818e7669>] kernel_init+0x9/0x100
[    2.923101]  [<ffffffff818ed30f>] ret_from_fork+0x1f/0x40
[    2.923101]  [<ffffffff818e7660>] ? rest_init+0x80/0x80
[    2.923101] Kernel Offset: disabled
[    2.923101] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

不过,在本地启动且不使用 QEMU 时,我可以启动到 initramfs。这个 grub 菜单选项有效

menuentry 'linux latest' {
    linux /boot/bzImage-latest
    initrd /boot/custom-initramfs.cpio.gz
}

其中 bzImage 和 initramfs 指的是相同的默认 x86_64 配置内核映像和之前构建的自定义 initramfs。

该问题似乎源于 QEMU 没有与/dev本地计算机相同的设备访问权限。

我可以修复什么才能使其在 QEMU 环境中工作?我的目标只是能够完成内核启动并进入某种最小的文件系统。

我刚刚在工作中制作了我的第一个设备驱动程序补丁,这很令人兴奋,我想继续学习更多内容。任何帮助,将不胜感激!

答案1

这里是自学成才的内核黑客(并且仍然维护其中的一小部分)。

也许没有太多明确的答案,但我首先建议使用小型嵌入式板,例如树莓派,因为在内核开发过程中,您迟早需要使用物理硬件 - 软件模拟和虚拟机不使用与物理硬件相同的驱动程序和代码,或者当您试图弄清楚已经足够复杂的东西如何工作时,添加额外的复杂性层。

然而,在辅助嵌入式系统上工作将涉及使用交叉编译器,这也可能会导致问题。如果您确实有一个较旧的 x86 系统,那么请使用它 - 习惯从头开始设置系统,因为您迟早会厌烦它,并且这样做并不是一件坏事,因为真正的内核开发将涉及在不太稳定的系统上进行开发(打蜡/打蜡......)。

在没有任何辅助系统可供破解的情况下,双启动您的主系统并使用第二个系统进行工作 - 但请确保备份所有内容,以防万一。

哦,还有最后一个想法 - 不要使用 Ubuntu、fedora 或任何用户空间可能在更新之间发生变化的发行版 - 否则你最终会调试幽灵问题。使用 Debian、centos 或其他稳定的用户空间,至少直到您能够本能地发现此类问题。

相关内容