目标

目标

目标

我正在尝试在 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 );

我的努力

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

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

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

问题

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

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

使-C /lib/modules/2.6.38-8-generic/build M = /home/isaac/workspace/TestDriver1全部

make:进入目录‘/usr/src/linux-headers-2.6.38-8-generic’

make:*** 没有规则来制作vmlinux', needed by全部目标。停止。

make:离开目录‘/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 上编译这个项目?

答案1

我的情况和你差不多。以下说明我已经成功构建了内核本身和单个模块。

我在主文章中添加了三个步骤(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. 在项目类型:窗格中,单击 Makefile 项目并选择空项目
  9. 在右侧,选择Linux GCC
  10. 单击Advanced settings...将弹出“属性”对话框。
  11. 在左侧选择资源,然后在文本文件编码部分中选择其他,ISO-8859-1在框中单击应用
  12. 打开C/C++ General左侧的选择。
  13. 点击Preprocessor Include Paths
  14. GNU C在语言列表中选择
  15. CDT User Setting Entries在设置条目列表中选择
  16. 单击Add...。从左上角的下拉菜单中选择预处理器宏文件,从右上角的下拉菜单中选择项目路径,然后输入include/generated/autoconf.h文件文本框。(注意:对于较旧的内核 [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. 单击添加多个...,然后选择内核源中所有不会使用的 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

答案2

如果您想使用 eclipse 进行驱动程序开发,则必须反过来做。

您需要了解 automake、autogen、pkg-config 等,创建一个 autotools 项目并将其导入 eclipse。eclipse-cdt 应该提供此功能,否则您将错过安装“autotools-plugin”(不确定确切名称,凭记忆写的)。

放弃 eclipse-cdt 可以管理一个像样的 Makefile 的想法吧,不幸的是,或者说幸运的是,C 不是 Java。

答案3

我也是 Linux 驱动程序编程的新手,我发现有一种部署内核模块(不在官方 Linux 树中)的新方法,称为 DKMS。模块将作为源代码安装,DKMS 将负责为每个内核编译它。这意味着模块的 Makefile 将手动编写,并且其源代码将不包含在自动工具中。

http://linux.dell.com/dkms/

更新...

DKMS 已移至http://en.community.dell.com/techcenter/os-applications/w/wiki/2463.linux-projects.aspx

本教程/DKMS 快速介绍(来自戴尔项目页面的链接): Linux 期刊文章电源解决方案论文渥太华 Linux 研讨会论文

DKMS 用于快速部署驱动程序。例如,在我的 Ubuntu 机器中使用 DKMS 的内核模块:

dkms status

bcmwl, 6.20.155.1+bdcom, 3.5.0-41-generic, x86_64: installed
bcmwl, 6.20.155.1+bdcom, 3.5.0-42-generic, x86_64: installed
bcmwl, 6.20.155.1+bdcom, 3.5.0-43-generic, x86_64: installed
nvidia, 313.26, 3.5.0-42-generic, x86_64: installed
nvidia, 313.26, 3.5.0-43-generic, x86_64: installed
vboxhost, 4.3.0, 3.5.0-42-generic, x86_64: installed
vboxhost, 4.3.0, 3.5.0-43-generic, x86_64: installed

这是我之前编写的代码,它可以作为 DKMS Hello World 有用。 https://github.com/sneetsher/RTD-DM5408-Driver-Port-for-Linux

答案4

1>你可以尝试这个命令

“制作”-->“/usr/bin/制作”

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

2> 在目录中存储你的 hello word 代码,创建文件名“Makefile”

obj-m := NameofyourHelloWold.o 

KDIR  := /lib/modules/2.6.38-8-generic/build

PWD   := $(shell pwd)

default:
    $(MAKE) -C $(KDIR) M=$(PWD) modules

相关内容