目标
我正在尝试在 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用于开发驱动程序(虽然我仍然不确定它是否支持多线程调试工具)。所以我:
- 已安装Ubuntu 11.04 桌面 x86在 VMWare 虚拟机上,
- 安装
eclipse-cdt
和linux-headers-2.6.38-8使用 Synaptic 包管理器, - 创建一个
C Project
名为TestDriver1
并将上述代码复制粘贴到其中, - 将默认构建命令更改
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 编译特定的驱动程序,而不是整个内核。
- 下载并安装 Eclipse 和 CDT。
- 配置并构建内核以定义
CONFIG_*
和生成autoconf.h
。这可以在下载和安装 Eclipse 之前或之后完成。 - 确保您拥有正确的内核源代码(例如,确保您位于正确的 git 分支上)。如果您稍后签出另一个分支,那没问题,但您需要重新索引源代码,这大约需要 20 分钟。
- 启动 Eclipse。
- 点击
File
->New
->C Project
- 填写项目名称,例如
my_kernel
- 取消选中使用默认位置框并在位置框中输入内核的根目录。
- 在项目类型:窗格中,单击 Makefile 项目并选择空项目
- 在右侧,选择
Linux GCC
- 单击
Advanced settings
...将弹出“属性”对话框。 - 在左侧选择资源,然后在文本文件编码部分中选择其他,
ISO-8859-1
在框中单击应用 - 打开
C/C++ General
左侧的选择。 - 点击
Preprocessor Include Paths
GNU C
在语言列表中选择CDT User Setting Entries
在设置条目列表中选择- 单击
Add
...。从左上角的下拉菜单中选择预处理器宏文件,从右上角的下拉菜单中选择项目路径,然后输入include/generated/autoconf.h
文件文本框。(注意:对于较旧的内核 [pre-2.6.36?],位置autoconf.h
为include/linux/autoconf.h
) - 还添加您正在使用的任何其他宏文件。
- 单击索引器
- 勾选启用项目特定设置框。
- 取消选中构建中未包含的索引源文件
- 清除要预先索引的文件框。
- 单击左侧的路径和符号。
- 选择“包括”选项卡,然后选择
GNU C
- 点击
Add
... - 单击
Workspace
...然后选择内核的包含目录 - 再做一次添加,工作区并添加
arch/architecture/include
,例如,arch/powerpc/include
- 点击
# Symbols
选项卡 - 点击
Add
... - 将名称设置为
__KERNEL__
- 将值设置为
1
并单击“确定” - 单击源位置选项卡
- 单击您的项目的曲折。
- 选择过滤器项并单击编辑过滤器...
- 单击添加多个...,然后选择内核源中所有不会使用的 arch/* 目录(即所有不适用于您正在使用的体系结构的目录)
- 单击“确定”,然后再次单击“确定”以关闭该对话框。
- 在“属性”对话框中单击“确定”。
- 在 C 项目对话框中单击完成。
- 右键单击项目并选择索引,然后选择重建
- 大约需要20分钟左右才能完成。
- 打开项目设置,转到
C/C++ build -> Behaviour (tab)
- 选中
Build (Incremental buil)
复选框并将模块路径添加到文本框(在我的情况下M=drivers/servo/dynamixel
)。 - 当你的模块准备好并且你想要编译内核时,重复 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 将手动编写,并且其源代码将不包含在自动工具中。
更新...
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