现在,我正在使用printk
进行编译,将生成的内核复制到USB记忆棒,将USB记忆棒挂在设备上,安装包含内核的分区,复制新的内核从USB棒到分区reboot
,然后通过捕获dmesg
输出到文件来检查跟踪。
在工作站上:
make my-kernel
cp new_kernel /path/to/usb/stick
在嵌入式设备上:
mount /dev/sda1/ /mnt
mount kernelpartition /tmp/kernel
cp /mnt/new_kernel /tmp/kernel
sync
umount /tmp/kernel
umount /dev/sda1
reboot
dmesg > mytrace
less mytrace
这种痛苦应该发展吗?我不明白如何开发出任何有意义的非平凡内核代码。
答案 0 :(得分:4)
最佳工作流程取决于您使用的设备的功能。通常他们会有一个引导加载程序,可以选择从网络或串行端口启动。
我也正在做一些嵌入式开发,这就是我想出的。我正在使用的设备有一些内置闪存,默认情况下它启动,但也有一个USB端口和一个SD卡插槽。它有一个相当原始的引导程序。
在USB端口上我连接了一个wifi加密狗。我确保使用所需的模块编译内核以启动并运行USB加密狗。
我已经构建了一个最小的内核和根文件系统,我已经将其闪存到设备上。此内核启用了选项CONFIG_KEXEC
。根文件系统有kexec工具。我使用buildroot构建系统。
当此系统启动时,它会尝试挂载SDCARD并检查它是否可以在根目录中找到内核。如果可以,那么它使用kexec来启动第二个内核。这是使用我编写的自定义init脚本完成的。
如果您的设备上没有SD卡插槽,则可以使用USB记忆棒执行类似操作。
通过这种设置,我可以使用sftp将新的内核映像传输到SD卡上,并使用kexec来启动它。每次更换内核时,它都可以省去重新刷新设备的麻烦。