Ник:
Пароль:

Контакты

Телеграм: t.me/starterkit_ru
тел.: (+7 3412) 478-448
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
E-mail: info@starterkit.ru
Партнеры:
otladka.com.ua - г.Киев

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:2
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:6
Форум » starterkit.ru » Embedded Linux
Компиляция модуля ядра для G45
titan83
Добавлено 20.01.2013 18:45
0
Сообщение: 1
titan83
3

Пункты: 3141
Регистрация: 16.12.2012
Здравствуйте. Целый день провозился с попыткой загрузить свой модуль в ядро. На обычном линуксе все компилируется и работает в ядре.
Процессор 9g45. Проблема в том, что собирается модуль с архитектурой хост машины, а я не могу разобраться в том, как подсунуть заголовки нужного мне (2.6.36) ядра, чувствую, что надо копать в сторону Makefile, но опыта не хватает.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 20.01.2013 20:07 Сообщение: 2
sasamy
4.77

Пункты: 65188
Регистрация: 14.08.2009
можете взять в качестве примера тут
http://sasamy.narod.ru/tstdrv.tar.gz
Спуститься к концу Подняться к началу
Персональная информация
titan83
Добавлено 21.01.2013 15:32 Сообщение: 3
titan83
3

Пункты: 3141
Регистрация: 16.12.2012
спасибо, у меня в принципе такой makefile.
но пока скомпилировать не получается. проблема, как я понимаю, в том, что компилятор берет файлы для архитектуры х86. Пробовал выставлять переменную среды CC=arm-unknown-linux-gnueabi-gcc, пробовал make ARCH=arm, но увы, одиночные файлы компилируются нормально, а вот со сборкой пока не выходит. что еще можно предпринять?
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 21.01.2013 16:14 Сообщение: 4
sasamy
4.77

Пункты: 65188
Регистрация: 14.08.2009
Цитата

Пробовал выставлять переменную среды CC=arm-unknown-linux-gnueabi-gcc, пробовал make ARCH=arm


загляните в скрипт build.sh в архиве
Спуститься к концу Подняться к началу
Персональная информация
titan83
Добавлено 22.01.2013 13:41 Сообщение: 5
titan83
3

