Я пытаюсь написать простой драйвер устройства в 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 для разработки драйвера (хотя я все еще не уверен, если он поддерживает многопоточные инструменты отладки). Итак, я:
eclipse-cdt
и linux-headers-2.6.38 -8 с помощью Synaptic Package Manager, C Project
с именем TestDriver1
и скопировал в него указанный выше код, 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 все
make: вход в каталог '/usr/src/linux-headers-2.6.38-8-generic'
make: *** Нет правила, чтобы сделать цель
vmlinux', needed by
all '. Стоп.make: Leaving directory '/usr/src/linux-headers-2.6.38-8-generic'
blockquote>Интересно, что я не получаю ошибку, когда использую
shell
вместо [ 118], чтобы построить этот проект. Чтобы использоватьshell
, я просто создаюMakefile
, содержащийobj-m += TestDriver1.o
, и использую командуmake
выше для сборки.Итак, что-то должно быть не так с затмением
Makefile
. Может быть, он ищет архитектуруvmlinux
(?) Или что-то еще, в то время как текущая архитектура - x86. Может быть, это из-за VMWare?Как я понял,
eclipse
автоматически создает make-файлы, а изменение его вручную приведет к ошибкам в будущем ИЛИ затруднит управлениеmakefile
.Итак, как я могу скомпилировать этот проект на Eclipse?
Если вы хотите заняться разработкой драйверов с помощью eclipse, вам придется делать это наоборот.
Вам нужно будет разобраться с automake, autogen, pkg-config и так далее, создать проект autotools и импортировать его в eclipse. Eclipse-cdt должен предложить это, в противном случае вы пропустили установку 'autotools-plugin' (не уверены в точном имени, записывая это по памяти).
Просто откажитесь от идеи, что eclipse-cdt может управлять приличным Makefile, C не является Java, к сожалению или к счастью.
Я тоже новичок в программировании драйверов Linux, я обнаружил, что появился новый способ развертывания модулей ядра (которых нет в официальном дереве Linux), называемый DKMS. Модуль будет установлен как исходный код, и DKMS позаботится о его компиляции для каждого ядра. Это означает, что Makefile для модуля будет написан вручную, а его источник не будет включен для автоинструментов.
обновлено ...
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 используется для быстрого развертывания драйвера. Например, модули ядра, использующие DKMS на моем компьютере с Ubuntu:
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 [+1113]
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
Я добавил три шага (40 ~ 42) в основную статью, чтобы Eclipse компилировал определенный драйвер, а не целое ядро.
CONFIG_*
и сгенерировать autoconf.h
. Это можно сделать до или после загрузки и установки Eclipse. File
-> New
-> C Project
my_kernel
Linux GCC
Advanced settings
... и откройте диалоговое окно «Свойства». появится. C/C++ General
слева. Preprocessor Include Paths
GNU C
в списке языков CDT User Setting Entries
в списке настроек Add
.. .. Выберите Файл макроса препроцессора в верхнем левом раскрывающемся меню, Путь к проекту в верхнем правом раскрывающемся списке и введите include/generated/autoconf.h
в текстовое поле Файл. (Примечание: для более старых ядер [до 2.6.36?] Расположение autoconf.h
равно include/linux/autoconf.h
) GNU C
Add
... Workspace
... затем выберите каталог включения вашего ядра arch/architecture/include
, например, arch/powerpc/include
# Symbols
Add
... __KERNEL__
1
и нажмите «ОК». C/C++ build -> Behaviour (tab)
Build (Incremental buil)
и добавьте путь к модулю в текстовое поле (в моем случае M=drivers/servo/dynamixel
). M=..
на all
.