683 / 232 / 16
Регистрация: 15.10.2007
Сообщений: 1,247
1

Модули ядра

28.02.2009, 17:04. Показов 6350. Ответов 14
Метки нет (Все метки)

пытаюсь написать простейший модуль ядра
не находит файл linux/module.h linux/init.h
Стоит убунту 8.10
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.02.2009, 17:04
Ответы с готовыми решениями:

Модули ядра и процессы
Здравствуйте. Есть такая задача, существует модуль ядра, который опрашивает железку. В...

Как поднять Wi-Fi на Dell 5720, используя модули ядра?
У меня ноутбук Dell 5720. Установил Debian 6. Squeeze. Проводная встала при установки ОС, а вот с...

нетбук с каким процом лучше n550(2 ядра )или C-50(2 ядра )?
всем привет решил в следюющем году сдать егэ по инфе => надо готовится и учить програмирование а...

Помогайте выбрать: видюха 640М и проц i7 2.4Гц (4 ядра) или 750M и i7 2Гц (2 ядра) ?
Приветствую. Вот занес уже руку в кошелек для покупки ноута Acer ASPIRE V5-572G но тот...

14
Почетный модератор
7388 / 2634 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
28.02.2009, 17:15 2
Сорцы ядра поставлены? Найди эти файлы у себя и укажи путь к ним через параметр командной строки - I. Если не понятно про опции команднйо строки - читай ман по gcc.
0
683 / 232 / 16
Регистрация: 15.10.2007
Сообщений: 1,247
28.02.2009, 17:22  [ТС] 3
можно пример?
0
Почетный модератор
7388 / 2634 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
28.02.2009, 17:23 4
Пример чего?
0
683 / 232 / 16
Регистрация: 15.10.2007
Сообщений: 1,247
28.02.2009, 17:27  [ТС] 5
ну как мне скомпилить? пытаюсь
gcc module.c -o module.o
0
Почетный модератор
7388 / 2634 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
28.02.2009, 17:33 6
модули ядра не компилятся, как обычные проги. Убедись, что у тебя есть хэдэры ядра с его сорцами, укажи путь к ним через опцию -I.
0
683 / 232 / 16
Регистрация: 15.10.2007
Сообщений: 1,247
28.02.2009, 17:37  [ТС] 7
Ок попробую
0
Почетный модератор
7388 / 2634 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
28.02.2009, 18:18 8
Чтобы было проще, найди у себя на системе файл modules.txt, там будет написано, как билдить модули.

Добавлено через 24 минуты 1 секунду
Вот так я собрал модуль на своей машине:
linux-iy7v:/home/Vourhey/projs # cat Makefile
obj-m += main.o
linux-iy7v:/home/Vourhey/projs # make -C /usr/src/linux-2.6.25.5-1.1/ SUBDIRS=$PWD modules
make: Entering directory `/usr/src/linux-2.6.25.5-1.1'
CC [M] /home/Vourhey/projs/main.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/Vourhey/projs/main.mod.o
LD [M] /home/Vourhey/projs/main.ko
make: Leaving directory `/usr/src/linux-2.6.25.5-1.1'
Как это на убунту выглядеть будет я понятия не имею
1
1 / 1 / 0
Регистрация: 12.02.2009
Сообщений: 11
04.03.2009, 18:36 9
Эпиграф:
"Перед тем, как ты напишешь драйвер, тебе необходимо будет иметь правильный удар головы..." ("before you write a driver, accent you will need to have right header (files...)") (автоперевод) >:-)

Процесс компиляции модулей ядра - вещь довольно непростая :-)
Чтоб написать хороший модуль надо хорошо знать ядро и систему. В частности, методы компиляции и компилятор :-)

Первая сложность - задание нужных заголовочных файлов, которая проявилась у Mecid :-)
Ядро имеет собственные заголовочные файлы, часто одноимённые с файлами библиотеки Си. Однако при компиляции ядра должны использоваться файлы ядра.

В общем, процесс компиляции ядра зависит от многих обстоятельств и в высокой степени варьируется (в зависимости от целевой архитектуры, под действием настроек, изменениях версий...). В целом, там есть так называемая система KBuild, Kernel Build.

