【问题标题】:How to work on kernel with an embedded device?如何使用嵌入式设备处理内核?
【发布时间】:2016-02-15 16:45:31
【问题描述】:

现在,我正在使用printk 进行编译,将生成的内核复制到 U 盘,将 U 盘安装到设备上,安装包含内核的分区,从 U 盘复制新内核到分区rebooting,然后通过将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

开发应该这么痛苦吗?我不明白如何开发任何有意义的非平凡内核代码。

【问题讨论】:

  • 不,它不应该那么痛苦。首先,值得花时间从嵌入式设备获取串行端口连接回开发主机,并在其上获取控制台消息。然后你真的想找到一种方法 - tftp、一些供应商唯一的 USB 引导加载程序、像 U-Boot 这样的引导加载程序的附加组件等,以更有效地将你的新构建加载到目标上。
  • 您总是可以尝试使用像 QEMU 这样的虚拟机或模拟器(如果您的嵌入式平台存在的话)。
  • 我曾经创建了一个安装在设备上的最小工作内核,其唯一目的是通过 USB 加载新内核并执行它。加载新内核就像重新启动设备并通过 USB 加载新内核一样简单。非常容易自动化。如果你不能弄乱引导加载程序或有一个可以使用的模拟器,你可能想尝试一下。
  • 看一下u-boot的fastboot模式。这是我在日常工作中使用的。搭配adb(或只是将命令写入串行控制台)可以让您完全自动化整个刷机过程。

标签: linux debugging linux-kernel embedded


【解决方案1】:

最佳工作流程将取决于您使用的设备的功能。他们通常会有一个引导加载程序,可以选择从网络或串行端口引导。

我也在做一些嵌入式开发,这就是我想出的。我正在使用的设备有一些内置闪存,默认情况下它可以从中启动,但也有一个 USB 端口和一个 SD 卡插槽。它有一个相当原始的引导加载程序。

  • 在 USB 端口上,我连接了一个 wifi 加密狗。我确保使用所需的模块编译内核以启动并运行 USB 加密狗。

  • 我已经构建了一个最小的内核和根文件系统,我已经将其闪存到设备上。这个内核启用了CONFIG_KEXEC 选项。根文件系统有 kexec 工具。我使用buildroot 构建系统。

  • 当这个系统启动时,它会尝试挂载 SDCARD 并检查它是否可以在根目录中找到内核。如果可以,那么它使用kexec 来引导第二个内核。这是使用我编写的自定义初始化脚本完成的。

如果您的设备上没有 SD 卡插槽,您可以使用 USB 记忆棒做类似的事情。

通过这个设置,我可以使用 sftp 将一个新的内核映像传输到 sdcard 上,然后使用 kexec 来引导它。它省去了我每次更改内核时重新刷新设备的麻烦。

【讨论】:

    猜你喜欢
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2014-08-21
    • 1970-01-01
    相关资源
    最近更新 更多