Пункты: 3141
Регистрация: 16.12.2012
Уважаемый sasamy, спасибо еще раз ваше терпение. Стыдно за себя, за свою лень( эпоха интернета очень сильно расхолаживает(
была проблема с vermagic (ядро платы 36-rc6, я скачал просто 36) - вроде удалось решить, изменив Makefile ядра (параметр EXTRAVERSION)
все компилируется, команда file рапортует LSB relocatable, ARM, version 1, not stripped.
но при попытке установить (insmod) модуль вижу oops 17 unable to handle NULL pointer dereference to address 00000000
причем я пробовал и ваш драйвер, и с хабра (он на большом линуксе работал точно).
вроде из-за различий версий ядра такого быть не должно.
в какую сторону можно посмотреть?
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 23.01.2013 09:00 Редактировалось 23.01.2013 09:04 Сообщение: 6
sasamy
4.77

Пункты: 65188
Регистрация: 14.08.2009
Надо смотреть драйвер - при загрузке динамических модулей есть один важный момент - в ядре уже нет кода инициализации, вы наверно видели в логе загрузки ядра что-то подобное

Freeing init memory: 132K

ф-ции помеченные макросами __init и данные __initdata - размещаются в специальном сегменте памяти который освобождается после загрузки ядра, поэтому если при ините модуля вызываются подобные внешние по отношению к модулю ф-ции то это сработает при статической линковке и не сработает при динамической загрузке модуля.
Спуститься к концу Подняться к началу
Персональная информация
titan83
Добавлено 23.01.2013 09:23 Сообщение: 7
titan83
3

Пункты: 3141
Регистрация: 16.12.2012
оставил ваш драйвер в таком виде:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/gpio.h>

static int __init driver_init(void)
{
printk("TSTDRV: driver init\n");
return 0;
}

static void __exit driver_exit(void)
{
printk("TSTDRV: driver exit\n");
}

module_init(driver_init);
module_exit(driver_exit);
MODULE_LICENSE("GPL");
т.е. только инициализация и выход, к сожалению, ситуация аналогичная.

может быть поможет полный вывод ошибки
[00000000] *pgd=7322b031, *pte=00000000, *ppte=00000000
Internal error: Oops: 17 [#1]
last sysfs file: /sys/devices/virtual/video4linux/video1/dev
Modules linked in: tstdrv(+)
CPU: 0 Not tainted (2.6.36-rc6 #732)
PC is at mod_sysfs_setup+0x1b4/0x588
LR is at mod_sysfs_setup+0x1ac/0x588
pc : [<c00636a4>] lr : [<c006369c>] psr: 60000013
sp : c3237e58 ip : c3b98374 fp : bf000118
r10: c031d054 r9 : c3237ec8 r8 : 00000000
r7 : bf0000dc r6 : bf0000d0 r5 : 00000000 r4 : fffffff8
r3 : c3b98308 r2 : 00000000 r1 : 00000001 r0 : c0432940
Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user
Control: 0005317f Table: 73248000 DAC: 00000015
Process insmod (pid: 1112, stack limit = 0xc3236270)
Stack: (0xc3237e58 to 0xc3238000)
7e40: bf0000dc 00000000
7e60: 00000001 c007bf6c 000b0008 bf0000d0 00000000 00000018 c3237ec8 00000000
7e80: 000002f8 000b0008 c498e9c0 c0064e64 00000000 c3b7e2e0 00000012 bf0000dc
7ea0: c0432940 c498e218 00000021 00000009 00000000 00000021 bf003034 c498e64c
7ec0: bf003234 c031d048 c498e000 000009c7 c498e3a4 c498e2ec c498e904 c3b8ecc0
7ee0: 000001f4 00000284 00000000 00000000 00000011 00000012 00000009 00000000
7f00: 00000007 00000000 6e72656b 00006c65 00000000 00000000 00000000 00000000
7f20: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
7f40: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
7f60: c002af88 000009c7 000b0008 000b0018 00000000 c002af88 c3236000 00000000
7f80: 00000000 c00651b4 c38a1240 c38a1270 c39afaa0 000009c7 be865e6b be865d64
7fa0: 00000080 c002ade0 000009c7 be865e6b 000b0018 000009c7 000b0008 be865d64
7fc0: 000009c7 be865e6b be865d64 00000080 00000053 00000000 4011d000 00000000
7fe0: be865bb0 be865ba0 00019a08 4026d380 60000010 000b0018 affeeeee bfccec7f
[<c00636a4>] (mod_sysfs_setup+0x1b4/0x588) from [<c0064e64>] (load_module+0xf80/
0x1280)
[<c0064e64>] (load_module+0xf80/0x1280) from [<c00651b4>] (sys_init_module+0x50/
0x1c4)
[<c00651b4>] (sys_init_module+0x50/0x1c4) from [<c002ade0>] (ret_fast_syscall+0x
0/0x2c)
Code: e59f03c8 eb0ad472 e596212c e2424008 (e5943008)
---[ end trace d2ee21283af145aa ]---
Segmentation fault

я своим неопытным взглядом вижу, что остановка произошла в функции mod_sysfs_setup() и что произошел выход стека за выделенные пределы. значит ли это, что проблема происходит при попытке ядра создать файл модуля в sysfs?
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 23.01.2013 09:38 Редактировалось 23.01.2013 09:39 Сообщение: 8
sasamy
4.77

Пункты: 65188
Регистрация: 14.08.2009
У вас есть исходники ядра 2.6.36-rc6 - ядро должно быть сконфигурировано с поддержкой динамических модулей

[*] Enable loadable module support --->

и собрано. Поменяйте в моем примере путь к исходникам этого ядра и оставьте в модуле только то что вы тут написали и соберите скриптом build.sh - должно все работать.
Спуститься к концу Подняться к началу
Персональная информация
titan83
Добавлено 23.01.2013 10:13 Сообщение: 9
titan83
3

Пункты: 3141
Регистрация: 16.12.2012
попробовал тут такой код
#include <module.h> // определения для модуля
#include <init.h> // module_init и module_exit
#include <kernel.h> // printk

MODULE_AUTHOR("Mike Goblin mgoblin@mail.ru");
MODULE_DESCRIPTION("Test module for linux kernel");

int module_start()
{
printk("This is a test module startup message\n");
return 0;
}

void module_stop()
{
printk("Module is dead\n");
return;
}

module_init(module_start);
module_exit(module_stop);
немного подправил инклюды, лизенцию прописал, при компиляции были варнинги, что функции не соотвествуют прототипу, на целевой машине при установке сообщается, что invalid module format.
где же счастье-то драйверное...?)))
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 23.01.2013 11:17 Сообщение: 10
Jury093
4.58

Пункты: 54164
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
на целевой машине при установке сообщается, что invalid module format.

загляните внутрь сгенеренного бинарника *.ko - может он сплодился для x86 архитектуры..

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux