使用 Eclipse 为内核 2.6 编写“Hello World”设备驱动程序

Isa*_*aac 9 build makefile eclipse-cdt drivers

目标

我正在尝试在 Ubuntu 上编写一个简单的设备驱动程序。我想使用 Eclipse(或适合驱动程序编程的更好的 IDE)来做到这一点。这是代码:

#include <linux/module.h>

static int __init hello_world( void )
{
  printk( "hello world!\n" );
  return 0;
}

static void __exit goodbye_world( void )
{
  printk( "goodbye world!\n" );
}

module_init( hello_world );
module_exit( goodbye_world );
Run Code Online (Sandbox Code Playgroud)

我的努力

经过一番研究,我决定使用Eclipse CTD来开发驱动程序(虽然我仍然不确定它是否支持多线程调试工具)。所以我:

  1. 在 VMWare 虚拟机上安装Ubuntu 11.04 桌面 x86
  2. 使用 Synaptic Package Manager安装eclipse-cdtlinux-headers-2.6.38-8
  3. 创建了一个C Project命名TestDriver1并复制粘贴到上面的代码,
  4. 将默认构建命令 , 更改为make以下自定义构建命令:

make -C /lib/modules/2.6.38-8-generic/build M=/home/isaac/workspace/TestDriver1

问题

当我尝试使用 eclipse 构建此项目时出现错误。这是构建的日志:

**** 为项目 TestDriver1 构建配置调试 ****

make -C /lib/modules/2.6.38-8-generic/build M=/home/isaac/workspace/TestDriver1 all

制作:进入目录'/usr/src/linux-headers-2.6.38-8-generic'

make: *** 没有规则可以使目标vmlinux', needed by 全部'。停止。

制作:离开目录'/usr/src/linux-headers-2.6.38-8-generic'

有趣的是,当我使用shell而不是eclipse构建这个项目时,我没有得到任何错误。要使用shell,我只需创建一个Makefile包含obj-m += TestDriver1.o并使用上面的make命令来构建。

所以, eclipse 一定有问题Makefile。也许它正在寻找vmlinux架构(?)或其他东西,而当前架构是 x86。也许是因为VMWare?

据我了解,eclipse自动创建 makefile 并手动修改它会在将来导致错误或使管理makefile变得困难。

那么,如何在 eclipse 上编译这个项目呢?

sor*_*h-r 5

我和你的情况几乎一样。按照这个指令,我已经成功地构建了内核本身和单个模块。

我在主要文章中添加了三个步骤(40~42),使 Eclipse 编译特定的驱动程序,而不是整个内核。

  1. 下载并安装 Eclipse 和 CDT。
  2. 配置和构建您的内核以定义CONFIG_*和生成autoconf.h. 这可以在下载和安装 Eclipse 之前或之后完成。
  3. 确保您拥有正确的内核源代码(例如,确保您在正确的 git 分支上)。如果您稍后检查另一个分支,那没关系,但是您需要重新索引源,这大约需要 20 分钟。
  4. 启动 Eclipse。
  5. 点击File-> New->C Project
  6. 填写项目名称,如 my_kernel
  7. 取消选中使用默认位置框,然后在位置框中键入内核的根目录。
  8. 在 Project type: 窗格中,单击 Makefile 项目并选择 Empty Project
  9. 在右侧,选择 Linux GCC
  10. 单击Advanced settings... 会弹出一个属性对话框。
  11. 选择左侧的 Resource,然后在 Text file encoding 部分,选择 Other 并ISO-8859-1在框中,然后单击 Apply
  12. 打开C/C++ General左侧的选择。
  13. 点击 Preprocessor Include Paths
  14. GNU C在语言列表中选择
  15. CDT User Setting Entries在设置条目列表中选择
  16. 单击Add.... 从左上角的下拉菜单中选择 Preprocessor Macros File,从右上角的下拉菜单中选择 Project Path,然后进入include/generated/autoconf.hFile 文本框。(注意:对于较旧的内核 [pre-2.6.36?],位置autoconf.hinclude/linux/autoconf.h
  17. 还要添加您正在使用的任何其他宏文件。
  18. 单击索引器
  19. 选中启用项目特定设置框。
  20. 取消选中未包含在构建中的索引源文件
  21. 清除要预先编制索引的文件框。
  22. 单击左侧的路径和符号。
  23. 选择包括选项卡,然后选择 GNU C
  24. 点击Add...
  25. 单击Workspace... 然后选择内核的包含目录
  26. 做另一个添加,工作区和添加arch/architecture/include,例如,arch/powerpc/include
  27. 单击# Symbols选项卡
  28. 点击Add...
  29. 将名称设置为 __KERNEL__
  30. 将值设置为1并单击确定
  31. 单击源位置选项卡
  32. 单击项目的曲折。
  33. 选择过滤器项,然后单击编辑过滤器...
  34. 单击 Add Multiple... 然后选择您的内核源代码中所有不会使用的 arch/* 目录(即所有不用于您正在使用的架构的目录)
  35. 再次单击“确定”和“确定”以关闭该对话框。
  36. 单击“属性”对话框上的“确定”。
  37. 单击“C 项目”对话框上的“完成”。
  38. 右键单击项目并选择索引,然后选择重建
  39. 大约需要 20 分钟左右才能完成。
  40. 打开您的项目设置,转到 C/C++ build -> Behaviour (tab)
  41. 选中Build (Incremental buil)复选框并将您的模块路径添加到文本框(在我的情况下M=drivers/servo/dynamixel)。
  42. 当您准备好模块并且想要编译内核时,重复 41 并替换M=..all.