Linux内核开发人员如何在本地测试代码并在提交代码之后对其进行测试?他们是否使用某种单元测试,构建自动化?测试计划?
我是内核开发的新手,我想知道如何使用QEMU和gdb运行/调试linux内核.我实际上正在阅读Robert Love的书,但遗憾的是它无法帮助读者如何安装适当的工具来运行或调试内核......所以我所做的就是按照本教程http://opensourceforu.efytimes.com/2011/02/kernel-development-debugging-using-eclipse /.我正在使用eclipse作为IDE在内核上开发,但我想首先让它在QEMU/gdb下运行.所以我到目前为止所做的是:
1)用以下代码编译内核:
make defconfig (then setting the CONFIG_DEBUG_INFO=y in the .config)
make -j4
Run Code Online (Sandbox Code Playgroud)
2)编译完成后,我使用以下命令运行Qemu:
qemu-system-x86_64 -s -S /dev/zero -kernel /arch/x86/boot/bzImage
Run Code Online (Sandbox Code Playgroud)
它以"停止"状态启动内核
3)因此我必须使用gdb,我尝试以下命令:
gdb ./vmlinux
Run Code Online (Sandbox Code Playgroud)
正确运行但是...现在我不知道该怎么办...我知道我必须在端口1234(Qemu使用的默认端口)上使用远程调试,使用vmlinux作为符号表文件调试.
所以我的问题是:我应该怎样做才能在Qemu上运行内核,将调试器附加到它上面,从而使它们协同工作,使内核开发更轻松.
我需要为kgdb-gdb远程连接创建串口套接字.
就像mkfifo在系统上创建FIFO一样,我们如何创建套接字文件?
我正在尝试使用kvm vm调试Linux内核.我收到一条错误消息"远程'g'数据包回复太长".我的主机是64位,我的虚拟机也是.
我的步骤:
有人遇到过这个问题吗?
我想阅读并理解Linux内核的内存管理(特别是defrag\compaction\migration).
所以,我关闭了大小的优化.config(当然使用make menuconfig)并编译...这让我仍然是一个优化的内核.
注意:当我说优化内核时,我的意思是当我使用gdb并告诉它next它会跳转时.我不希望这样,我希望能够像一个简单的hello世界一样逐行地遵循代码.
接下来,我编辑Makefile并交换-O2,-O0这会导致事情中断.
我发现了这个,但我不知道我想要什么文件,因为我不知道兔子洞到底有多远.
我可以使用更通用的选项吗?我理解内存压缩的概念; 但是,我希望看到一切发生的地方以及它是如何发生的.
有没有更好的方法来调试Linux内核中的打印输出?
现在乱丢代码:
printk(KERN_DBG "%s:%d - %s() <message>", __FILE__, __LINE__, __FUNCTION__ );
Run Code Online (Sandbox Code Playgroud)
哪个不是很干净.
整个行应该有一种方式#ifdef:以一种不错的方式编辑.
如果我在调试大二进制文件时意外启动标签完成,gdb会冻结扫描符号表一段时间(在我的情况下最多1分钟).所以我必须等到扫描整个符号表.有没有办法在gdb中断这个过程?
使用Buildroot,我正在尝试进行自定义内核构建.在构建映像并在VirtualBox环境中引导它之后,内核在GRUB阶段之后总是会发生混乱.我看到的总结:
] CPU: 0 PID: 1 ...
] Hardware name: innotek GmbH ...
] <some registers>
] Call Trace:
] [<c0a1c995>] dump_stack+...
] [<........>] panic+...
] [<........>] do_exit+...
] ...
] Kernel Offset: 0x0 from 0xc0400000 ...
] ---[ end Kernel panic - not syncing: Attempted to kill init! ...
Run Code Online (Sandbox Code Playgroud)
现在,我假设这只是我想看到的消息的尾部,但我没有办法查看它(例如:不能Shift-PageUp).发生恐慌时,屏幕上的上述文本永远不会呈现一秒钟.
我首先偶然发现了一个KernelDebuggingTricks页面,该页面指出:
在启动时减慢内核消息
... [Build]启用了以下选项的内核:
CONFIG_BOOT_PRINTK_DELAY = Y
并使用以下内核引导参数启动计算机:
boot_delay = N
我已经确认我的内核(3.16)已经使用该CONFIG_BOOT_PRINTK_DELAY选项构建,并尝试boot_delay在我的GRUB中设置为10,500和1000毫秒.即使设置了1000毫秒的延迟(并且等待了大约5分钟),整个内核恐慌日志消息也会在眨眼间喷出.
有没有人对如何查看内核恐慌的根源有任何建议?我现在唯一想到的是手动将睡眠添加到内核代码中(这是我想要避免的).
我已经能够使用以下方法来启动基于PowerPC的系统(具体来说为MPC8544DS)来调用qemu(v1.7.0)
qemu-system-ppc -M mpc8544ds -m 512 -kernel zImage -s -nographic -initrd busyboxfs.img -append "root=/dev/ram rdinit=/bin/sh kgdboc=ttyS0,115200 kgdbwait"
Run Code Online (Sandbox Code Playgroud)
其中zImage是一个自定义的交叉编译Linux内核(v2.6.32),已启用并编译了KGDB(用于启动代码调试),并且busyboxfs.img是基于busybox的rootfs。
由于我正在使用-sQemu 的标志,因此可以使用跨gdb闯入内核,如下所示:
(gdb) target remote localhost:1234
Remote debugging using localhost:1234
mem_serial_in (p=<value optimized out>, offset=5) at drivers/serial/8250.c:405
405 }
Run Code Online (Sandbox Code Playgroud)
但是,如果我删除该-s标志并尝试闯入内核,/dev/ttyS0则会给我一个权限被拒绝的错误:
(gdb) set remotebaud 115200
(gdb) target remote /dev/ttyS0
permission denied
Run Code Online (Sandbox Code Playgroud)
是因为它被Qemu保留了吗?另外,在互联网上的示例中ttyAMA0,我已经了解了kgdboc ,该AMBA总线代表特定于基于ARM的系统的总线。我们对PowerPC有类似的东西吗?我在这里做错什么了吗?
对于某些教育项目,我需要使用user-mode-linux(UML)。
根据UML 的主页,该项目似乎在2004年停止了。但是,该项目的作者于2004年被英特尔聘用,专职从事UML。这个项目是由英特尔(或开放源代码社区)以新名称终止还是继续?
我正在从事学术项目,修改一些Kernel Networking代码并包含一个新的Kernel module.
我正在使用 QEMU 加载修改后的内核并进行测试。
但是,我发现某些系统需要完整的操作系统.img才能进行调试。
没有它可能吗?
或者,这是可以与 Kernel 2.6 系统一起使用的发行版。除了运行程序的能力(包括网络支持)之外,发行版不需要具有任何功能。