Отправляет email-рассылки с помощью сервиса Sendsay

Re: Параметры функции open() в модуле ядра

Здравствуйте.

Объясните как при открытии файла устройства с помощью

fd = open("/dev/my_dev",O_RDWR);

(параметры char*, int)

в модуль передаются параметры типа inode* и file* ?

static int device_open(struct inode *inode, struct file *filp)

struct file_operations Fops =

{

open: device_open,

release: device_close,

write: device_write

};



-*Название листа "Перевод и доработка документации под Linux и другие системы";
Написать в лист: comp.soft.linux.docs-list@subscribe.ru
Архив Листа - http://subscribe.ru/archive/comp.soft.linux.docs Поиск: http://www.google.com
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.docs/rules
Номер письма: 290; Возраст листа: 884; Участников: 997
Адрес сайта рассылки: http://www.linuxrsp.ru/
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.docs/msg/530270

Ответить   "Denis Silin" Thu, 23 Mar 2006 17:36:08 +0300 (#530270)

 

Ответы:

И по первому и по второму вопросу (отладка в ядре) читай мой перевод Linux
Device Driver на http://www.nclug.ru/wiki/index.php?page=knz_ldd2.

Что касается первого вопроса, вкратце.

Любой системный вызов, в том числе и open(), принимается ядро на обработку.
Ядро делает какие-то дефолтовые вещи связанные с данным системным вызовом, а

потом вызывает функцию драйвера, связанную с этим вызовом (если такая функция

в драйвере зарегистрирована). Обратите внимание, функцию драйвера вызывает
ядро. Оно же формирует необходимые параметры для этого вызова. Вы обращаетесь

к системному вызову в категориях пользовательского пространства.

Отладке в ядре посвящена 4-я глава.

В сообщении от Чт 23 Март 2006 17:36 Denis Silin написал(a):

Ответить   Thu, 23 Mar 2006 18:40:00 +0300 (#530296)

 

Knyazev Alexey пишет:

За работу - 5 баллов! Буду вчитываться!

Ответить   Oleg Ponomarev Thu, 23 Mar 2006 18:13:36 +0200 (#530387)

 

В сообщении от 23 марта 2006 17:36 Denis Silin написал(a):

Вы чего пишете - драйвер? Тогда от open() в программе до
метода open() в драйвере - дистанция огромного размера. Вам
в драйвере нужен в основном minor:
int minor = MINOR(ino->i_rdev);
А от file - поле private_data, куда вы будете складывать то,
что считаете нужным, и получать это в остальных методах.

Ответить   "Sergey B. Khvatov" Thu, 23 Mar 2006 18:09:49 +0300 (#530386)