Построение ядра (и модулей, они - часть ядра) делается (компиляция и т. д.) специальной программой make (эта утилита - часть системы UNIX, не ядра (надо, чтобы она была в системе, иначе ничего не получится)), которая берёт инструкции к действию из специальных файлов (makefiles, мэйкфайлы), располагающихся в директориях с исходниками ядра. Так строятся на деле весьма многие программы, не только ядро :-)

Компиляция отдельно написанного кем-нибудь модуля может быть сделана под управлением всё тех же мэйкфайлов ядра. Надо чтобы были заданы все необходимые параметры конфигурации ядра (make config). Модуль, который будет построен, будет строится по правилам, направляющим построение модулей для данного ядра при данной общей конфигурации, с некоторыми вытекающими последствиями (возможной неработоспособностью с другим ядром, с другой конфигурацией, при изменении ещё чего-нибудь существенного).

В общем, образ действий примерно такой. Для нового модуля создаётся отдельная директория (обычно где-нибудь вне исходников ядра, хотя...) :-), где располагаются его исходные файлы и Makefile. В мэйкфайле задаётся переменная obj-m, значение которой - имя компилируемого модуля (это может быть сделано в мэйкфайле примерно такой строкой: obj-m += my_module.o). Затем, если в директории нового модуля есть файл my_module.c, то он и будет использован при компиляции (без дополнительных указаний). С другой стороны, может быть много исходных C-файлов, которые надо скомпилировать и объединить в модуль. Это задаётся примерно такой строкой в мэйкфайле модуля: my_module-objs := my_source1.o my_source2.o my_source3.o some_source_other.o . Тогда при построении модуля будут построены объектные файлы my_source1.o my_source2.o my_source3.o some_source_other.o. Они будут строится путём компиляции файлов my_source1.c my_source2.c my_source3.c some_source_other.c . В общем, этого уже почти достаточно для построения модуля (таким образом, Makefile может содержать одну-две строки) :-) Чтобы всё фактически заработало надо вызвать make примерно такой командой: make -C /path/to/kernel/sources/linux-2.6.20/ SUBDIRS=/path/to/my/new/module/directory/ modules . Данная команда инструктирует make во-первых перейти в директорию с исходниками ядра (/path/to/kernel/sources/linux-2.6.20/), и, следовательно, будет прочитан находящийся там Makefile, который и управляет построением ядра. Будет использована переменная SUBDIRS, которая содержит поддиректории, которые должны быть просмотрены и мэйкфайлы в которых должны быть прочитаны для определения того, что должно быть сделано. modules - это так называемая цель для make (без дополнительного объяснения) :-)
0
0 / 0 / 0
Регистрация: 16.05.2009
Сообщений: 3
16.05.2009, 17:30 10
Занимаюсь написанием модуля для курсовой. столкнулся с проблемой. Я научился выводить в файл (хотя не совсем еще понимаю, как это происходит - нашел исходник и долго его курил). Но стоит вопрос в другом - создать модуль, который будет создавать log-файл и класть в него отчет о действиях пользователей. И именно с этим нужна конкретная помощь - я не могу найти, как вытаскивать сообщения о событиях из ядра и перенаправлять в свой файл.

Вот небольшой код того, что уже написано (комментарии по большей части мои - для понятности пишу их на английском):
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <linux/module.h>               /* Kernel module loader */
#include <linux/kernel.h>                   /* Main Kernel Header*/
#include <linux/proc_fs.h>              /* FileSystem Working */
#include <linux/sched.h>
#include <linux/string.h>                   
#include <linux/signal.h>
#include <asm/unistd.h>
#include <asm/siginfo.h>
#include <asm/uaccess.h>
#include <linux/fs.h>
#include <linux/syscalls.h>
#include <linux/init.h>                     /* Sets Module Info */
#include <linux/file.h>                     /* File Working */
#include <linux/mm.h>
#include <linux/slab.h>
 
