Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Модули ядра linux

25K
22 октября 2011 года
Shrek19877
9 / / 24.03.2007
всем доброго времяни суток. такая у меня проблемма: хочу написать модуль ядра для линукс - драйвер устройства. данные я хочу брать из файла. вопрос в следующем - как открыть и прочитать данные файла из модуля ядра. сейчас попытался взять адреса системных вызовов open, read.... из sys_tables и вызвать. вызов getuid так работает, open нет. я понимаю что у модуля ядра нет контекста процесс и дескриптор будет привязан к процессу обратившегося к драйверу. может кто подскажет как это сделать и есть ли более простой способ обратиться к системным вызовам из ядра.
14
22 октября 2011 года
Phodopus
3.3K / / 19.06.2008
чтобы обратиться к файлу нужно чтобы драйвер фс и диска был загружен раньше вашего, а такого может и не произойти
что возвращает open()?
25K
22 октября 2011 года
Shrek19877
9 / / 24.03.2007
мой модуль я загружаю руками после запуска системы. возврата из open не происходит.
так я получаю адресс функции open
unsigned long *sys_call_table; //таблица системных вызовов
sys_call_table = (unsigned long *) simple_strtoul("0xc1754cc0",NULL,16);
open_=(sys_call_table[__NR_open]);
так я её вызываю
static int device_open(struct inode *inode, struct file *file)
{
fd=open_("/home/stiv/1", 2, 0);//2=O_RDRW
и дальше в device_read и device_write я хочу читать/писать данные в этот файл
25K
22 октября 2011 года
Shrek19877
9 / / 24.03.2007
0xc1754cc0 я взял из System.map
260
23 октября 2011 года
Ramon
1.1K / / 16.08.2003
Развлекайтесь
25K
23 октября 2011 года
Shrek19877
9 / / 24.03.2007
поставлю вопрос немного по другому. я могу истользовать системные вызовы в режиме ядра или только функции экспортируемые ядром? если да то как? способ с получением указателя на системный вызов мне кажется жутко кривым.
я хочу сделать драйвер символьного устройства который будет брать инф. из файла. подскажите в какую сторону рыть.
260
23 октября 2011 года
Ramon
1.1K / / 16.08.2003
Построим ответ по иному.

Опция 1:
Цитата: Shrek19877
поставлю вопрос немного по другому. я могу истользовать системные вызовы в режиме ядра или только функции экспортируемые ядром? если да то как? способ с получением указателя на системный вызов мне кажется жутко кривым.


- Что есть "системные вызовы", зачем и для кого они нужны?
- Чем заполнена таблица системных вызовов, где и в каком виде это что-то лежит?

Опция 2:

Цитата: Shrek19877

я хочу сделать драйвер символьного устройства который будет брать инф. из файла. подскажите в какую сторону рыть.




.

25K
23 октября 2011 года
Shrek19877
9 / / 24.03.2007
"- Что есть "системные вызовы", зачем и для кого они нужны?" системные вызовы linux ну дштгч api. getuid, open, do_fork у т.д. вообщем то чему посвящена страница 2 man))
"- Чем заполнена таблица системных вызовов, где и в каком виде это что-то лежит?" она заполнена адресами функций обслуживающих системные вызовы и лежит она в ядре. адрес этой таблици можно получить так cat /boot/System.map | grep sys_table.
если кто знает можно или нет использовать системные вызовы в модуле ядра напишите. не тонял как отночится этот исходник к моему вопросу.
25K
23 октября 2011 года
Shrek19877
9 / / 24.03.2007
вообщем так, в своём модуле я регистрирую новый драйвер для символьных устройств:
Major = register_chrdev(0, DEVICE_NAME, &fops);
структура file_operations:
static struct file_operations fops = {
.read = device_read,
.write = device_write,
.open = device_open,
.release = device_release
};
вот те функции к которым будут обращаться при обращении к устройству связанным с моим драйвером. в них я собственно хочу открывать файл, брать инфу, обрабатывать и передавать данные пользовательскому процессу.
static int device_open(struct inode *inode, struct file *file)
static int device_release(struct inode *inode, struct file *file)
static ssize_t device_read(struct file *filp, char *buffer,size_t length,loff_t * offset)
static ssize_t device_write(struct file *filp, const char *buff, size_t len, loff_t * off)
как это реализовать?
например в device_open я должен открыть файл. для этого я хочу использовать системный вызов open и сохранить дескриптор. а дескриптор файла привязан к контексту процесса а у модуля его нет(он наследует контекст от вызывающего процесса) могу я это зделать или нет?
вот пример того как я думаю это сделать:
static int device_open(struct inode *inode, struct file *file)
{
if (Device_Open)
return -EBUSY;
Device_Open++;
//1)открываем файл для чтения
printk("try_open_file");
fd=open_("/home/stiv/1", O_RDRW, 0);//2=O_RDRW //возврата не происходит
printk("'file_fd_%d'.\n", fd);
if(fd==-1){try_module_get(THIS_MODULE); return -EBUSY;}//не удалось открыть
try_module_get(THIS_MODULE);
return SUCCESS;
}
откуда я беру open_ я уже писал
14
24 октября 2011 года
Phodopus
3.3K / / 19.06.2008
В вашем случае вам не требуется работать с таблицей системных вызовов напрямую, используйте предоставляемый ядром вызов open так же как используете printk
25K
05 ноября 2011 года
Shrek19877
9 / / 24.03.2007
спасибо. а можете подсказать годную литературу по программированию модулей ядра?
14
05 ноября 2011 года
Phodopus
3.3K / / 19.06.2008
В основном гугл/интернет, но сильно зависит и от того что хочется почерпнуть. Бывает что и исходный код - литература.
240
08 ноября 2011 года
aks
2.5K / / 14.07.2006
Цитата: Shrek19877
спасибо. а можете подсказать годную литературу по программированию модулей ядра?



Только Linux Device Drivers. )

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог