Написание драйвера устройства "Hello World" для ядра 2.6 с использованием Eclipse
Цель
Я пытаюсь написать простой драйвер устройства на 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 для разработки драйвера (хотя я все еще не уверен, поддерживает ли он многопоточные инструменты отладки). Так что я:
- Установил Ubuntu 11.04 desktop x86 на виртуальную машину VMWare,
- Установлены
eclipse-cdt
и http://packages.ubuntu.com/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. Вот журнал для сборки:
**** Сборка конфигурации Debug для проекта TestDriver1 ****
make -C /lib/modules/2.6.38-8-generic/build M = / home / isaac / workspace / TestDriver1 all
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
Команда построить.
Итак, что-то должно быть не так с затмением Makefile
, Может быть, это ищет vmlinux
архитектура (?) или что-то в то время как текущая архитектура x86. Может это из-за VMWare?
Как я понял, eclipse
автоматически создает make-файлы, а их изменение вручную может привести к ошибкам в будущем ИЛИ сделать управление makefile
сложно.
Итак, как я могу скомпилировать этот проект на Eclipse?
4 ответа
Я почти в той же позиции, что и ты. Следуя этой инструкции, я добился успеха в сборке самого ядра и одного модуля.
Я добавил три шага (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
в текстовое поле Файл. (Примечание: для более старых ядер [до 2.6.36?], Расположениеautoconf.h
являетсяinclude/linux/autoconf.h
) - Также добавьте любые другие файлы макросов, которые вы используете.
- Нажмите на индексатор
- Поставьте галочку в поле Включить специфичные для проекта расчеты.
- Снимите флажок Исходные файлы индекса, не включенные в сборку
- Очистите файлы для индексации заранее.
- Нажмите на Пути и Символы слева.
- Откройте вкладку "Включения" и затем выберите
GNU C
- Нажмите
Add
... - Нажмите
Workspace
... затем выберите каталог включения вашего ядра - Сделайте еще один Добавить, Рабочая область и добавить
arch/architecture/include
например,arch/powerpc/include
- Нажмите на
# Symbols
табуляция - Нажмите
Add
... - Установите имя для
__KERNEL__
- Установите значение
1
и нажмите ОК - Перейдите на вкладку "Местоположение источника".
- Нажмите на поворот для вашего проекта.
- Выберите элемент "Фильтр" и нажмите "Редактировать фильтр"...
- Нажмите Add Multiple... и затем выберите все каталоги arch/* в исходном коде вашего ядра, которые не будут использоваться (т.е. все, которые не для используемой вами архитектуры)
- Нажмите OK и снова OK, чтобы закрыть это диалоговое окно.
- Нажмите кнопку ОК в диалоговом окне свойств.
- Нажмите Finish в диалоговом окне C Project.
- Щелкните правой кнопкой мыши по проекту и выберите "Индекс", затем выберите "Перестроить".
- Это займет около 20 минут или около того.
- Откройте настройки вашего проекта, перейдите к
C/C++ build -> Behaviour (tab)
- Проверить
Build (Incremental buil)
установите флажок и добавьте путь к модулю в текстовое поле (в моем случаеM=drivers/servo/dynamixel
). - Когда ваш модуль готов и вы хотите скомпилировать ядро, повторите 41 и замените
M=..
сall
,
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
Если вы хотите заняться разработкой драйверов с помощью 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, статья о 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