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


9

目标

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

我的努力

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

  1. 在VMWare虚拟机上安装了Ubuntu 11.04桌面x86
  2. 使用Synaptic软件包管理器安装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构建配置调试****

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

make:输入目录'/usr/src/linux-headers-2.6.38-8-generic'

使:***没有规则使vmlinux', needed by所有目标。停止。

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

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

因此,日食一定有问题Makefile。也许它正在寻找vmlinux架构(?)或当前架构为x86的东西。也许是因为VMWare?

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

那么,如何在Eclipse上编译该项目?

Answers:


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. 在“项目类型:”窗格中,单击“ 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...。从左上角的下拉菜单中选择Preprocessor Macros File,从右上角的下拉菜单中选择Project Path,然后输入include/generated/autoconf.hFile文本框。(注意:对于较早的内核[2.6.36之前的版本?],位置autoconf.hinclude/linux/autoconf.h
  17. 还添加您正在使用的任何其他宏文件。
  18. 单击索引器
  19. 选中启用项目特定的设置框。
  20. 取消选中未包含在构建中的索引源文件
  21. 清除“要在前面建立索引的文件”框。
  22. 单击左侧的路径和符号。
  23. 选择包括选项卡,然后选择 GNU C
  24. 点击Add...
  25. 单击Workspace...,然后选择内核的包含目录
  26. 进行另一个Add,Workspace并添加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

1

如果要使用eclipse进行驱动程序开发,则必须采用另一种方法。

您将需要赶上automake,autogen,pkg-config等,创建一个autotools项目并将其导入eclipse。eclipse-cdt应该提供此选项,否则您会错过安装“ autotools-plugin”的权限(不确定确切的名称,请从内存中写入)。

只是放弃了eclipse-cdt可以管理一个不错的Makefile的想法,不幸的是,幸运的是C不是Java。


谢谢。我将autotools尽快检查插件。您知道用于驱动程序编程的更好的IDE吗?您认为我(没有linux经验的懒惰VS用户)可以管理makefile吗?makefile在大型项目中s 是否真的可以管理?
艾萨克(Isaac)

我也是一个懒惰的VS用户,我必须承认掌握自动工具的学习曲线非常陡峭,但这非常值得,不仅对于Linux。Eclipse是周围最好的IDE之一,但是自动工具项目是如此多样,以至于没有IDE可以解析所有可能性。如果您想做正确的话,请尝试geany;如果您喜欢VS6,但要精通命令行编译,请尝试anjuta和codelite。
2011年

1

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

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

更新...

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

DKMS的本教程/快速介绍(Dell项目页面上的链接): Linux Journal文章Power Solutions论文Ottawa Linux Symposium论文

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


1

1>您可以尝试使用此命令

“ make”->“ / usr / bin / make”

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

2>在目录中存储您的问候语代码,创建文件名“ Makefile”

obj-m := NameofyourHelloWold.o 

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

PWD   := $(shell pwd)

default:
    $(MAKE) -C $(KDIR) M=$(PWD) modules
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.