#define PROCFS_MAX_SIZE 1024
#define RIGHTS          S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH
#define DRIVER_AUTHOR   "Alexander Kuzmin <alondor@lonelind.ru>"
#define DRIVER_DESC         "File working module to logging system messages"
 
 
/** Main Function */
static int __open__(void) {
    //int length_read; 
    int length_write;
    //int length_llseek;
    //int i;
    string buffer;          // String to Write into File
    struct file *f = NULL;      // Setting File
    struct inode *inode;
    mm_segment_t orig_fs;
    
    f = filp_open("/tmp/logged.log",O_CREAT | O_RDWR, RIGHTS);
    if (!f || !f->f_op || !f->f_op->read || !f->f_op->write || !f->f_op->llseek) {
         printk(KERN_INFO "File (read || write || llseek) object is a null pointer!\n");
         return -1;
    }
 
    //strcpy(buffer,"Module "__FILE__" 'Logging' created by Alexander Kuzmin v1.0a, "__DATE__" at "__TIME__);
    
    //Try to print 35 strings
    //for (i=0; i<35; i++) {
        strcpy(buffer,__DATE__" ; "__TIME__" : This is line # in log file\n");
    //}
 
    orig_fs = get_fs();
    set_fs(KERNEL_DS);
    
    inode = f->f_dentry->d_inode;
    printk(KERN_INFO "File size - %u\n", (unsigned int)inode->i_size);
    
    
    //length_llseek = f->f_op->llseek(f, f->f_pos, (int)inode->i_size);
    //printk(KERN_INFO "length_llseek=%d\n", length_llseek);
    
    f->f_pos = f->f_pos + inode->i_size;
    
    length_write = f->f_op->write(f, buffer, strlen(buffer), &f->f_pos);
    
    fput(f); 
    
    return 0;
}
 
/** Init */
static int __mod_init(void) {
    printk(KERN_INFO "file_mod init:\n");
    __open__();
    return 0;
}
 
/** Exit */
static void __mod_exit(void) {
    printk(KERN_ALERT "file_mod exit\n");
}
 
module_init(__mod_init);                            // Init Macros
module_exit(__mod_exit);                            // Exit Macros
MODULE_LICENSE("GPL");                              // License Type
MODULE_AUTHOR(DRIVER_AUTHOR);               // Module Author 
MODULE_DESCRIPTION(DRIVER_DESC);            // Module Description
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
16.05.2009, 17:52 11
вроде того
в Makefile: (и всего того что ты еще компилишь)
obj-m+=module.o

gcc -c module.c /usr/src/linux-?????? USRDIR=~/.../module
0
0 / 0 / 0
Регистрация: 16.05.2009
Сообщений: 3
17.05.2009, 06:45 12
alex_x_x, это кому было адресовано? У меня нет проблем с компиляцией. у меня с реализацией проблемы

Добавлено через 4 минуты 6 секунд
Mecid, тебе советую почитать вот эту книгу: The Linux Kernel Programming Guide - для ядра 2.6.х. На английском. Если не знаешь - учи. Работа с Linux подразумевает знание английского.
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
17.05.2009, 20:31 13
Lonelind, как ни странно, но я это аффтору)
0
0 / 0 / 0
Регистрация: 16.05.2009
Сообщений: 3
23.05.2009, 05:58 14
Блин.. На мой вопрос кто-нибудь ответит? А то уже через неделю сдавать курсовую, а я не знаю,как разрешить проблему =(
0
Cupper
21.01.2010, 20:09 15
Извините что поднимаю тему, но просто по гуглу искал описание ядерной функции set_fs() и наткнулся тут на ее использование ну коли используется значит вы знаете что именно она делает. Не могли бы в краце объяснить.
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.01.2010, 20:09
Помогаю со студенческими работами здесь

Что будет лучше i7 2630qm (2 Гц 4 ядра) vs i5 3230m (2,6 Гц 2 ядра) ?
Что будет лучше i7 2630qm (2 Гц 4 ядра) vs i5 3230m (2,6 Гц 2 ядра) ? Не использую программы...

Что выбрать: Intel 2 ядра или AMD 4 ядра?
Нужен дельный совет от гуру! Могу взять АМД проц 4 ядра, либо интеловский 2 ядерный, цена примерно...

Что выбрать? 2 ядра 3100 Мгц или 4 ядра 1100 Мгц
Господа помогите с выбором ноутбука. Выбираю из этих двух: 1....

Ядра
Как загрузить все ядра компа через С++?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru